From afb1e2e3bb580077c6c917e6ea98baad8f3c39b3 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Tue, 10 May 2005 08:27:59 +0000 Subject: [PATCH] * ported/cleaned up the "Automatic dependency handling" patch from Michael Hofmann --- apt-pkg/deb/dpkgpm.h | 2 +- apt-pkg/depcache.cc | 50 ++++++++++++- apt-pkg/depcache.h | 6 ++ apt-pkg/pkgcache.h | 1 + apt-pkg/pkgcachegen.cc | 2 + cmdline/apt-get.cc | 159 +++++++++++++++++++++++++++++++++++++++++ configure.in | 2 +- po/apt-all.pot | 116 +++++++++++++++++------------- 8 files changed, 285 insertions(+), 53 deletions(-) diff --git a/apt-pkg/deb/dpkgpm.h b/apt-pkg/deb/dpkgpm.h index b59b9dc93..8bfdff5eb 100644 --- a/apt-pkg/deb/dpkgpm.h +++ b/apt-pkg/deb/dpkgpm.h @@ -40,7 +40,7 @@ class pkgDPkgPM : public pkgPackageManager bool RunScripts(const char *Cnf); bool RunScriptsWithPkgs(const char *Cnf); bool SendV2Pkgs(FILE *F); - + // The Actuall installation implementation virtual bool Install(PkgIterator Pkg,string File); virtual bool Configure(PkgIterator Pkg); diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc index c6bf3185a..5da411e4d 100644 --- a/apt-pkg/depcache.cc +++ b/apt-pkg/depcache.cc @@ -16,6 +16,10 @@ #include #include #include + +#include +#include +#include #include /*}}}*/ @@ -72,7 +76,10 @@ bool pkgDepCache::Init(OpProgress *Prog) // Find the proper cache slot StateCache &State = PkgState[I->ID]; State.iFlags = 0; - + State.DirtyState = pkgCache::State::RemoveUnknown; + //State.AutomaticRemove = I->AutomaticRemove; + State.AutomaticRemove = pkgCache::State::RemoveUnknown; + // Figure out the install version State.CandidateVer = GetCandidateVer(I); State.InstallVer = I.CurrentVer(); @@ -447,6 +454,35 @@ void pkgDepCache::Update(OpProgress *Prog) AddStates(I); } + // read the state file ------------------------------ + FileFd state_file; + string state = _config->FindDir("Dir::State") + "pkgstates"; + if(FileExists(state)) { + state_file.Open(state, FileFd::ReadOnly); + int file_size = state_file.Size(); + Prog->OverallProgress(0, file_size, 1, _("Reading extended state information")); + + pkgTagFile tagfile(&state_file); + pkgTagSection section; + int amt=0; + while(tagfile.Step(section)) { + string pkgname = section.FindS("Package"); + pkgCache::PkgIterator pkg=Cache->FindPkg(pkgname); + // Silently ignore unknown packages and packages with no actual + // version. + if(!pkg.end() && !pkg.VersionList().end()) { + short reason = section.FindI("Remove-Reason", pkgCache::State::RemoveManual); + PkgState[pkg->ID].AutomaticRemove = reason; + //std::cout << "Set: " << pkgname << " to " << reason << std::endl; + amt+=section.size(); + Prog->OverallProgress(amt, file_size, 1, _("Reading extended state information")); + } + Prog->OverallProgress(file_size, file_size, 1, _("Reading extended state information")); + } + } + //-------------------------------------- + + if (Prog != 0) Prog->Progress(Done); } @@ -582,7 +618,8 @@ void pkgDepCache::MarkDelete(PkgIterator const &Pkg, bool rPurge) else P.Mode = ModeDelete; P.InstallVer = 0; - P.Flags &= Flag::Auto; + // This was not inverted before, but I think it should be + P.Flags &= ~Flag::Auto; AddStates(Pkg); Update(Pkg); @@ -754,6 +791,15 @@ void pkgDepCache::SetReInstall(PkgIterator const &Pkg,bool To) AddSizes(Pkg); } /*}}}*/ +// DepCache::SetDirty - Switch the package between dirty states /*{{{*/ +// --------------------------------------------------------------------- +/* */ +void pkgDepCache::SetDirty(PkgIterator const &Pkg, pkgCache::State::PkgRemoveState To) +{ + StateCache &P = PkgState[Pkg->ID]; + P.DirtyState = To; +} + /*}}}*/ // DepCache::SetCandidateVersion - Change the candidate version /*{{{*/ // --------------------------------------------------------------------- /* */ diff --git a/apt-pkg/depcache.h b/apt-pkg/depcache.h index 6d51920e9..f974bfacf 100644 --- a/apt-pkg/depcache.h +++ b/apt-pkg/depcache.h @@ -79,6 +79,10 @@ class pkgDepCache : protected pkgCache::Namespace unsigned short Flags; unsigned short iFlags; // Internal flags + // Traversal status and state for automatic removal + unsigned char DirtyState; + unsigned char AutomaticRemove; + // Various tree indicators signed char Status; // -1,0,1,2 unsigned char Mode; // ModeList @@ -99,6 +103,7 @@ class pkgDepCache : protected pkgCache::Namespace inline bool NowBroken() const {return (DepState & DepNowMin) != DepNowMin;}; inline bool InstBroken() const {return (DepState & DepInstMin) != DepInstMin;}; inline bool Install() const {return Mode == ModeInstall;}; + inline unsigned char Dirty() const {return DirtyState;}; inline VerIterator InstVerIter(pkgCache &Cache) {return VerIterator(Cache,InstallVer);}; inline VerIterator CandidateVerIter(pkgCache &Cache) @@ -189,6 +194,7 @@ class pkgDepCache : protected pkgCache::Namespace unsigned long Depth = 0); void SetReInstall(PkgIterator const &Pkg,bool To); void SetCandidateVersion(VerIterator TargetVer); + void SetDirty(PkgIterator const &Pkg, pkgCache::State::PkgRemoveState To); // This is for debuging void Update(OpProgress *Prog = 0); diff --git a/apt-pkg/pkgcache.h b/apt-pkg/pkgcache.h index b07951dfb..083f20ac2 100644 --- a/apt-pkg/pkgcache.h +++ b/apt-pkg/pkgcache.h @@ -75,6 +75,7 @@ class pkgCache enum PkgInstState {Ok=0,ReInstReq=1,HoldInst=2,HoldReInstReq=3}; enum PkgCurrentState {NotInstalled=0,UnPacked=1,HalfConfigured=2, HalfInstalled=4,ConfigFiles=5,Installed=6}; + enum PkgRemoveState {RemoveUnknown=0, RemoveManual=1,RemoveSuggested=2,RemoveRecommended=3,RemoveRequired=4}; }; struct Flag diff --git a/apt-pkg/pkgcachegen.cc b/apt-pkg/pkgcachegen.cc index 075af3eec..e90c1e50d 100644 --- a/apt-pkg/pkgcachegen.cc +++ b/apt-pkg/pkgcachegen.cc @@ -26,6 +26,8 @@ #include #include +#include + #include #include diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc index 6268f4953..31148a807 100644 --- a/cmdline/apt-get.cc +++ b/cmdline/apt-get.cc @@ -58,6 +58,7 @@ #include #include #include +#include /*}}}*/ using namespace std; @@ -992,6 +993,26 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true, cerr << _("Unable to correct missing packages.") << endl; return _error->Error(_("Aborting install.")); } + + // write the auto-mark list ---------------------------------- + // -- we do it here because there is no libapt::Commit() :/ + FileFd state_file; + string state = _config->FindDir("Dir::State") + "pkgstates"; + + + state_file.Open(state, FileFd::WriteEmpty); + std::ostringstream ostr; + for(pkgCache::PkgIterator p=Cache->PkgBegin(); !p.end();p++) { + if(Cache[p].AutomaticRemove != pkgCache::State::RemoveUnknown) { + ostr.str(string("")); + ostr << "Package: " << p.Name() + << "\nRemove-Reason: " + << (int)(Cache[p].AutomaticRemove) << "\n\n"; + state_file.Write(ostr.str().c_str(), ostr.str().size()); + //std::cout << "Writing auto-mark: " << ostr.str() << endl; + } + } + // ---------------------------------------------------------- _system->UnLock(); pkgPackageManager::OrderResult Res = PM->DoInstall(); @@ -1375,6 +1396,135 @@ bool DoUpgrade(CommandLine &CmdL) return InstallPackages(Cache,true); } /*}}}*/ +// RecurseDirty - Mark used packages as dirty /*{{{*/ +// --------------------------------------------------------------------- +/* Mark all reachable packages as dirty. */ +void RecurseDirty (CacheFile &Cache, pkgCache::PkgIterator Pkg, pkgCache::State::PkgRemoveState DirtLevel) +{ + // If it is not installed, and we are in manual mode, ignore it + if ((Pkg->CurrentVer == 0 && Cache[Pkg].Install() == false || Cache[Pkg].Delete() == true) && + DirtLevel == pkgCache::State::RemoveManual) + { +// fprintf(stdout,"This one is not installed/virtual %s %d %d\n", Pkg.Name(), Pkg->AutomaticRemove, DirtLevel); + return; + } + + // If it is not installed, and it is not virtual, ignore it + if ((Pkg->CurrentVer == 0 && Cache[Pkg].Install() == false || Cache[Pkg].Delete() == true) && + Pkg->VersionList != 0) + { +// fprintf(stdout,"This one is not installed %s %d %d\n", Pkg.Name(), Pkg->AutomaticRemove, DirtLevel); + return; + } + + // If it is similar or more dirty than we are ;-), because we've been here already, don't mark it + // This is necessary because virtual packages just relay the current level, + // so it may be possible e.g. that this was already seen with ::RemoveSuggested, but + // we are ::RemoveRequired + if (Cache[Pkg].Dirty() >= DirtLevel) + { + //fprintf(stdout,"Seen already %s %d %d\n", Pkg.Name(), Pkg->AutomaticRemove, DirtLevel); + return; + } + + // If it is less important than the current DirtLevel, don't mark it + if (Cache[Pkg].AutomaticRemove != pkgCache::State::RemoveManual && + Cache[Pkg].AutomaticRemove > DirtLevel) + { +// fprintf(stdout,"We don't need %s %d %d %d\n", Pkg.Name(), Pkg->AutomaticRemove, DirtLevel, Cache[Pkg].Dirty()); + return; + } + + // Mark it as used + Cache->SetDirty(Pkg, DirtLevel); + + //fprintf(stdout,"We keep %s %d %d\n", Pkg.Name(), Pkg->AutomaticRemove, DirtLevel); + + // We are a virtual package + if (Pkg->VersionList == 0) + { +// fprintf(stdout,"We are virtual %s %d %d\n", Pkg.Name(), Pkg->AutomaticRemove, DirtLevel); + for (pkgCache::PrvIterator Prv = Pkg.ProvidesList(); ! Prv.end(); ++Prv) + RecurseDirty (Cache, Prv.OwnerPkg(), DirtLevel); + return; + } + + // Depending on the type of dependency, follow it + for (pkgCache::DepIterator D = Cache[Pkg].InstVerIter(Cache).DependsList(); ! D.end(); ++D) + { +// fprintf(stdout,"We depend on %s %s\n", D.TargetPkg().Name(), D.DepType()); + + switch(D->Type) + { + case pkgCache::Dep::Depends: + case pkgCache::Dep::PreDepends: + RecurseDirty (Cache, D.TargetPkg(), pkgCache::State::RemoveRequired); + break; + case pkgCache::Dep::Recommends: + RecurseDirty (Cache, D.TargetPkg(), pkgCache::State::RemoveRecommended); + break; + case pkgCache::Dep::Suggests: + RecurseDirty (Cache, D.TargetPkg(), pkgCache::State::RemoveSuggested); + break; + case pkgCache::Dep::Conflicts: + case pkgCache::Dep::Replaces: + case pkgCache::Dep::Obsoletes: + // We don't handle these here + break; + } + } +// fprintf(stdout,"We keep %s %d %d \n", Pkg.Name(), Pkg->AutomaticRemove, DirtLevel); +} + /*}}}*/ +// DoAutomaticRemove - Remove all automatic unused packages /*{{{*/ +// --------------------------------------------------------------------- +/* Remove unused automatic packages */ +bool DoAutomaticRemove(CacheFile &Cache) +{ + std::cout << "DoAutomaticRemove()" << std::endl; + for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); ! Pkg.end(); ++Pkg) + if(!Cache[Pkg].Dirty() && Cache[Pkg].AutomaticRemove > 0) + std::cout << "has auto-remove information: " << Pkg.Name() + << " " << (int)Cache[Pkg].AutomaticRemove + << std::endl; + + + if (_config->FindB("APT::Get::Remove",true) == false) + return _error->Error(_("We are not supposed to delete stuff, can't start AutoRemover")); + + for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); ! Pkg.end(); ++Pkg) + Cache->SetDirty(Pkg, pkgCache::State::RemoveUnknown); + + for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); ! Pkg.end(); ++Pkg) + RecurseDirty (Cache, Pkg, pkgCache::State::RemoveManual); + + + + for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); ! Pkg.end(); ++Pkg) + { + if (! Cache[Pkg].Dirty() && + (Pkg->CurrentVer != 0 && Cache[Pkg].Install() == false && Cache[Pkg].Delete() == false)) + { + fprintf(stdout,"We could delete %s %d\n", Pkg.Name(), Cache[Pkg].AutomaticRemove); + Cache->MarkDelete(Pkg,_config->FindB("APT::Get::Purge",false)); + } + } + + // Now see if we destroyed anything + if (Cache->BrokenCount() != 0) + { + c1out << _("Hmm, seems like the AutoRemover destroyed something which really\n" + "shouldn't happen. Please file a bug report against apt.") << endl; + c1out << endl; + c1out << _("The following information may help to resolve the situation:") << endl; + c1out << endl; + ShowBroken(c1out,Cache,false); + + return _error->Error(_("Internal Error, AutoRemover broke stuff")); + } + return true; +} + /*}}}*/ // DoInstall - Install packages from the command line /*{{{*/ // --------------------------------------------------------------------- /* Install named packages */ @@ -1546,6 +1696,11 @@ bool DoInstall(CommandLine &CmdL) return _error->Error(_("Broken packages")); } + //if (_config->FindB("APT::Get::AutomaticRemove")) { + if (!DoAutomaticRemove(Cache)) + return false; + //} + /* Print out a list of packages that are going to be installed extra to what the user asked */ if (Cache->InstCount() != ExpectedInst) @@ -1565,6 +1720,8 @@ bool DoInstall(CommandLine &CmdL) if (*J == 0) { List += string(I.Name()) + " "; + //if (_config->FindB("APT::Get::AutomaticRemove")) + Cache[I].AutomaticRemove = pkgCache::State::RemoveRequired; VersionsList += string(Cache[I].CandVersion) + "\n"; } } @@ -2410,6 +2567,7 @@ void GetInitialize() _config->Set("APT::Get::Fix-Broken",false); _config->Set("APT::Get::Force-Yes",false); _config->Set("APT::Get::List-Cleanup",true); + _config->Set("APT::Get::AutomaticRemove",false); } /*}}}*/ // SigWinch - Window size change signal handler /*{{{*/ @@ -2465,6 +2623,7 @@ int main(int argc,const char *argv[]) {0,"remove","APT::Get::Remove",0}, {0,"only-source","APT::Get::Only-Source",0}, {0,"arch-only","APT::Get::Arch-Only",0}, + {0,"experimental-automatic-remove","APT::Get::AutomaticRemove",0}, {0,"allow-unauthenticated","APT::Get::AllowUnauthenticated",0}, {'c',"config-file",0,CommandLine::ConfigFile}, {'o',"option",0,CommandLine::ArbItem}, diff --git a/configure.in b/configure.in index e17a126ba..12d3ecae7 100644 --- a/configure.in +++ b/configure.in @@ -18,7 +18,7 @@ AC_CONFIG_AUX_DIR(buildlib) AC_CONFIG_HEADER(include/config.h:buildlib/config.h.in include/apti18n.h:buildlib/apti18n.h.in) dnl -- SET THIS TO THE RELEASE VERSION -- -AC_DEFINE_UNQUOTED(VERSION,"0.6.35ubuntu1") +AC_DEFINE_UNQUOTED(VERSION,"0.6.36") PACKAGE="apt" AC_DEFINE_UNQUOTED(PACKAGE,"$PACKAGE") AC_SUBST(PACKAGE) diff --git a/po/apt-all.pot b/po/apt-all.pot index b9232cac4..ff044cf6c 100644 --- a/po/apt-all.pot +++ b/po/apt-all.pot @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2005-04-06 13:03+0200\n" +"POT-Creation-Date: 2005-05-09 19:02+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -148,7 +148,7 @@ msgstr "" #: cmdline/apt-cache.cc:1651 cmdline/apt-cdrom.cc:138 cmdline/apt-config.cc:70 #: cmdline/apt-extracttemplates.cc:225 ftparchive/apt-ftparchive.cc:545 -#: cmdline/apt-get.cc:2313 cmdline/apt-sortpkgs.cc:144 +#: cmdline/apt-get.cc:2438 cmdline/apt-sortpkgs.cc:144 #, c-format msgid "%s %s for %s %s compiled on %s %s\n" msgstr "" @@ -523,7 +523,7 @@ msgstr "" msgid "Y" msgstr "" -#: cmdline/apt-get.cc:140 cmdline/apt-get.cc:1475 +#: cmdline/apt-get.cc:140 cmdline/apt-get.cc:1594 #, c-format msgid "Regex compilation error - %s" msgstr "" @@ -670,11 +670,11 @@ msgstr "" msgid "Packages need to be removed but remove is disabled." msgstr "" -#: cmdline/apt-get.cc:788 cmdline/apt-get.cc:1769 cmdline/apt-get.cc:1802 +#: cmdline/apt-get.cc:788 cmdline/apt-get.cc:1894 cmdline/apt-get.cc:1927 msgid "Unable to lock the download directory" msgstr "" -#: cmdline/apt-get.cc:798 cmdline/apt-get.cc:1850 cmdline/apt-get.cc:2061 +#: cmdline/apt-get.cc:798 cmdline/apt-get.cc:1975 cmdline/apt-get.cc:2186 #: apt-pkg/cachefile.cc:67 msgid "The list of sources could not be read." msgstr "" @@ -728,7 +728,7 @@ msgstr "" msgid "Do you want to continue [Y/n]? " msgstr "" -#: cmdline/apt-get.cc:958 cmdline/apt-get.cc:1334 cmdline/apt-get.cc:1959 +#: cmdline/apt-get.cc:958 cmdline/apt-get.cc:1334 cmdline/apt-get.cc:2084 #, c-format msgid "Failed to fetch %s %s\n" msgstr "" @@ -737,7 +737,7 @@ msgstr "" msgid "Some files failed to download" msgstr "" -#: cmdline/apt-get.cc:977 cmdline/apt-get.cc:1968 +#: cmdline/apt-get.cc:977 cmdline/apt-get.cc:2093 msgid "Download complete and in download only mode" msgstr "" @@ -847,27 +847,45 @@ msgstr "" msgid "Internal error, AllUpgrade broke stuff" msgstr "" -#: cmdline/apt-get.cc:1462 cmdline/apt-get.cc:1498 +#: cmdline/apt-get.cc:1464 +msgid "We are not supposed to delete stuff, can't start AutoRemover" +msgstr "" + +#: cmdline/apt-get.cc:1485 +msgid "" +"Hmm, seems like the AutoRemover destroyed something which really\n" +"shouldn't happen. Please file a bug report against apt." +msgstr "" + +#: cmdline/apt-get.cc:1488 cmdline/apt-get.cc:1662 +msgid "The following information may help to resolve the situation:" +msgstr "" + +#: cmdline/apt-get.cc:1492 +msgid "Internal Error, AutoRemover broke stuff" +msgstr "" + +#: cmdline/apt-get.cc:1581 cmdline/apt-get.cc:1617 #, c-format msgid "Couldn't find package %s" msgstr "" -#: cmdline/apt-get.cc:1485 +#: cmdline/apt-get.cc:1604 #, c-format msgid "Note, selecting %s for regex '%s'\n" msgstr "" -#: cmdline/apt-get.cc:1515 +#: cmdline/apt-get.cc:1634 msgid "You might want to run `apt-get -f install' to correct these:" msgstr "" -#: cmdline/apt-get.cc:1518 +#: cmdline/apt-get.cc:1637 msgid "" "Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a " "solution)." msgstr "" -#: cmdline/apt-get.cc:1530 +#: cmdline/apt-get.cc:1649 msgid "" "Some packages could not be installed. This may mean that you have\n" "requested an impossible situation or if you are using the unstable\n" @@ -875,149 +893,145 @@ msgid "" "or been moved out of Incoming." msgstr "" -#: cmdline/apt-get.cc:1538 +#: cmdline/apt-get.cc:1657 msgid "" "Since you only requested a single operation it is extremely likely that\n" "the package is simply not installable and a bug report against\n" "that package should be filed." msgstr "" -#: cmdline/apt-get.cc:1543 -msgid "The following information may help to resolve the situation:" -msgstr "" - -#: cmdline/apt-get.cc:1546 +#: cmdline/apt-get.cc:1665 msgid "Broken packages" msgstr "" -#: cmdline/apt-get.cc:1572 +#: cmdline/apt-get.cc:1697 msgid "The following extra packages will be installed:" msgstr "" -#: cmdline/apt-get.cc:1643 +#: cmdline/apt-get.cc:1768 msgid "Suggested packages:" msgstr "" -#: cmdline/apt-get.cc:1644 +#: cmdline/apt-get.cc:1769 msgid "Recommended packages:" msgstr "" -#: cmdline/apt-get.cc:1664 +#: cmdline/apt-get.cc:1789 msgid "Calculating upgrade... " msgstr "" -#: cmdline/apt-get.cc:1667 methods/ftp.cc:702 methods/connect.cc:99 +#: cmdline/apt-get.cc:1792 methods/ftp.cc:702 methods/connect.cc:99 msgid "Failed" msgstr "" -#: cmdline/apt-get.cc:1672 +#: cmdline/apt-get.cc:1797 msgid "Done" msgstr "" -#: cmdline/apt-get.cc:1845 +#: cmdline/apt-get.cc:1970 msgid "Must specify at least one package to fetch source for" msgstr "" -#: cmdline/apt-get.cc:1872 cmdline/apt-get.cc:2079 +#: cmdline/apt-get.cc:1997 cmdline/apt-get.cc:2204 #, c-format msgid "Unable to find a source package for %s" msgstr "" -#: cmdline/apt-get.cc:1919 +#: cmdline/apt-get.cc:2044 #, c-format msgid "You don't have enough free space in %s" msgstr "" -#: cmdline/apt-get.cc:1924 +#: cmdline/apt-get.cc:2049 #, c-format msgid "Need to get %sB/%sB of source archives.\n" msgstr "" -#: cmdline/apt-get.cc:1927 +#: cmdline/apt-get.cc:2052 #, c-format msgid "Need to get %sB of source archives.\n" msgstr "" -#: cmdline/apt-get.cc:1933 +#: cmdline/apt-get.cc:2058 #, c-format msgid "Fetch source %s\n" msgstr "" -#: cmdline/apt-get.cc:1964 +#: cmdline/apt-get.cc:2089 msgid "Failed to fetch some archives." msgstr "" -#: cmdline/apt-get.cc:1992 +#: cmdline/apt-get.cc:2117 #, c-format msgid "Skipping unpack of already unpacked source in %s\n" msgstr "" -#: cmdline/apt-get.cc:2004 +#: cmdline/apt-get.cc:2129 #, c-format msgid "Unpack command '%s' failed.\n" msgstr "" -#: cmdline/apt-get.cc:2021 +#: cmdline/apt-get.cc:2146 #, c-format msgid "Build command '%s' failed.\n" msgstr "" -#: cmdline/apt-get.cc:2040 +#: cmdline/apt-get.cc:2165 msgid "Child process failed" msgstr "" -#: cmdline/apt-get.cc:2056 +#: cmdline/apt-get.cc:2181 msgid "Must specify at least one package to check builddeps for" msgstr "" -#: cmdline/apt-get.cc:2084 +#: cmdline/apt-get.cc:2209 #, c-format msgid "Unable to get build-dependency information for %s" msgstr "" -#: cmdline/apt-get.cc:2104 +#: cmdline/apt-get.cc:2229 #, c-format msgid "%s has no build depends.\n" msgstr "" -#: cmdline/apt-get.cc:2156 +#: cmdline/apt-get.cc:2281 #, c-format msgid "" "%s dependency for %s cannot be satisfied because the package %s cannot be " "found" msgstr "" -#: cmdline/apt-get.cc:2208 +#: cmdline/apt-get.cc:2333 #, c-format msgid "" "%s dependency for %s cannot be satisfied because no available versions of " "package %s can satisfy version requirements" msgstr "" -#: cmdline/apt-get.cc:2243 +#: cmdline/apt-get.cc:2368 #, c-format msgid "Failed to satisfy %s dependency for %s: Installed package %s is too new" msgstr "" -#: cmdline/apt-get.cc:2268 +#: cmdline/apt-get.cc:2393 #, c-format msgid "Failed to satisfy %s dependency for %s: %s" msgstr "" -#: cmdline/apt-get.cc:2282 +#: cmdline/apt-get.cc:2407 #, c-format msgid "Build-dependencies for %s could not be satisfied." msgstr "" -#: cmdline/apt-get.cc:2286 +#: cmdline/apt-get.cc:2411 msgid "Failed to process build dependencies" msgstr "" -#: cmdline/apt-get.cc:2318 +#: cmdline/apt-get.cc:2443 msgid "Supported modules:" msgstr "" -#: cmdline/apt-get.cc:2359 +#: cmdline/apt-get.cc:2484 msgid "" "Usage: apt-get [options] command\n" " apt-get [options] install|remove pkg1 [pkg2 ...]\n" @@ -2007,18 +2021,22 @@ msgstr "" msgid "extra" msgstr "" -#: apt-pkg/depcache.cc:60 apt-pkg/depcache.cc:89 +#: apt-pkg/depcache.cc:64 apt-pkg/depcache.cc:95 msgid "Building dependency tree" msgstr "" -#: apt-pkg/depcache.cc:61 +#: apt-pkg/depcache.cc:65 msgid "Candidate versions" msgstr "" -#: apt-pkg/depcache.cc:90 +#: apt-pkg/depcache.cc:96 msgid "Dependency generation" msgstr "" +#: apt-pkg/depcache.cc:461 apt-pkg/depcache.cc:473 apt-pkg/depcache.cc:475 +msgid "Reading extended state information" +msgstr "" + #: apt-pkg/tagfile.cc:73 #, c-format msgid "Unable to parse package file %s (1)" -- 2.45.2