]> git.saurik.com Git - apt.git/commitdiff
* ported/cleaned up the "Automatic dependency handling" patch from Michael Hofmann
authorMichael Vogt <michael.vogt@ubuntu.com>
Tue, 10 May 2005 08:27:59 +0000 (08:27 +0000)
committerMichael Vogt <michael.vogt@ubuntu.com>
Tue, 10 May 2005 08:27:59 +0000 (08:27 +0000)
apt-pkg/deb/dpkgpm.h
apt-pkg/depcache.cc
apt-pkg/depcache.h
apt-pkg/pkgcache.h
apt-pkg/pkgcachegen.cc
cmdline/apt-get.cc
configure.in
po/apt-all.pot

index b59b9dc939b8a3b19109752e71e9bc630283950b..8bfdff5eb6f44d08a643b4b892dd010e461eb517 100644 (file)
@@ -40,7 +40,7 @@ class pkgDPkgPM : public pkgPackageManager
    bool RunScripts(const char *Cnf);
    bool RunScriptsWithPkgs(const char *Cnf);
    bool SendV2Pkgs(FILE *F);
    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);
    // The Actuall installation implementation
    virtual bool Install(PkgIterator Pkg,string File);
    virtual bool Configure(PkgIterator Pkg);
index c6bf3185ae2b09bb4e093c6d91a02bf53f544b15..5da411e4d0c8a1cef3a1d5afd4971335162c73e9 100644 (file)
 #include <apt-pkg/error.h>
 #include <apt-pkg/sptr.h>
 #include <apt-pkg/algorithms.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/sptr.h>
 #include <apt-pkg/algorithms.h>
+
+#include <apt-pkg/fileutl.h>
+#include <apt-pkg/configuration.h>
+#include <apt-pkg/tagfile.h>
     
 #include <apti18n.h>    
                                                                        /*}}}*/
     
 #include <apti18n.h>    
                                                                        /*}}}*/
@@ -72,7 +76,10 @@ bool pkgDepCache::Init(OpProgress *Prog)
       // Find the proper cache slot
       StateCache &State = PkgState[I->ID];
       State.iFlags = 0;
       // 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();
       // Figure out the install version
       State.CandidateVer = GetCandidateVer(I);
       State.InstallVer = I.CurrentVer();
@@ -447,6 +454,35 @@ void pkgDepCache::Update(OpProgress *Prog)
       AddStates(I);
    }
 
       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);
 }
    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;
    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);
 
    AddStates(Pkg);   
    Update(Pkg);
@@ -754,6 +791,15 @@ void pkgDepCache::SetReInstall(PkgIterator const &Pkg,bool To)
    AddSizes(Pkg);
 }
                                                                        /*}}}*/
    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                /*{{{*/
 // ---------------------------------------------------------------------
 /* */
 // DepCache::SetCandidateVersion - Change the candidate version                /*{{{*/
 // ---------------------------------------------------------------------
 /* */
index 6d51920e936d6fc0b2001bcafd09bca7e9c1e108..f974bfacf324af615e4a8a51dfa01d45c3fa5cc9 100644 (file)
@@ -79,6 +79,10 @@ class pkgDepCache : protected pkgCache::Namespace
       unsigned short Flags;
       unsigned short iFlags;           // Internal flags
 
       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
       // 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 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)
       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);
                    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);
    
    // This is for debuging
    void Update(OpProgress *Prog = 0);
index b07951dfb8fbf26710c8790cd73af87e30c38f3d..083f20ac2ac2926d54e15d03e88482b653b7c027 100644 (file)
@@ -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 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
    };
    
    struct Flag
index 075af3eec2ab89cef855fcba67133ecd41967bb3..e90c1e50d6e5d097fccc4bdef65a259e4cbfa060 100644 (file)
@@ -26,6 +26,8 @@
 #include <apt-pkg/sptr.h>
 #include <apt-pkg/pkgsystem.h>
 
 #include <apt-pkg/sptr.h>
 #include <apt-pkg/pkgsystem.h>
 
+#include <apt-pkg/tagfile.h>
+
 #include <apti18n.h>
 
 #include <vector>
 #include <apti18n.h>
 
 #include <vector>
index 6268f49532e1b45e39e800e7ada300a8ef8baa66..31148a80754b6811ea2437ea7b1ac8a36e230ae3 100644 (file)
@@ -58,6 +58,7 @@
 #include <errno.h>
 #include <regex.h>
 #include <sys/wait.h>
 #include <errno.h>
 #include <regex.h>
 #include <sys/wait.h>
+#include <sstream>
                                                                        /*}}}*/
 
 using namespace std;
                                                                        /*}}}*/
 
 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."));
       }
         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();
                 
       _system->UnLock();
       pkgPackageManager::OrderResult Res = PM->DoInstall();
@@ -1375,6 +1396,135 @@ bool DoUpgrade(CommandLine &CmdL)
    return InstallPackages(Cache,true);
 }
                                                                        /*}}}*/
    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 <END>\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 */
 // DoInstall - Install packages from the command line                  /*{{{*/
 // ---------------------------------------------------------------------
 /* Install named packages */
@@ -1546,6 +1696,11 @@ bool DoInstall(CommandLine &CmdL)
       return _error->Error(_("Broken packages"));
    }   
    
       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)
    /* 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 (*J == 0) {
            List += string(I.Name()) + " ";
+           //if (_config->FindB("APT::Get::AutomaticRemove"))
+              Cache[I].AutomaticRemove = pkgCache::State::RemoveRequired;
         VersionsList += string(Cache[I].CandVersion) + "\n";
      }
       }
         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::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                                /*{{{*/
 }
                                                                        /*}}}*/
 // 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,"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},
       {0,"allow-unauthenticated","APT::Get::AllowUnauthenticated",0},
       {'c',"config-file",0,CommandLine::ConfigFile},
       {'o',"option",0,CommandLine::ArbItem},
index e17a126ba7b595152fafe0787cb07f22ea3e7adc..12d3ecae7244bf753937925307a953e87cfb612e 100644 (file)
@@ -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_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)
 PACKAGE="apt"
 AC_DEFINE_UNQUOTED(PACKAGE,"$PACKAGE")
 AC_SUBST(PACKAGE)
index b9232cac436c22bf8def9583d555b39868cb4278..ff044cf6c72d0837ad9506829192a68b7bb19547 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 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 <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\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-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 ""
 #, c-format
 msgid "%s %s for %s %s compiled on %s %s\n"
 msgstr ""
@@ -523,7 +523,7 @@ msgstr ""
 msgid "Y"
 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 ""
 #, c-format
 msgid "Regex compilation error - %s"
 msgstr ""
@@ -670,11 +670,11 @@ msgstr ""
 msgid "Packages need to be removed but remove is disabled."
 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 ""
 
 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 ""
 #: 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 ""
 
 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 ""
 #, c-format
 msgid "Failed to fetch %s  %s\n"
 msgstr ""
@@ -737,7 +737,7 @@ msgstr ""
 msgid "Some files failed to download"
 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 ""
 
 msgid "Download complete and in download only mode"
 msgstr ""
 
@@ -847,27 +847,45 @@ msgstr ""
 msgid "Internal error, AllUpgrade broke stuff"
 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 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 ""
 
 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"
 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 ""
 
 "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 ""
 
 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 ""
 
 msgid "Broken packages"
 msgstr ""
 
-#: cmdline/apt-get.cc:1572
+#: cmdline/apt-get.cc:1697
 msgid "The following extra packages will be installed:"
 msgstr ""
 
 msgid "The following extra packages will be installed:"
 msgstr ""
 
-#: cmdline/apt-get.cc:1643
+#: cmdline/apt-get.cc:1768
 msgid "Suggested packages:"
 msgstr ""
 
 msgid "Suggested packages:"
 msgstr ""
 
-#: cmdline/apt-get.cc:1644
+#: cmdline/apt-get.cc:1769
 msgid "Recommended packages:"
 msgstr ""
 
 msgid "Recommended packages:"
 msgstr ""
 
-#: cmdline/apt-get.cc:1664
+#: cmdline/apt-get.cc:1789
 msgid "Calculating upgrade... "
 msgstr ""
 
 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 ""
 
 msgid "Failed"
 msgstr ""
 
-#: cmdline/apt-get.cc:1672
+#: cmdline/apt-get.cc:1797
 msgid "Done"
 msgstr ""
 
 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 ""
 
 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, c-format
 msgid "Build command '%s' failed.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:2040
+#: cmdline/apt-get.cc:2165
 msgid "Child process failed"
 msgstr ""
 
 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 ""
 
 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 msgid "Failed to process build dependencies"
 msgstr ""
 
-#: cmdline/apt-get.cc:2318
+#: cmdline/apt-get.cc:2443
 msgid "Supported modules:"
 msgstr ""
 
 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"
 msgid ""
 "Usage: apt-get [options] command\n"
 "       apt-get [options] install|remove pkg1 [pkg2 ...]\n"
@@ -2007,18 +2021,22 @@ msgstr ""
 msgid "extra"
 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 ""
 
 msgid "Building dependency tree"
 msgstr ""
 
-#: apt-pkg/depcache.cc:61
+#: apt-pkg/depcache.cc:65
 msgid "Candidate versions"
 msgstr ""
 
 msgid "Candidate versions"
 msgstr ""
 
-#: apt-pkg/depcache.cc:90
+#: apt-pkg/depcache.cc:96
 msgid "Dependency generation"
 msgstr ""
 
 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)"
 #: apt-pkg/tagfile.cc:73
 #, c-format
 msgid "Unable to parse package file %s (1)"