Просмотр исходного кода

* merged the debian--auto-mark patch
* updated the library soname

Michael Vogt лет назад: 20
Родитель
Сommit
e9afbeb9df

+ 63 - 28
apt-pkg/algorithms.cc

@@ -20,10 +20,12 @@
 #include <apt-pkg/algorithms.h>
 #include <apt-pkg/algorithms.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/configuration.h>
+#include <apt-pkg/version.h>
 #include <apt-pkg/sptr.h>
 #include <apt-pkg/sptr.h>
+
     
     
 #include <apti18n.h>
 #include <apti18n.h>
-    
+#include <sys/types.h>
 #include <iostream>
 #include <iostream>
 									/*}}}*/
 									/*}}}*/
 using namespace std;
 using namespace std;
@@ -220,6 +222,8 @@ void pkgSimulate::ShortBreaks()
    the necessary calculations to deal with the problems. */
    the necessary calculations to deal with the problems. */
 bool pkgApplyStatus(pkgDepCache &Cache)
 bool pkgApplyStatus(pkgDepCache &Cache)
 {
 {
+   pkgDepCache::ActionGroup group(Cache);
+
    for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++)
    for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++)
    {
    {
       if (I->VersionList == 0)
       if (I->VersionList == 0)
@@ -230,13 +234,13 @@ bool pkgApplyStatus(pkgDepCache &Cache)
 	  I->InstState == pkgCache::State::HoldReInstReq)
 	  I->InstState == pkgCache::State::HoldReInstReq)
       {
       {
 	 if (I->CurrentVer != 0 && I.CurrentVer().Downloadable() == true)
 	 if (I->CurrentVer != 0 && I.CurrentVer().Downloadable() == true)
-	    Cache.MarkKeep(I);
+	    Cache.MarkKeep(I, false, false);
 	 else
 	 else
 	 {
 	 {
 	    // Is this right? Will dpkg choke on an upgrade?
 	    // Is this right? Will dpkg choke on an upgrade?
 	    if (Cache[I].CandidateVer != 0 &&
 	    if (Cache[I].CandidateVer != 0 &&
 		 Cache[I].CandidateVerIter(Cache).Downloadable() == true)
 		 Cache[I].CandidateVerIter(Cache).Downloadable() == true)
-	       Cache.MarkInstall(I);
+	       Cache.MarkInstall(I, false, 0, false);
 	    else
 	    else
 	       return _error->Error(_("The package %s needs to be reinstalled, "
 	       return _error->Error(_("The package %s needs to be reinstalled, "
 				    "but I can't find an archive for it."),I.Name());
 				    "but I can't find an archive for it."),I.Name());
@@ -253,12 +257,12 @@ bool pkgApplyStatus(pkgDepCache &Cache)
 	 case pkgCache::State::HalfConfigured:
 	 case pkgCache::State::HalfConfigured:
 	 if ((I->CurrentVer != 0 && I.CurrentVer().Downloadable() == true) ||
 	 if ((I->CurrentVer != 0 && I.CurrentVer().Downloadable() == true) ||
 	     I.State() != pkgCache::PkgIterator::NeedsUnpack)
 	     I.State() != pkgCache::PkgIterator::NeedsUnpack)
-	    Cache.MarkKeep(I);
+	    Cache.MarkKeep(I, false, false);
 	 else
 	 else
 	 {
 	 {
 	    if (Cache[I].CandidateVer != 0 &&
 	    if (Cache[I].CandidateVer != 0 &&
 		 Cache[I].CandidateVerIter(Cache).Downloadable() == true)
 		 Cache[I].CandidateVerIter(Cache).Downloadable() == true)
-	       Cache.MarkInstall(I);
+	       Cache.MarkInstall(I, true, 0, false);
 	    else
 	    else
 	       Cache.MarkDelete(I);
 	       Cache.MarkDelete(I);
 	 }
 	 }
@@ -284,10 +288,12 @@ bool pkgApplyStatus(pkgDepCache &Cache)
    on the result. */
    on the result. */
 bool pkgFixBroken(pkgDepCache &Cache)
 bool pkgFixBroken(pkgDepCache &Cache)
 {
 {
+   pkgDepCache::ActionGroup group(Cache);
+
    // Auto upgrade all broken packages
    // Auto upgrade all broken packages
    for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++)
    for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++)
       if (Cache[I].NowBroken() == true)
       if (Cache[I].NowBroken() == true)
-	 Cache.MarkInstall(I,true);
+	 Cache.MarkInstall(I, true, 0, false);
    
    
    /* Fix packages that are in a NeedArchive state but don't have a
    /* Fix packages that are in a NeedArchive state but don't have a
       downloadable install version */
       downloadable install version */
@@ -300,7 +306,7 @@ bool pkgFixBroken(pkgDepCache &Cache)
       if (Cache[I].InstVerIter(Cache).Downloadable() == false)
       if (Cache[I].InstVerIter(Cache).Downloadable() == false)
 	 continue;
 	 continue;
 
 
-      Cache.MarkInstall(I,true);      
+      Cache.MarkInstall(I, true, 0, false);
    }
    }
    
    
    pkgProblemResolver Fix(&Cache);
    pkgProblemResolver Fix(&Cache);
@@ -317,23 +323,25 @@ bool pkgFixBroken(pkgDepCache &Cache)
  */
  */
 bool pkgDistUpgrade(pkgDepCache &Cache)
 bool pkgDistUpgrade(pkgDepCache &Cache)
 {
 {
+   pkgDepCache::ActionGroup group(Cache);
+
    /* Auto upgrade all installed packages, this provides the basis 
    /* Auto upgrade all installed packages, this provides the basis 
       for the installation */
       for the installation */
    for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++)
    for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++)
       if (I->CurrentVer != 0)
       if (I->CurrentVer != 0)
-	 Cache.MarkInstall(I,true);
+	 Cache.MarkInstall(I, true, 0, false);
 
 
    /* Now, auto upgrade all essential packages - this ensures that
    /* Now, auto upgrade all essential packages - this ensures that
       the essential packages are present and working */
       the essential packages are present and working */
    for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++)
    for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++)
       if ((I->Flags & pkgCache::Flag::Essential) == pkgCache::Flag::Essential)
       if ((I->Flags & pkgCache::Flag::Essential) == pkgCache::Flag::Essential)
-	 Cache.MarkInstall(I,true);
+	 Cache.MarkInstall(I, true, 0, false);
    
    
    /* We do it again over all previously installed packages to force 
    /* We do it again over all previously installed packages to force 
       conflict resolution on them all. */
       conflict resolution on them all. */
    for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++)
    for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++)
       if (I->CurrentVer != 0)
       if (I->CurrentVer != 0)
-	 Cache.MarkInstall(I,false);
+	 Cache.MarkInstall(I, false, 0, false);
 
 
    pkgProblemResolver Fix(&Cache);
    pkgProblemResolver Fix(&Cache);
 
 
@@ -345,7 +353,7 @@ bool pkgDistUpgrade(pkgDepCache &Cache)
 	 if (I->SelectedState == pkgCache::State::Hold)
 	 if (I->SelectedState == pkgCache::State::Hold)
 	 {
 	 {
 	    Fix.Protect(I);
 	    Fix.Protect(I);
-	    Cache.MarkKeep(I);
+	    Cache.MarkKeep(I, false, false);
 	 }
 	 }
       }
       }
    }
    }
@@ -360,6 +368,8 @@ bool pkgDistUpgrade(pkgDepCache &Cache)
    to install packages not marked for install */
    to install packages not marked for install */
 bool pkgAllUpgrade(pkgDepCache &Cache)
 bool pkgAllUpgrade(pkgDepCache &Cache)
 {
 {
+   pkgDepCache::ActionGroup group(Cache);
+
    pkgProblemResolver Fix(&Cache);
    pkgProblemResolver Fix(&Cache);
 
 
    if (Cache.BrokenCount() != 0)
    if (Cache.BrokenCount() != 0)
@@ -376,7 +386,7 @@ bool pkgAllUpgrade(pkgDepCache &Cache)
 	    continue;
 	    continue;
       
       
       if (I->CurrentVer != 0 && Cache[I].InstallVer != 0)
       if (I->CurrentVer != 0 && Cache[I].InstallVer != 0)
-	 Cache.MarkInstall(I,false);
+	 Cache.MarkInstall(I, false, 0, false);
    }
    }
       
       
    return Fix.ResolveByKeep();
    return Fix.ResolveByKeep();
@@ -389,6 +399,8 @@ bool pkgAllUpgrade(pkgDepCache &Cache)
    the package is restored. */
    the package is restored. */
 bool pkgMinimizeUpgrade(pkgDepCache &Cache)
 bool pkgMinimizeUpgrade(pkgDepCache &Cache)
 {   
 {   
+   pkgDepCache::ActionGroup group(Cache);
+
    if (Cache.BrokenCount() != 0)
    if (Cache.BrokenCount() != 0)
       return false;
       return false;
    
    
@@ -405,9 +417,9 @@ bool pkgMinimizeUpgrade(pkgDepCache &Cache)
 	    continue;
 	    continue;
 
 
 	 // Keep it and see if that is OK
 	 // Keep it and see if that is OK
-	 Cache.MarkKeep(I);
+	 Cache.MarkKeep(I, false, false);
 	 if (Cache.BrokenCount() != 0)
 	 if (Cache.BrokenCount() != 0)
-	    Cache.MarkInstall(I,false);
+	    Cache.MarkInstall(I, false, 0, false);
 	 else
 	 else
 	 {
 	 {
 	    // If keep didnt actually do anything then there was no change..
 	    // If keep didnt actually do anything then there was no change..
@@ -565,6 +577,8 @@ void pkgProblemResolver::MakeScores()
    installable */
    installable */
 bool pkgProblemResolver::DoUpgrade(pkgCache::PkgIterator Pkg)
 bool pkgProblemResolver::DoUpgrade(pkgCache::PkgIterator Pkg)
 {
 {
+   pkgDepCache::ActionGroup group(Cache);
+
    if ((Flags[Pkg->ID] & Upgradable) == 0 || Cache[Pkg].Upgradable() == false)
    if ((Flags[Pkg->ID] & Upgradable) == 0 || Cache[Pkg].Upgradable() == false)
       return false;
       return false;
    if ((Flags[Pkg->ID] & Protected) == Protected)
    if ((Flags[Pkg->ID] & Protected) == Protected)
@@ -573,7 +587,7 @@ bool pkgProblemResolver::DoUpgrade(pkgCache::PkgIterator Pkg)
    Flags[Pkg->ID] &= ~Upgradable;
    Flags[Pkg->ID] &= ~Upgradable;
    
    
    bool WasKept = Cache[Pkg].Keep();
    bool WasKept = Cache[Pkg].Keep();
-   Cache.MarkInstall(Pkg,false);
+   Cache.MarkInstall(Pkg, false, 0, false);
 
 
    // This must be a virtual package or something like that.
    // This must be a virtual package or something like that.
    if (Cache[Pkg].InstVerIter(Cache).end() == true)
    if (Cache[Pkg].InstVerIter(Cache).end() == true)
@@ -658,7 +672,7 @@ bool pkgProblemResolver::DoUpgrade(pkgCache::PkgIterator Pkg)
    if (Fail == true)
    if (Fail == true)
    {
    {
       if (WasKept == true)
       if (WasKept == true)
-	 Cache.MarkKeep(Pkg);
+	 Cache.MarkKeep(Pkg, false, false);
       else
       else
 	 Cache.MarkDelete(Pkg);
 	 Cache.MarkDelete(Pkg);
       return false;
       return false;
@@ -685,6 +699,8 @@ bool pkgProblemResolver::DoUpgrade(pkgCache::PkgIterator Pkg)
    upgrade packages to advoid problems. */
    upgrade packages to advoid problems. */
 bool pkgProblemResolver::Resolve(bool BrokenFix)
 bool pkgProblemResolver::Resolve(bool BrokenFix)
 {
 {
+   pkgDepCache::ActionGroup group(Cache);
+
    unsigned long Size = Cache.Head().PackageCount;
    unsigned long Size = Cache.Head().PackageCount;
 
 
    // Record which packages are marked for install
    // Record which packages are marked for install
@@ -700,7 +716,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
 	 {
 	 {
 	    if (Cache[I].InstBroken() == true && BrokenFix == true)
 	    if (Cache[I].InstBroken() == true && BrokenFix == true)
 	    {
 	    {
-	       Cache.MarkInstall(I,false);
+	       Cache.MarkInstall(I, false, 0, false);
 	       if (Cache[I].Install() == true)
 	       if (Cache[I].Install() == true)
 		  Again = true;
 		  Again = true;
 	    }
 	    }
@@ -766,14 +782,14 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
 	    pkgCache::Version *OldVer = Cache[I].InstallVer;
 	    pkgCache::Version *OldVer = Cache[I].InstallVer;
 	    Flags[I->ID] &= ReInstateTried;
 	    Flags[I->ID] &= ReInstateTried;
 	    
 	    
-	    Cache.MarkInstall(I,false);
+	    Cache.MarkInstall(I, false, 0, false);
 	    if (Cache[I].InstBroken() == true || 
 	    if (Cache[I].InstBroken() == true || 
 		OldBreaks < Cache.BrokenCount())
 		OldBreaks < Cache.BrokenCount())
 	    {
 	    {
 	       if (OldVer == 0)
 	       if (OldVer == 0)
 		  Cache.MarkDelete(I);
 		  Cache.MarkDelete(I);
 	       else
 	       else
-		  Cache.MarkKeep(I);
+		  Cache.MarkKeep(I, false, false);
 	    }	    
 	    }	    
 	    else
 	    else
 	       if (Debug == true)
 	       if (Debug == true)
@@ -818,7 +834,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
 		  {
 		  {
 		     if (Debug == true)
 		     if (Debug == true)
 			clog << "  Or group keep for " << I.Name() << endl;
 			clog << "  Or group keep for " << I.Name() << endl;
-		     Cache.MarkKeep(I);
+		     Cache.MarkKeep(I, false, false);
 		     Change = true;
 		     Change = true;
 		  }
 		  }
 	       }
 	       }
@@ -868,7 +884,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
 	       }
 	       }
 	       
 	       
 	       Change = true;
 	       Change = true;
-	       Cache.MarkKeep(I);		  
+	       Cache.MarkKeep(I, false, false);
 	       break;
 	       break;
 	    }
 	    }
 	    
 	    
@@ -905,7 +921,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
 		  /* See if a keep will do, unless the package is protected,
 		  /* See if a keep will do, unless the package is protected,
 		     then installing it will be necessary */
 		     then installing it will be necessary */
 		  bool Installed = Cache[I].Install();
 		  bool Installed = Cache[I].Install();
-		  Cache.MarkKeep(I);
+		  Cache.MarkKeep(I, false, false);
 		  if (Cache[I].InstBroken() == false)
 		  if (Cache[I].InstBroken() == false)
 		  {
 		  {
 		     // Unwind operation will be keep now
 		     // Unwind operation will be keep now
@@ -914,7 +930,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
 		     
 		     
 		     // Restore
 		     // Restore
 		     if (InOr == true && Installed == true)
 		     if (InOr == true && Installed == true)
-			Cache.MarkInstall(I,false);
+			Cache.MarkInstall(I, false, 0, false);
 		     
 		     
 		     if (Debug == true)
 		     if (Debug == true)
 			clog << "  Holding Back " << I.Name() << " rather than change " << Start.TargetPkg().Name() << endl;
 			clog << "  Holding Back " << I.Name() << " rather than change " << Start.TargetPkg().Name() << endl;
@@ -986,7 +1002,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
 		  
 		  
 		  // Restore
 		  // Restore
 		  if (InOr == true && Installed == true)
 		  if (InOr == true && Installed == true)
-		     Cache.MarkInstall(I,false);
+		     Cache.MarkInstall(I, false, 0, false);
 		  
 		  
 		  if (Debug == true)
 		  if (Debug == true)
 		     clog << "  Holding Back " << I.Name() << " because I can't find " << Start.TargetPkg().Name() << endl;
 		     clog << "  Holding Back " << I.Name() << " because I can't find " << Start.TargetPkg().Name() << endl;
@@ -1031,7 +1047,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
 	       {
 	       {
 		  if (Debug == true)
 		  if (Debug == true)
 		     clog << "  Fixing " << I.Name() << " via keep of " << J->Pkg.Name() << endl;
 		     clog << "  Fixing " << I.Name() << " via keep of " << J->Pkg.Name() << endl;
-		  Cache.MarkKeep(J->Pkg);
+		  Cache.MarkKeep(J->Pkg, false, false);
 	       }
 	       }
 
 
 	       if (Counter > 1)
 	       if (Counter > 1)
@@ -1061,6 +1077,20 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
       return _error->Error(_("Unable to correct problems, you have held broken packages."));
       return _error->Error(_("Unable to correct problems, you have held broken packages."));
    }
    }
    
    
+   // set the auto-flags (mvo: I'm not sure if we _really_ need this, but
+   // I didn't managed 
+   pkgCache::PkgIterator I = Cache.PkgBegin();
+   for (;I.end() != true; I++) {
+      if (Cache[I].NewInstall() && !(Flags[I->ID] & PreInstalled)) {
+	 if(_config->FindI("Debug::pkgAutoRemove",false)) {
+	    std::clog << "Resolve installed new pkg: " << I.Name() 
+		      << " (now marking it as auto)" << std::endl;
+	 }
+	 Cache[I].Flags |= pkgCache::Flag::Auto;
+      }
+   }
+
+
    return true;
    return true;
 }
 }
 									/*}}}*/
 									/*}}}*/
@@ -1071,6 +1101,8 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
    system was non-broken previously. */
    system was non-broken previously. */
 bool pkgProblemResolver::ResolveByKeep()
 bool pkgProblemResolver::ResolveByKeep()
 {
 {
+   pkgDepCache::ActionGroup group(Cache);
+
    unsigned long Size = Cache.Head().PackageCount;
    unsigned long Size = Cache.Head().PackageCount;
 
 
    if (Debug == true)      
    if (Debug == true)      
@@ -1104,7 +1136,7 @@ bool pkgProblemResolver::ResolveByKeep()
       {
       {
 	 if (Debug == true)
 	 if (Debug == true)
 	    clog << "Keeping package " << I.Name() << endl;
 	    clog << "Keeping package " << I.Name() << endl;
-	 Cache.MarkKeep(I);
+	 Cache.MarkKeep(I, false, false);
 	 if (Cache[I].InstBroken() == false)
 	 if (Cache[I].InstBroken() == false)
 	 {
 	 {
 	    K = PList - 1;
 	    K = PList - 1;
@@ -1152,7 +1184,7 @@ bool pkgProblemResolver::ResolveByKeep()
 	       {
 	       {
 		  if (Debug == true)
 		  if (Debug == true)
 		     clog << "  Keeping Package " << Pkg.Name() << " due to dep" << endl;
 		     clog << "  Keeping Package " << Pkg.Name() << " due to dep" << endl;
-		  Cache.MarkKeep(Pkg);
+		  Cache.MarkKeep(Pkg, false, false);
 	       }
 	       }
 	       
 	       
 	       if (Cache[I].InstBroken() == false)
 	       if (Cache[I].InstBroken() == false)
@@ -1189,6 +1221,8 @@ bool pkgProblemResolver::ResolveByKeep()
 /* This is used to make sure protected packages are installed */
 /* This is used to make sure protected packages are installed */
 void pkgProblemResolver::InstallProtect()
 void pkgProblemResolver::InstallProtect()
 {
 {
+   pkgDepCache::ActionGroup group(Cache);
+
    for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++)
    for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++)
    {
    {
       if ((Flags[I->ID] & Protected) == Protected)
       if ((Flags[I->ID] & Protected) == Protected)
@@ -1196,7 +1230,7 @@ void pkgProblemResolver::InstallProtect()
 	 if ((Flags[I->ID] & ToRemove) == ToRemove)
 	 if ((Flags[I->ID] & ToRemove) == ToRemove)
 	    Cache.MarkDelete(I);
 	    Cache.MarkDelete(I);
 	 else
 	 else
-	    Cache.MarkInstall(I,false);
+	    Cache.MarkInstall(I, false, 0, false);
       }
       }
    }   
    }   
 }
 }
@@ -1232,3 +1266,4 @@ void pkgPrioSortList(pkgCache &Cache,pkgCache::Version **List)
    qsort(List,Count,sizeof(*List),PrioComp);
    qsort(List,Count,sizeof(*List),PrioComp);
 }
 }
 									/*}}}*/
 									/*}}}*/
+

+ 1 - 1
apt-pkg/deb/dpkgpm.h

@@ -47,7 +47,7 @@ class pkgDPkgPM : public pkgPackageManager
    bool RunScripts(const char *Cnf);
    bool RunScripts(const char *Cnf);
    bool RunScriptsWithPkgs(const char *Cnf);
    bool RunScriptsWithPkgs(const char *Cnf);
    bool SendV2Pkgs(FILE *F);
    bool SendV2Pkgs(FILE *F);
-   
+
    // The Actuall installation implementation
    // The Actuall installation implementation
    virtual bool Install(PkgIterator Pkg,string File);
    virtual bool Install(PkgIterator Pkg,string File);
    virtual bool Configure(PkgIterator Pkg);
    virtual bool Configure(PkgIterator Pkg);

+ 414 - 20
apt-pkg/depcache.cc

@@ -16,16 +16,52 @@
 #include <apt-pkg/error.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/sptr.h>
 #include <apt-pkg/sptr.h>
 #include <apt-pkg/algorithms.h>
 #include <apt-pkg/algorithms.h>
+
+#include <apt-pkg/fileutl.h>
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/configuration.h>
+#include <apt-pkg/pkgsystem.h>
+#include <apt-pkg/tagfile.h>
+
+#include <iostream>
+#include <sstream>    
+#include <set>
 
 
 #include <apti18n.h>    
 #include <apti18n.h>    
-									/*}}}*/
+
+pkgDepCache::ActionGroup::ActionGroup(pkgDepCache &cache) :
+  cache(cache), released(false)
+{
+  ++cache.group_level;
+}
+
+void pkgDepCache::ActionGroup::release()
+{
+  if(!released)
+    {
+      if(cache.group_level == 0)
+	std::cerr << "W: Unbalanced action groups, expect badness" << std::endl;
+      else
+	{
+	  --cache.group_level;
+
+	  if(cache.group_level == 0)
+	    cache.MarkAndSweep();
+	}
+
+      released = false;
+    }
+}
+
+pkgDepCache::ActionGroup::~ActionGroup()
+{
+  release();
+}
 
 
 // DepCache::pkgDepCache - Constructors					/*{{{*/
 // DepCache::pkgDepCache - Constructors					/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* */
 /* */
 pkgDepCache::pkgDepCache(pkgCache *pCache,Policy *Plcy) :
 pkgDepCache::pkgDepCache(pkgCache *pCache,Policy *Plcy) :
-                Cache(pCache), PkgState(0), DepState(0)
+  group_level(0), Cache(pCache), PkgState(0), DepState(0)
 {
 {
    delLocalPolicy = 0;
    delLocalPolicy = 0;
    LocalPolicy = Plcy;
    LocalPolicy = Plcy;
@@ -48,6 +84,10 @@ pkgDepCache::~pkgDepCache()
 /* This allocats the extension buffers and initializes them. */
 /* This allocats the extension buffers and initializes them. */
 bool pkgDepCache::Init(OpProgress *Prog)
 bool pkgDepCache::Init(OpProgress *Prog)
 {
 {
+   // Suppress mark updates during this operation (just in case) and
+   // run a mark operation when Init terminates.
+   ActionGroup actions(*this);
+
    delete [] PkgState;
    delete [] PkgState;
    delete [] DepState;
    delete [] DepState;
    PkgState = new StateCache[Head().PackageCount];
    PkgState = new StateCache[Head().PackageCount];
@@ -73,7 +113,7 @@ bool pkgDepCache::Init(OpProgress *Prog)
       // Find the proper cache slot
       // Find the proper cache slot
       StateCache &State = PkgState[I->ID];
       StateCache &State = PkgState[I->ID];
       State.iFlags = 0;
       State.iFlags = 0;
-      
+
       // Figure out the install version
       // Figure out the install version
       State.CandidateVer = GetCandidateVer(I);
       State.CandidateVer = GetCandidateVer(I);
       State.InstallVer = I.CurrentVer();
       State.InstallVer = I.CurrentVer();
@@ -95,11 +135,120 @@ bool pkgDepCache::Init(OpProgress *Prog)
 
 
    if(Prog != 0)
    if(Prog != 0)
       Prog->Done();
       Prog->Done();
-   
+
    return true;
    return true;
 } 
 } 
 									/*}}}*/
 									/*}}}*/
 
 
+bool pkgDepCache::readStateFile(OpProgress *Prog)
+{
+   FileFd state_file;
+   string state = _config->FindDir("Dir::State") + "extended_states";
+   if(FileExists(state)) {
+      state_file.Open(state, FileFd::ReadOnly);
+      int file_size = state_file.Size();
+      if(Prog != NULL)
+	 Prog->OverallProgress(0, file_size, 1, 
+			       _("Reading 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("Auto-Installed", 0);
+	    if(reason > 0)
+	       PkgState[pkg->ID].Flags  |= Flag::Auto;
+	    if(_config->FindB("Debug::pkgAutoRemove",false))
+	       std::cout << "Auto-Installed : " << pkgname << std::endl;
+	    amt+=section.size();
+	    if(Prog != NULL)
+	       Prog->OverallProgress(amt, file_size, 1, 
+				     _("Reading state information"));
+	 }
+	 if(Prog != NULL)
+	    Prog->OverallProgress(file_size, file_size, 1, 
+				  _("Reading state information"));
+      }
+   }
+
+   return true;
+}
+
+bool pkgDepCache::writeStateFile(OpProgress *prog)
+{
+   if(_config->FindB("Debug::pkgAutoRemove",false))
+      std::clog << "pkgDepCache::writeStateFile()" << std::endl;
+
+   FileFd StateFile;
+   string state = _config->FindDir("Dir::State") + "extended_states";
+   if(!StateFile.Open(state, FileFd::ReadOnly))
+      return _error->Error(_("Failed to open StateFile %s"),
+			   state.c_str());
+
+   FILE *OutFile;
+   string outfile = state + ".tmp";
+   if((OutFile = fopen(outfile.c_str(),"w")) == NULL)
+      return _error->Error(_("Failed to write temporary StateFile %s"),
+			   outfile.c_str());
+
+   // first merge with the existing sections
+   pkgTagFile tagfile(&StateFile);
+   pkgTagSection section;
+   std::set<string> pkgs_seen;
+   const char *nullreorderlist[] = {0};
+   while(tagfile.Step(section)) {
+	 string pkgname = section.FindS("Package");
+	 // Silently ignore unknown packages and packages with no actual
+	 // version.
+	 pkgCache::PkgIterator pkg=Cache->FindPkg(pkgname);
+	 if(pkg.end() || pkg.VersionList().end()) 
+	    continue;
+	 bool oldAuto = section.FindI("Auto-Installed");
+	 bool newAuto = (PkgState[pkg->ID].Flags & Flag::Auto);
+	 if(_config->FindB("Debug::pkgAutoRemove",false))
+	    std::clog << "Update exisiting AutoInstall info: " 
+		      << pkg.Name() << std::endl;
+	 TFRewriteData rewrite[2];
+	 rewrite[0].Tag = "Auto-Installed";
+	 rewrite[0].Rewrite = newAuto ? "1" : "0";
+	 rewrite[0].NewTag = 0;
+	 rewrite[1].Tag = 0;
+	 TFRewrite(OutFile, section, nullreorderlist, rewrite);
+	 fprintf(OutFile,"\n");
+	 pkgs_seen.insert(pkgname);
+   }
+   
+   // then write the ones we have not seen yet
+   std::ostringstream ostr;
+   for(pkgCache::PkgIterator pkg=Cache->PkgBegin(); !pkg.end(); pkg++) {
+      if(PkgState[pkg->ID].Flags & Flag::Auto) {
+	 if (pkgs_seen.find(pkg.Name()) != pkgs_seen.end()) {
+	    if(_config->FindB("Debug::pkgAutoRemove",false))
+	       std::clog << "Skipping already written " << pkg.Name() << std::endl;
+	    continue;
+	 }
+	 if(_config->FindB("Debug::pkgAutoRemove",false))
+	    std::clog << "Writing new AutoInstall: " 
+		      << pkg.Name() << std::endl;
+	 ostr.str(string(""));
+	 ostr << "Package: " << pkg.Name() 
+	      << "\nAuto-Installed: 1\n\n";
+	 fprintf(OutFile,ostr.str().c_str());
+	 fprintf(OutFile,"\n");
+      }
+   }
+
+   // move the outfile over the real file
+   rename(outfile.c_str(), state.c_str());
+
+   return true;
+}
+
 // DepCache::CheckDep - Checks a single dependency			/*{{{*/
 // DepCache::CheckDep - Checks a single dependency			/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* This first checks the dependency against the main target package and
 /* This first checks the dependency against the main target package and
@@ -453,12 +602,14 @@ void pkgDepCache::Update(OpProgress *Prog)
 
 
    if (Prog != 0)      
    if (Prog != 0)      
       Prog->Progress(Done);
       Prog->Progress(Done);
+
+   readStateFile(Prog);
 }
 }
 									/*}}}*/
 									/*}}}*/
 // DepCache::Update - Update the deps list of a package	   		/*{{{*/
 // DepCache::Update - Update the deps list of a package	   		/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* This is a helper for update that only does the dep portion of the scan. 
 /* This is a helper for update that only does the dep portion of the scan. 
-   It is mainly ment to scan reverse dependencies. */
+   It is mainly meant to scan reverse dependencies. */
 void pkgDepCache::Update(DepIterator D)
 void pkgDepCache::Update(DepIterator D)
 {
 {
    // Update the reverse deps
    // Update the reverse deps
@@ -510,7 +661,7 @@ void pkgDepCache::Update(PkgIterator const &Pkg)
 // DepCache::MarkKeep - Put the package in the keep state		/*{{{*/
 // DepCache::MarkKeep - Put the package in the keep state		/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* */
 /* */
-void pkgDepCache::MarkKeep(PkgIterator const &Pkg,bool Soft)
+void pkgDepCache::MarkKeep(PkgIterator const &Pkg, bool Soft, bool FromUser)
 {
 {
    // Simplifies other routines.
    // Simplifies other routines.
    if (Pkg.end() == true)
    if (Pkg.end() == true)
@@ -522,6 +673,9 @@ void pkgDepCache::MarkKeep(PkgIterator const &Pkg,bool Soft)
        Pkg.CurrentVer().Downloadable() == false)
        Pkg.CurrentVer().Downloadable() == false)
       return;
       return;
    
    
+   /** \todo Can this be moved later in the method? */
+   ActionGroup group(*this);
+
    /* We changed the soft state all the time so the UI is a bit nicer
    /* We changed the soft state all the time so the UI is a bit nicer
       to use */
       to use */
    StateCache &P = PkgState[Pkg->ID];
    StateCache &P = PkgState[Pkg->ID];
@@ -538,7 +692,8 @@ void pkgDepCache::MarkKeep(PkgIterator const &Pkg,bool Soft)
    if (Pkg->VersionList == 0)
    if (Pkg->VersionList == 0)
       return;
       return;
    
    
-   P.Flags &= ~Flag::Auto;
+   if(FromUser && !P.Marked)
+     P.Flags &= ~Flag::Auto;
    RemoveSizes(Pkg);
    RemoveSizes(Pkg);
    RemoveStates(Pkg);
    RemoveStates(Pkg);
 
 
@@ -564,6 +719,8 @@ void pkgDepCache::MarkDelete(PkgIterator const &Pkg, bool rPurge)
    if (Pkg.end() == true)
    if (Pkg.end() == true)
       return;
       return;
 
 
+   ActionGroup group(*this);
+
    // Check that it is not already marked for delete
    // Check that it is not already marked for delete
    StateCache &P = PkgState[Pkg->ID];
    StateCache &P = PkgState[Pkg->ID];
    P.iFlags &= ~(AutoKept | Purge);
    P.iFlags &= ~(AutoKept | Purge);
@@ -586,7 +743,6 @@ void pkgDepCache::MarkDelete(PkgIterator const &Pkg, bool rPurge)
    else
    else
       P.Mode = ModeDelete;
       P.Mode = ModeDelete;
    P.InstallVer = 0;
    P.InstallVer = 0;
-   P.Flags &= Flag::Auto;
 
 
    AddStates(Pkg);   
    AddStates(Pkg);   
    Update(Pkg);
    Update(Pkg);
@@ -597,7 +753,7 @@ void pkgDepCache::MarkDelete(PkgIterator const &Pkg, bool rPurge)
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* */
 /* */
 void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
 void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
-			      unsigned long Depth)
+			      unsigned long Depth, bool FromUser)
 {
 {
    if (Depth > 100)
    if (Depth > 100)
       return;
       return;
@@ -606,6 +762,8 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
    if (Pkg.end() == true)
    if (Pkg.end() == true)
       return;
       return;
    
    
+   ActionGroup group(*this);
+
    /* Check that it is not already marked for install and that it can be 
    /* Check that it is not already marked for install and that it can be 
       installed */
       installed */
    StateCache &P = PkgState[Pkg->ID];
    StateCache &P = PkgState[Pkg->ID];
@@ -614,7 +772,7 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
 	P.CandidateVer == (Version *)Pkg.CurrentVer()))
 	P.CandidateVer == (Version *)Pkg.CurrentVer()))
    {
    {
       if (P.CandidateVer == (Version *)Pkg.CurrentVer() && P.InstallVer == 0)
       if (P.CandidateVer == (Version *)Pkg.CurrentVer() && P.InstallVer == 0)
-	 MarkKeep(Pkg);
+	 MarkKeep(Pkg, false, FromUser);
       return;
       return;
    }
    }
 
 
@@ -634,7 +792,20 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
    
    
    P.Mode = ModeInstall;
    P.Mode = ModeInstall;
    P.InstallVer = P.CandidateVer;
    P.InstallVer = P.CandidateVer;
-   P.Flags &= ~Flag::Auto;
+
+   if(FromUser)
+     {
+       // Set it to manual if it's a new install or cancelling the
+       // removal of a garbage package.
+       if(P.Status == 2 || (!Pkg.CurrentVer().end() && !P.Marked))
+	 P.Flags &= ~Flag::Auto;
+     }
+   else
+     {
+       // Set it to auto if this is a new install.
+       if(P.Status == 2)
+	 P.Flags |= Flag::Auto;
+     }
    if (P.CandidateVer == (Version *)Pkg.CurrentVer())
    if (P.CandidateVer == (Version *)Pkg.CurrentVer())
       P.Mode = ModeKeep;
       P.Mode = ModeKeep;
        
        
@@ -711,19 +882,14 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
 	    }
 	    }
 	 }
 	 }
 	 
 	 
-	 if (InstPkg.end() == false)
+	 if (InstPkg.end() == false) 
 	 {
 	 {
 	    if(_config->FindB("Debug::pkgDepCache::AutoInstall",false) == true)
 	    if(_config->FindB("Debug::pkgDepCache::AutoInstall",false) == true)
 	       std::clog << "Installing " << InstPkg.Name() 
 	       std::clog << "Installing " << InstPkg.Name() 
 			 << " as dep of " << Pkg.Name() 
 			 << " as dep of " << Pkg.Name() 
 			 << std::endl;
 			 << std::endl;
-	    MarkInstall(InstPkg,true,Depth + 1);
-
-	    // Set the autoflag, after MarkInstall because MarkInstall unsets it
-	    if (P->CurrentVer == 0)
-	       PkgState[InstPkg->ID].Flags |= Flag::Auto;
+	   MarkInstall(InstPkg, true, Depth + 1, false);
 	 }
 	 }
-	 
 	 continue;
 	 continue;
       }
       }
       
       
@@ -737,7 +903,6 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
 	    PkgIterator Pkg = Ver.ParentPkg();
 	    PkgIterator Pkg = Ver.ParentPkg();
       
       
 	    MarkDelete(Pkg);
 	    MarkDelete(Pkg);
-	    PkgState[Pkg->ID].Flags |= Flag::Auto;
 	 }
 	 }
 	 continue;
 	 continue;
       }      
       }      
@@ -749,6 +914,8 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
 /* */
 /* */
 void pkgDepCache::SetReInstall(PkgIterator const &Pkg,bool To)
 void pkgDepCache::SetReInstall(PkgIterator const &Pkg,bool To)
 {
 {
+   ActionGroup group(*this);
+
    RemoveSizes(Pkg);
    RemoveSizes(Pkg);
    RemoveStates(Pkg);
    RemoveStates(Pkg);
    
    
@@ -767,9 +934,11 @@ void pkgDepCache::SetReInstall(PkgIterator const &Pkg,bool To)
 /* */
 /* */
 void pkgDepCache::SetCandidateVersion(VerIterator TargetVer)
 void pkgDepCache::SetCandidateVersion(VerIterator TargetVer)
 {
 {
+   ActionGroup group(*this);
+
    pkgCache::PkgIterator Pkg = TargetVer.ParentPkg();
    pkgCache::PkgIterator Pkg = TargetVer.ParentPkg();
    StateCache &P = PkgState[Pkg->ID];
    StateCache &P = PkgState[Pkg->ID];
-   
+
    RemoveSizes(Pkg);
    RemoveSizes(Pkg);
    RemoveStates(Pkg);
    RemoveStates(Pkg);
 
 
@@ -782,6 +951,18 @@ void pkgDepCache::SetCandidateVersion(VerIterator TargetVer)
    Update(Pkg);
    Update(Pkg);
    AddSizes(Pkg);
    AddSizes(Pkg);
 }
 }
+
+void pkgDepCache::MarkAuto(const PkgIterator &Pkg, bool Auto)
+{
+  StateCache &state = PkgState[Pkg->ID];
+
+  ActionGroup group(*this);
+
+  if(Auto)
+    state.Flags |= Flag::Auto;
+  else
+    state.Flags &= ~Flag::Auto;
+}
 									/*}}}*/
 									/*}}}*/
 // StateCache::Update - Compute the various static display things	/*{{{*/
 // StateCache::Update - Compute the various static display things	/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
@@ -872,3 +1053,216 @@ bool pkgDepCache::Policy::IsImportantDep(DepIterator Dep)
    return Dep.IsCritical();
    return Dep.IsCritical();
 }
 }
 									/*}}}*/
 									/*}}}*/
+
+pkgDepCache::DefaultRootSetFunc::DefaultRootSetFunc()
+  : constructedSuccessfully(false)
+{
+  Configuration::Item const *Opts;
+  Opts = _config->Tree("APT::NeverAutoRemove");
+  if (Opts != 0 && Opts->Child != 0)
+    {
+      Opts = Opts->Child;
+      for (; Opts != 0; Opts = Opts->Next)
+	{
+	  if (Opts->Value.empty() == true)
+	    continue;
+
+	  regex_t *p = new regex_t;
+	  if(regcomp(p,Opts->Value.c_str(),
+		     REG_EXTENDED | REG_ICASE | REG_NOSUB) != 0)
+	    {
+	      regfree(p);
+	      delete p;
+	      _error->Error("Regex compilation error for APT::NeverAutoRemove");
+	      return;
+	    }
+
+	  rootSetRegexp.push_back(p);
+	}
+    }
+
+  constructedSuccessfully = true;
+}
+
+pkgDepCache::DefaultRootSetFunc::~DefaultRootSetFunc()
+{
+  for(unsigned int i = 0; i < rootSetRegexp.size(); i++)
+    {
+      regfree(rootSetRegexp[i]);
+      delete rootSetRegexp[i];
+    }
+}
+
+
+bool pkgDepCache::DefaultRootSetFunc::InRootSet(const pkgCache::PkgIterator &pkg)
+{
+   for(unsigned int i = 0; i < rootSetRegexp.size(); i++)
+      if (regexec(rootSetRegexp[i], pkg.Name(), 0, 0, 0) == 0)
+	 return true;
+
+   return false;
+}
+
+pkgDepCache::InRootSetFunc *pkgDepCache::GetRootSetFunc()
+{
+  DefaultRootSetFunc *f = new DefaultRootSetFunc;
+  if(f->wasConstructedSuccessfully())
+    return f;
+  else
+    {
+      delete f;
+      return NULL;
+    }
+}
+
+bool pkgDepCache::MarkFollowsRecommends()
+{
+  return _config->FindB("APT::AutoRemove::RecommendsImportant", true);
+}
+
+bool pkgDepCache::MarkFollowsSuggests()
+{
+  return _config->FindB("APT::AutoRemove::SuggestsImportant", false);
+}
+
+// the main mark algorithm
+bool pkgDepCache::MarkRequired(InRootSetFunc &userFunc)
+{
+   bool follow_recommends;
+   bool follow_suggests;
+
+   // init the states
+   for(PkgIterator p = PkgBegin(); !p.end(); ++p)
+   {
+      PkgState[p->ID].Marked  = false;
+      PkgState[p->ID].Garbage = false;
+
+      // debug output
+      if(_config->FindB("Debug::pkgAutoRemove",false) 
+	 && PkgState[p->ID].Flags & Flag::Auto)
+  	 std::clog << "AutoDep: " << p.Name() << std::endl;
+   }
+
+   // init vars
+   follow_recommends = MarkFollowsRecommends();
+   follow_suggests   = MarkFollowsSuggests();
+
+
+
+   // do the mark part, this is the core bit of the algorithm
+   for(PkgIterator p = PkgBegin(); !p.end(); ++p)
+   {
+      if(!(PkgState[p->ID].Flags & Flag::Auto) ||
+	  (p->Flags & Flag::Essential) ||
+	  userFunc.InRootSet(p))
+          
+      {
+	 // the package is installed (and set to keep)
+	 if(PkgState[p->ID].Keep() && !p.CurrentVer().end())
+	    MarkPackage(p, p.CurrentVer(),
+			follow_recommends, follow_suggests);
+	 // the package is to be installed 
+	 else if(PkgState[p->ID].Install())
+	    MarkPackage(p, PkgState[p->ID].InstVerIter(*this),
+			follow_recommends, follow_suggests);
+      }
+   }
+
+   return true;
+}
+
+// mark a single package in Mark-and-Sweep
+void pkgDepCache::MarkPackage(const pkgCache::PkgIterator &pkg,
+			      const pkgCache::VerIterator &ver,
+			      bool follow_recommends,
+			      bool follow_suggests)
+{
+   pkgDepCache::StateCache &state = PkgState[pkg->ID];
+   VerIterator candver            = state.CandidateVerIter(*this);
+   VerIterator instver            = state.InstVerIter(*this);
+
+#if 0
+   // If a package was garbage-collected but is now being marked, we
+   // should re-select it 
+   // For cases when a pkg is set to upgrade and this trigger the
+   // removal of a no-longer used dependency.  if the pkg is set to
+   // keep again later it will result in broken deps
+   if(state.Delete() && state.RemoveReason = Unused) 
+   {
+      if(ver==candver)
+	 mark_install(pkg, false, false, NULL);
+      else if(ver==pkg.CurrentVer())
+	 MarkKeep(pkg, false, false);
+      
+      instver=state.InstVerIter(*this);
+   }
+#endif
+
+   // Ignore versions other than the InstVer, and ignore packages
+   // that are already going to be removed or just left uninstalled.
+   if(!(ver == instver && !instver.end()))
+      return;
+
+   // if we are marked already we are done
+   if(state.Marked)
+      return;
+
+   //std::cout << "Setting Marked for: " << pkg.Name() << std::endl;
+   state.Marked=true;
+
+   if(!ver.end())
+   {
+     for(DepIterator d = ver.DependsList(); !d.end(); ++d)
+     {
+	if(d->Type == Dep::Depends ||
+	   d->Type == Dep::PreDepends ||
+	   (follow_recommends &&
+	    d->Type == Dep::Recommends) ||
+	   (follow_suggests &&
+	    d->Type == Dep::Suggests))
+        {
+	   // Try all versions of this package.
+	   for(VerIterator V = d.TargetPkg().VersionList(); 
+	       !V.end(); ++V)
+	   {
+	      if(_system->VS->CheckDep(V.VerStr(), d->CompareOp, d.TargetVer()))
+	      {
+		 MarkPackage(V.ParentPkg(), V, 
+			     follow_recommends, follow_suggests);
+	      }
+	   }
+	   // Now try virtual packages
+	   for(PrvIterator prv=d.TargetPkg().ProvidesList(); 
+	       !prv.end(); ++prv)
+	   {
+	      if(_system->VS->CheckDep(prv.ProvideVersion(), d->CompareOp, 
+				       d.TargetVer()))
+	      {
+		 MarkPackage(prv.OwnerPkg(), prv.OwnerVer(),
+			     follow_recommends, follow_suggests);
+	      }
+	   }
+	}
+     }
+   }
+}
+
+bool pkgDepCache::Sweep()
+{
+   // do the sweep
+   for(PkgIterator p=PkgBegin(); !p.end(); ++p)
+  {
+     StateCache &state=PkgState[p->ID];
+
+     // if it is not marked and it is installed, it's garbage 
+     if(!state.Marked && (!p.CurrentVer().end() || state.Install()) &&
+	!state.Delete())
+     {
+	state.Garbage=true;
+	if(_config->FindB("Debug::pkgAutoRemove",false))
+	   std::cout << "Garbage: " << p.Name() << std::endl;
+     }
+  }   
+
+   return true;
+}

+ 215 - 4
apt-pkg/depcache.h

@@ -1,4 +1,4 @@
-// -*- mode: cpp; mode: fold -*-
+// -*- mode: c++; mode: fold -*-
 // Description								/*{{{*/
 // Description								/*{{{*/
 // $Id: depcache.h,v 1.14 2001/02/20 07:03:17 jgg Exp $
 // $Id: depcache.h,v 1.14 2001/02/20 07:03:17 jgg Exp $
 /* ######################################################################
 /* ######################################################################
@@ -45,9 +45,71 @@
 #include <apt-pkg/pkgcache.h>
 #include <apt-pkg/pkgcache.h>
 #include <apt-pkg/progress.h>
 #include <apt-pkg/progress.h>
 
 
+#include <regex.h>
+
+#include <vector>
+
 class pkgDepCache : protected pkgCache::Namespace
 class pkgDepCache : protected pkgCache::Namespace
 {
 {
    public:
    public:
+
+   /** \brief An arbitrary predicate on packages. */
+   class InRootSetFunc
+   {
+   public:
+     virtual bool InRootSet(const pkgCache::PkgIterator &pkg) {return false;};
+     virtual ~InRootSetFunc() {};
+   };
+
+   private:
+   /** \brief Mark a single package and all its unmarked important
+    *  dependencies during mark-and-sweep.
+    *
+    *  Recursively invokes itself to mark all dependencies of the
+    *  package.
+    *
+    *  \param pkg The package to mark.
+    *
+    *  \param ver The version of the package that is to be marked.
+    *
+    *  \param follow_recommends If \b true, recommendations of the
+    *  package will be recursively marked.
+    *
+    *  \param follow_suggests If \b true, suggestions of the package
+    *  will be recursively marked.
+    */
+   void MarkPackage(const pkgCache::PkgIterator &pkg,
+		    const pkgCache::VerIterator &ver,
+		    bool follow_recommends,
+		    bool follow_suggests);
+
+   /** \brief Update the Marked field of all packages.
+    *
+    *  Each package's StateCache::Marked field will be set to \b true
+    *  if and only if it can be reached from the root set.  By
+    *  default, the root set consists of the set of manually installed
+    *  or essential packages, but it can be extended using the
+    *  parameter #rootFunc.
+    *
+    *  \param rootFunc A callback that can be used to add extra
+    *  packages to the root set.
+    *
+    *  \return \b false if an error occured.
+    */
+   bool MarkRequired(InRootSetFunc &rootFunc);
+
+   /** \brief Set the StateCache::Garbage flag on all packages that
+    *  should be removed.
+    *
+    *  Packages that were not marked by the last call to #MarkRequired
+    *  are tested to see whether they are actually garbage.  If so,
+    *  they are marked as such.
+    *
+    *  \return \b false if an error occured.
+    */
+   bool Sweep();
+
+   public:
    
    
    // These flags are used in DepState
    // These flags are used in DepState
    enum DepFlags {DepNow = (1 << 0),DepInstall = (1 << 1),DepCVer = (1 << 2),
    enum DepFlags {DepNow = (1 << 0),DepInstall = (1 << 1),DepCVer = (1 << 2),
@@ -63,6 +125,84 @@ class pkgDepCache : protected pkgCache::Namespace
       
       
    enum VersionTypes {NowVersion, InstallVersion, CandidateVersion};
    enum VersionTypes {NowVersion, InstallVersion, CandidateVersion};
    enum ModeList {ModeDelete = 0, ModeKeep = 1, ModeInstall = 2};
    enum ModeList {ModeDelete = 0, ModeKeep = 1, ModeInstall = 2};
+
+   /** \brief Represents an active action group.
+    *
+    *  An action group is a group of actions that are currently being
+    *  performed.  While an active group is active, certain routine
+    *  clean-up actions that would normally be performed after every
+    *  cache operation are delayed until the action group is
+    *  completed.  This is necessary primarily to avoid inefficiencies
+    *  when modifying a large number of packages at once.
+    *
+    *  This class represents an active action group.  Creating an
+    *  instance will create an action group; destroying one will
+    *  destroy the corresponding action group.
+    *
+    *  The following operations are suppressed by this class:
+    *
+    *    - Keeping the Marked and Garbage flags up to date.
+    *
+    *  \note This can be used in the future to easily accumulate
+    *  atomic actions for undo or to display "what apt did anyway";
+    *  e.g., change the counter of how many action groups are active
+    *  to a std::set of pointers to them and use those to store
+    *  information about what happened in a group in the group.
+    */
+   class ActionGroup
+   {
+       pkgDepCache &cache;
+
+       bool released;
+
+       /** Action groups are noncopyable. */
+       ActionGroup(const ActionGroup &other);
+   public:
+       /** \brief Create a new ActionGroup.
+	*
+	*  \param cache The cache that this ActionGroup should
+	*  manipulate.
+	*
+	*  As long as this object exists, no automatic cleanup
+	*  operations will be undertaken.
+	*/
+       ActionGroup(pkgDepCache &cache);
+
+       /** \brief Clean up the action group before it is destroyed.
+        *
+        *  If it is destroyed later, no second cleanup wil be run.
+	*/
+       void release();
+
+       /** \brief Destroy the action group.
+	*
+	*  If this is the last action group, the automatic cache
+	*  cleanup operations will be undertaken.
+	*/
+       ~ActionGroup();
+   };
+
+   /** \brief Returns \b true for packages matching a regular
+    *  expression in APT::NeverAutoRemove.
+    */
+   class DefaultRootSetFunc : public InRootSetFunc
+   {
+     std::vector<regex_t *> rootSetRegexp;
+     bool constructedSuccessfully;
+
+   public:
+     DefaultRootSetFunc();
+     ~DefaultRootSetFunc();
+
+     /** \return \b true if the class initialized successfully, \b
+      *  false otherwise.  Used to avoid throwing an exception, since
+      *  APT classes generally don't.
+      */
+     bool wasConstructedSuccessfully() const { return constructedSuccessfully; }
+
+     bool InRootSet(const pkgCache::PkgIterator &pkg);
+   };
+
    struct StateCache
    struct StateCache
    {
    {
       // Epoch stripped text versions of the two version fields
       // Epoch stripped text versions of the two version fields
@@ -79,6 +219,17 @@ class pkgDepCache : protected pkgCache::Namespace
       unsigned short Flags;
       unsigned short Flags;
       unsigned short iFlags;           // Internal flags
       unsigned short iFlags;           // Internal flags
 
 
+      /** \brief \b true if this package can be reached from the root set. */
+      bool Marked;
+
+      /** \brief \b true if this package is unused and should be removed.
+       *
+       *  This differs from !#Marked, because it is possible that some
+       *  unreachable packages will be protected from becoming
+       *  garbage.
+       */
+      bool Garbage;
+
       // Various tree indicators
       // Various tree indicators
       signed char Status;              // -1,0,1,2
       signed char Status;              // -1,0,1,2
       unsigned char Mode;              // ModeList
       unsigned char Mode;              // ModeList
@@ -119,6 +270,14 @@ class pkgDepCache : protected pkgCache::Namespace
       
       
       virtual ~Policy() {};
       virtual ~Policy() {};
    };
    };
+
+   private:
+   /** The number of open "action groups"; certain post-action
+    *  operations are suppressed if this number is > 0.
+    */
+   int group_level;
+
+   friend class ActionGroup;
      
      
    protected:
    protected:
 
 
@@ -182,16 +341,68 @@ class pkgDepCache : protected pkgCache::Namespace
    inline StateCache &operator [](PkgIterator const &I) {return PkgState[I->ID];};
    inline StateCache &operator [](PkgIterator const &I) {return PkgState[I->ID];};
    inline unsigned char &operator [](DepIterator const &I) {return DepState[I->ID];};
    inline unsigned char &operator [](DepIterator const &I) {return DepState[I->ID];};
 
 
-   // Manipulators
-   void MarkKeep(PkgIterator const &Pkg,bool Soft = false);
+   /** \return A function identifying packages in the root set other
+    *  than manually installed packages and essential packages, or \b
+    *  NULL if an error occurs.
+    *
+    *  \todo Is this the best place for this function?  Perhaps the
+    *  settings for mark-and-sweep should be stored in a single
+    *  external class?
+    */
+   virtual InRootSetFunc *GetRootSetFunc();
+
+   /** \return \b true if the garbage collector should follow recommendations.
+    */
+   virtual bool MarkFollowsRecommends();
+
+   /** \return \b true if the garbage collector should follow suggestions.
+    */
+   virtual bool MarkFollowsSuggests();
+
+   /** \brief Update the Marked and Garbage fields of all packages.
+    *
+    *  This routine is implicitly invoked after all state manipulators
+    *  and when an ActionGroup is destroyed.  It invokes #MarkRequired
+    *  and #Sweep to do its dirty work.
+    *
+    *  \param rootFunc A predicate that returns \b true for packages
+    *  that should be added to the root set.
+    */
+   bool MarkAndSweep(InRootSetFunc &rootFunc)
+   {
+     return MarkRequired(rootFunc) && Sweep();
+   }
+
+   bool MarkAndSweep()
+   {
+     std::auto_ptr<InRootSetFunc> f(GetRootSetFunc());
+     if(f.get() != NULL)
+       return MarkAndSweep(*f.get());
+     else
+       return false;
+   }
+
+   /** \name State Manipulators
+    */
+   // @{
+   void MarkKeep(PkgIterator const &Pkg, bool Soft = false,
+		 bool FromUser = true);
    void MarkDelete(PkgIterator const &Pkg,bool Purge = false);
    void MarkDelete(PkgIterator const &Pkg,bool Purge = false);
    void MarkInstall(PkgIterator const &Pkg,bool AutoInst = true,
    void MarkInstall(PkgIterator const &Pkg,bool AutoInst = true,
-		    unsigned long Depth = 0);
+		    unsigned long Depth = 0, bool FromUser = true);
    void SetReInstall(PkgIterator const &Pkg,bool To);
    void SetReInstall(PkgIterator const &Pkg,bool To);
    void SetCandidateVersion(VerIterator TargetVer);
    void SetCandidateVersion(VerIterator TargetVer);
+
+   /** Set the "is automatically installed" flag of Pkg. */
+   void MarkAuto(const PkgIterator &Pkg, bool Auto);
+   // @}
    
    
    // This is for debuging
    // This is for debuging
    void Update(OpProgress *Prog = 0);
    void Update(OpProgress *Prog = 0);
+
+   // read persistent states
+   bool readStateFile(OpProgress *prog);
+   bool writeStateFile(OpProgress *prog);
    
    
    // Size queries
    // Size queries
    inline double UsrSize() {return iUsrSize;};
    inline double UsrSize() {return iUsrSize;};

+ 1 - 1
apt-pkg/init.h

@@ -18,7 +18,7 @@
 
 
 // See the makefile
 // See the makefile
 #define APT_PKG_MAJOR 3
 #define APT_PKG_MAJOR 3
-#define APT_PKG_MINOR 11
+#define APT_PKG_MINOR 50
 #define APT_PKG_RELEASE 0
 #define APT_PKG_RELEASE 0
     
     
 extern const char *pkgVersion;
 extern const char *pkgVersion;

+ 1 - 1
apt-pkg/makefile

@@ -13,7 +13,7 @@ include ../buildlib/defaults.mak
 # methods/makefile - FIXME
 # methods/makefile - FIXME
 LIBRARY=apt-pkg
 LIBRARY=apt-pkg
 LIBEXT=$(GLIBC_VER)$(LIBSTDCPP_VER)
 LIBEXT=$(GLIBC_VER)$(LIBSTDCPP_VER)
-MAJOR=3.11
+MAJOR=3.50
 MINOR=0
 MINOR=0
 SLIBS=$(PTHREADLIB) $(INTLLIBS)
 SLIBS=$(PTHREADLIB) $(INTLLIBS)
 APT_DOMAIN:=libapt-pkg$(MAJOR)
 APT_DOMAIN:=libapt-pkg$(MAJOR)

+ 6 - 9
apt-pkg/packagemanager.cc

@@ -106,7 +106,7 @@ bool pkgPackageManager::FixMissing()
    
    
       // Okay, this file is missing and we need it. Mark it for keep 
       // Okay, this file is missing and we need it. Mark it for keep 
       Bad = true;
       Bad = true;
-      Cache.MarkKeep(I);
+      Cache.MarkKeep(I, false, false);
    }
    }
  
  
    // We have to empty the list otherwise it will not have the new changes
    // We have to empty the list otherwise it will not have the new changes
@@ -631,14 +631,11 @@ pkgPackageManager::OrderResult pkgPackageManager::OrderInstall()
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* This uses the filenames in FileNames and the information in the
 /* This uses the filenames in FileNames and the information in the
    DepCache to perform the installation of packages.*/
    DepCache to perform the installation of packages.*/
-pkgPackageManager::OrderResult pkgPackageManager::DoInstall(int status_fd)
+pkgPackageManager::OrderResult pkgPackageManager::DoInstall(int statusFd)
 {
 {
-   OrderResult Res = OrderInstall();
-   if(Debug)
-      std::clog << "OrderInstall() returned: " << Res << std::endl;
-   if (Res != Failed)
-      if (Go(status_fd) == false)
-	 return Failed;
-   return Res;
+   if(DoInstallPreFork() == Failed)
+      return Failed;
+   
+   return DoInstallPostFork(statusFd);
 }
 }
 									/*}}}*/
 									/*}}}*/

+ 30 - 2
apt-pkg/packagemanager.h

@@ -28,7 +28,9 @@
 #endif
 #endif
 
 
 #include <string>
 #include <string>
+#include <iostream>
 #include <apt-pkg/pkgcache.h>
 #include <apt-pkg/pkgcache.h>
+#include <apt-pkg/depcache.h>
 
 
 using std::string;
 using std::string;
 
 
@@ -70,13 +72,39 @@ class pkgPackageManager : protected pkgCache::Namespace
    virtual bool Remove(PkgIterator /*Pkg*/,bool /*Purge*/=false) {return false;};
    virtual bool Remove(PkgIterator /*Pkg*/,bool /*Purge*/=false) {return false;};
    virtual bool Go(int statusFd=-1) {return true;};
    virtual bool Go(int statusFd=-1) {return true;};
    virtual void Reset() {};
    virtual void Reset() {};
-   
+
+   // the result of the operation
+   OrderResult Res;
+
    public:
    public:
       
       
    // Main action members
    // Main action members
    bool GetArchives(pkgAcquire *Owner,pkgSourceList *Sources,
    bool GetArchives(pkgAcquire *Owner,pkgSourceList *Sources,
 		    pkgRecords *Recs);
 		    pkgRecords *Recs);
-   OrderResult DoInstall(int statusFd=-1); 
+
+   // Do the installation 
+   OrderResult DoInstall(int statusFd=-1);
+
+   // stuff that needs to be done before the fork() of a library that
+   // uses apt
+   OrderResult DoInstallPreFork() {
+      Res = OrderInstall();
+      return Res;
+   };
+
+   // stuff that needs to be done after the fork
+   OrderResult DoInstallPostFork(int statusFd=-1) {
+      bool goResult = Go(statusFd);
+      if(goResult == false) 
+	 return Failed;
+
+      // if all was fine update the state file
+      if(Res == Completed) {
+	 Cache.writeStateFile(NULL);
+      }
+      return Res;
+   };
+
    bool FixMissing();
    bool FixMissing();
    
    
    pkgPackageManager(pkgDepCache *Cache);
    pkgPackageManager(pkgDepCache *Cache);

+ 2 - 0
apt-pkg/pkgcachegen.cc

@@ -26,6 +26,8 @@
 #include <apt-pkg/sptr.h>
 #include <apt-pkg/sptr.h>
 #include <apt-pkg/pkgsystem.h>
 #include <apt-pkg/pkgsystem.h>
 
 
+#include <apt-pkg/tagfile.h>
+
 #include <apti18n.h>
 #include <apti18n.h>
 
 
 #include <vector>
 #include <vector>

+ 63 - 3
cmdline/apt-get.cc

@@ -60,6 +60,7 @@
 #include <errno.h>
 #include <errno.h>
 #include <regex.h>
 #include <regex.h>
 #include <sys/wait.h>
 #include <sys/wait.h>
+#include <sstream>
 									/*}}}*/
 									/*}}}*/
 
 
 using namespace std;
 using namespace std;
@@ -995,7 +996,7 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true,
 	 cerr << _("Unable to correct missing packages.") << endl;
 	 cerr << _("Unable to correct missing packages.") << endl;
 	 return _error->Error(_("Aborting install."));
 	 return _error->Error(_("Aborting install."));
       }
       }
-       	 
+
       _system->UnLock();
       _system->UnLock();
       int status_fd = _config->FindI("APT::Status-Fd",-1);
       int status_fd = _config->FindI("APT::Status-Fd",-1);
       pkgPackageManager::OrderResult Res = PM->DoInstall(status_fd);
       pkgPackageManager::OrderResult Res = PM->DoInstall(status_fd);
@@ -1397,6 +1398,52 @@ bool DoUpdate(CommandLine &CmdL)
    return true;
    return true;
 }
 }
 									/*}}}*/
 									/*}}}*/
+// DoAutomaticRemove - Remove all automatic unused packages		/*{{{*/
+// ---------------------------------------------------------------------
+/* Remove unused automatic packages */
+bool DoAutomaticRemove(CacheFile &Cache)
+{
+   if(_config->FindI("Debug::pkgAutoRemove",false))
+      std::cout << "DoAutomaticRemove()" << std::endl;
+
+   if (_config->FindB("APT::Get::Remove",true) == false)
+      return _error->Error(_("We are not supposed to delete stuff, can't "
+			     "start AutoRemover"));
+
+   {
+     pkgDepCache::ActionGroup group(*Cache);
+
+     // look over the cache to see what can be removed
+     for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); ! Pkg.end(); ++Pkg)
+       {
+	 if (Cache[Pkg].Garbage)
+	   {
+	     if(Pkg.CurrentVer() != 0 || Cache[Pkg].Install())
+	       fprintf(stdout,"We could delete %s\n", Pkg.Name());
+
+	     if(Pkg.CurrentVer() != 0 && Pkg->CurrentState != pkgCache::State::ConfigFiles)
+	       Cache->MarkDelete(Pkg, _config->FindB("APT::Get::Purge", false));
+	     else
+	       Cache->MarkKeep(Pkg, false, 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;
+}
+
 // DoUpgrade - Upgrade all packages					/*{{{*/
 // DoUpgrade - Upgrade all packages					/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* Upgrade all packages without installing new packages or erasing old
 /* Upgrade all packages without installing new packages or erasing old
@@ -1439,6 +1486,11 @@ bool DoInstall(CommandLine &CmdL)
    bool DefRemove = false;
    bool DefRemove = false;
    if (strcasecmp(CmdL.FileList[0],"remove") == 0)
    if (strcasecmp(CmdL.FileList[0],"remove") == 0)
       DefRemove = true;
       DefRemove = true;
+   else if (strcasecmp(CmdL.FileList[0], "autoremove") == 0)
+     {
+       _config->Set("APT::Get::AutomaticRemove", "true");
+       DefRemove = true;
+     }
 
 
    for (const char **I = CmdL.FileList + 1; *I != 0; I++)
    for (const char **I = CmdL.FileList + 1; *I != 0; I++)
    {
    {
@@ -1588,6 +1640,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
    /* Print out a list of packages that are going to be installed extra
       to what the user asked */
       to what the user asked */
    if (Cache->InstCount() != ExpectedInst)
    if (Cache->InstCount() != ExpectedInst)
@@ -1607,8 +1664,8 @@ bool DoInstall(CommandLine &CmdL)
 	 
 	 
 	 if (*J == 0) {
 	 if (*J == 0) {
 	    List += string(I.Name()) + " ";
 	    List += string(I.Name()) + " ";
-        VersionsList += string(Cache[I].CandVersion) + "\n";
-     }
+	    VersionsList += string(Cache[I].CandVersion) + "\n";
+	 }
       }
       }
       
       
       ShowList(c1out,_("The following extra packages will be installed:"),List,VersionsList);
       ShowList(c1out,_("The following extra packages will be installed:"),List,VersionsList);
@@ -2477,6 +2534,7 @@ void GetInitialize()
    _config->Set("APT::Get::Fix-Broken",false);
    _config->Set("APT::Get::Fix-Broken",false);
    _config->Set("APT::Get::Force-Yes",false);
    _config->Set("APT::Get::Force-Yes",false);
    _config->Set("APT::Get::List-Cleanup",true);
    _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				/*{{{*/
@@ -2532,6 +2590,7 @@ int main(int argc,const char *argv[])
       {0,"remove","APT::Get::Remove",0},
       {0,"remove","APT::Get::Remove",0},
       {0,"only-source","APT::Get::Only-Source",0},
       {0,"only-source","APT::Get::Only-Source",0},
       {0,"arch-only","APT::Get::Arch-Only",0},
       {0,"arch-only","APT::Get::Arch-Only",0},
+      {0,"auto-remove","APT::Get::AutomaticRemove",0},
       {0,"allow-unauthenticated","APT::Get::AllowUnauthenticated",0},
       {0,"allow-unauthenticated","APT::Get::AllowUnauthenticated",0},
       {'c',"config-file",0,CommandLine::ConfigFile},
       {'c',"config-file",0,CommandLine::ConfigFile},
       {'o',"option",0,CommandLine::ArbItem},
       {'o',"option",0,CommandLine::ArbItem},
@@ -2540,6 +2599,7 @@ int main(int argc,const char *argv[])
                                    {"upgrade",&DoUpgrade},
                                    {"upgrade",&DoUpgrade},
                                    {"install",&DoInstall},
                                    {"install",&DoInstall},
                                    {"remove",&DoInstall},
                                    {"remove",&DoInstall},
+				   {"autoremove",&DoInstall},
                                    {"dist-upgrade",&DoDistUpgrade},
                                    {"dist-upgrade",&DoDistUpgrade},
                                    {"dselect-upgrade",&DoDSelectUpgrade},
                                    {"dselect-upgrade",&DoDSelectUpgrade},
 				   {"build-dep",&DoBuildDep},
 				   {"build-dep",&DoBuildDep},

+ 63 - 0
cmdline/apt-mark

@@ -0,0 +1,63 @@
+#!/usr/bin/python
+
+from optparse import OptionParser
+
+try:
+    import apt_pkg
+except ImportError:
+    print "Error importing apt_pkg, is python-apt installed?"
+    
+import sys
+import os.path
+    
+actions = { "markauto" : 1,
+            "unmarkauto": 0
+          }
+
+if __name__ == "__main__":
+    apt_pkg.init()
+
+    # option parsing
+    parser = OptionParser()
+    parser.usage = "%prog [options] {markauto|unmarkauto} packages..."
+    parser.add_option("-f", "--file", action="store", type="string",
+                      dest="filename",
+                      help="read/write a different file")
+    parser.add_option("-v", "--verbose",
+                      action="store_true", dest="verbose", default=False,
+                      help="print verbose status messages to stdout")
+    (options, args) = parser.parse_args()
+    if len(args) < 2:
+        parser.error("not enough argument")
+
+    # get pkgs to change
+    if args[0] not in actions.keys():
+        parser.error("first argument must be 'markauto' or 'unmarkauto'")
+    pkgs = args[1:]
+    action = actions[args[0]]
+
+    # get the state-file
+    if not options.filename:
+        STATE_FILE = apt_pkg.Config.FindDir("Dir::State") + "extended_states"
+    else:
+        STATE_FILE=options.state_file
+
+    # open the statefile
+    if os.path.exists(STATE_FILE):
+        tagfile = apt_pkg.ParseTagFile(open(STATE_FILE))
+        outfile = open(STATE_FILE+".tmp","w")
+        while tagfile.Step():
+            pkgname = tagfile.Section.get("Package")
+            autoInst = tagfile.Section.get("Auto-Installed")
+            if pkgname in pkgs:
+                if options.verbose:
+                    print "changing %s to %s" % (pkgname,action)
+                newsec = apt_pkg.RewriteSection(tagfile.Section,
+                                       [],
+                                       [ ("Auto-Installed",str(action)) ]
+                                       )
+                outfile.write(newsec+"\n")
+            else:
+                outfile.write(str(tagfile.Section)+"\n")
+        # all done, rename the tmpfile
+        os.rename(outfile.name, STATE_FILE)

+ 1 - 1
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)
 AC_CONFIG_HEADER(include/config.h:buildlib/config.h.in include/apti18n.h:buildlib/apti18n.h.in)
 
 
 dnl -- SET THIS TO THE RELEASE VERSION --
 dnl -- SET THIS TO THE RELEASE VERSION --
-AC_DEFINE_UNQUOTED(VERSION,"0.6.44.1-2ubuntu1
+AC_DEFINE_UNQUOTED(VERSION,"0.6.44.2ubuntu1")
 PACKAGE="apt"
 PACKAGE="apt"
 AC_DEFINE_UNQUOTED(PACKAGE,"$PACKAGE")
 AC_DEFINE_UNQUOTED(PACKAGE,"$PACKAGE")
 AC_SUBST(PACKAGE)
 AC_SUBST(PACKAGE)

+ 8 - 0
debian/changelog

@@ -1,6 +1,13 @@
 apt (0.6.44.2ubuntu1) edgy; urgency=low
 apt (0.6.44.2ubuntu1) edgy; urgency=low
 
 
   * merged with debian/unstable
   * merged with debian/unstable
+  * merged the "auto-mark" branch to support aptitude like
+    marking of automatically installed dependencies and added
+    "apt-get remove --auto-remove" to remove unused auto-installed
+    packages again
+  * changed library version from 3.11 to 3.50 to make it clearly 
+    different from the debian version (we are ABI incompatible because
+    of the auto-mark patch)
 
 
  -- Michael Vogt <michael.vogt@ubuntu.com>  Mon,  3 Jul 2006 18:30:46 +0200
  -- Michael Vogt <michael.vogt@ubuntu.com>  Mon,  3 Jul 2006 18:30:46 +0200
 
 
@@ -561,6 +568,7 @@ apt (0.6.37) breezy; urgency=low
   * Add Welsh translation from Dafydd Harries
   * Add Welsh translation from Dafydd Harries
     (daf@muse.19inch.net--2005/apt--main--0--patch-1)
     (daf@muse.19inch.net--2005/apt--main--0--patch-1)
   * Change debian/bugscript to use #!/bin/bash (Closes: #313402)
   * Change debian/bugscript to use #!/bin/bash (Closes: #313402)
+  * Fix a incorrect example in the man-page (closes: #282918)
 
 
  -- Matt Zimmerman <mdz@ubuntu.com>  Tue, 24 May 2005 14:38:25 -0700
  -- Matt Zimmerman <mdz@ubuntu.com>  Tue, 24 May 2005 14:38:25 -0700
 
 

+ 1 - 1
doc/apt_preferences.5.xml

@@ -183,7 +183,7 @@ belonging to any distribution whose Archive name is "<literal>unstable</literal>
 <programlisting>
 <programlisting>
 Package: *
 Package: *
 Pin: release a=unstable
 Pin: release a=unstable
-Pin-Priority: 50
+Pin-Priority: 500
 </programlisting>
 </programlisting>
 
 
 <simpara>The following record assigns a high priority to all package versions
 <simpara>The following record assigns a high priority to all package versions

+ 7 - 2
doc/examples/configure-index

@@ -24,11 +24,15 @@ APT
 {
 {
   Architecture "i386";
   Architecture "i386";
   Build-Essential "build-essential";
   Build-Essential "build-essential";
-  
+
+  NeverAutoRemove  { "linux-kernel.*";  };  // packages that should never
+                                            // considered for autoRemove
+
   // Options for apt-get
   // Options for apt-get
   Get 
   Get 
   {
   {
      Arch-Only "false";
      Arch-Only "false";
+     AutomaticRemove "false";       
      Download-Only "false";
      Download-Only "false";
      Simulate "false";
      Simulate "false";
      Assume-Yes "false";
      Assume-Yes "false";
@@ -250,7 +254,8 @@ Debug
   pkgDPkgPM "false";
   pkgDPkgPM "false";
   pkgDPkgProgressReporting "false";
   pkgDPkgProgressReporting "false";
   pkgOrderList "false";
   pkgOrderList "false";
-  
+  pkgAutoRemove "false";   // show information about automatic removes
+
   pkgInitialize "false";   // This one will dump the configuration space
   pkgInitialize "false";   // This one will dump the configuration space
   NoLocking "false";
   NoLocking "false";
   Acquire::Ftp "false";    // Show ftp command traffic
   Acquire::Ftp "false";    // Show ftp command traffic

+ 1 - 1
methods/makefile

@@ -7,7 +7,7 @@ include ../buildlib/defaults.mak
 BIN := $(BIN)/methods
 BIN := $(BIN)/methods
 
 
 # FIXME..
 # FIXME..
-LIB_APT_PKG_MAJOR = 3.11
+LIB_APT_PKG_MAJOR = 3.50
 APT_DOMAIN := libapt-pkg$(LIB_APT_PKG_MAJOR)
 APT_DOMAIN := libapt-pkg$(LIB_APT_PKG_MAJOR)
 
 
 # The file method
 # The file method

+ 183 - 155
po/apt-all.pot

@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-05-27 13:46+0200\n"
+"POT-Creation-Date: 2006-06-26 07:08+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -148,7 +148,7 @@ msgstr ""
 
 
 #: cmdline/apt-cache.cc:1652 cmdline/apt-cdrom.cc:138 cmdline/apt-config.cc:70
 #: cmdline/apt-cache.cc:1652 cmdline/apt-cdrom.cc:138 cmdline/apt-config.cc:70
 #: cmdline/apt-extracttemplates.cc:225 ftparchive/apt-ftparchive.cc:550
 #: cmdline/apt-extracttemplates.cc:225 ftparchive/apt-ftparchive.cc:550
-#: cmdline/apt-get.cc:2369 cmdline/apt-sortpkgs.cc:144
+#: cmdline/apt-get.cc:2426 cmdline/apt-sortpkgs.cc:144
 #, c-format
 #, c-format
 msgid "%s %s for %s %s compiled on %s %s\n"
 msgid "%s %s for %s %s compiled on %s %s\n"
 msgstr ""
 msgstr ""
@@ -243,7 +243,7 @@ msgid ""
 "  -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n"
 "  -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-extracttemplates.cc:267 apt-pkg/pkgcachegen.cc:710
+#: cmdline/apt-extracttemplates.cc:267 apt-pkg/pkgcachegen.cc:712
 #, c-format
 #, c-format
 msgid "Unable to write to %s"
 msgid "Unable to write to %s"
 msgstr ""
 msgstr ""
@@ -531,221 +531,221 @@ msgstr ""
 msgid "Failed to rename %s to %s"
 msgid "Failed to rename %s to %s"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:120
+#: cmdline/apt-get.cc:121
 msgid "Y"
 msgid "Y"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:142 cmdline/apt-get.cc:1506
+#: cmdline/apt-get.cc:143 cmdline/apt-get.cc:1558
 #, c-format
 #, c-format
 msgid "Regex compilation error - %s"
 msgid "Regex compilation error - %s"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:237
+#: cmdline/apt-get.cc:238
 msgid "The following packages have unmet dependencies:"
 msgid "The following packages have unmet dependencies:"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:327
+#: cmdline/apt-get.cc:328
 #, c-format
 #, c-format
 msgid "but %s is installed"
 msgid "but %s is installed"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:329
+#: cmdline/apt-get.cc:330
 #, c-format
 #, c-format
 msgid "but %s is to be installed"
 msgid "but %s is to be installed"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:336
+#: cmdline/apt-get.cc:337
 msgid "but it is not installable"
 msgid "but it is not installable"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:338
+#: cmdline/apt-get.cc:339
 msgid "but it is a virtual package"
 msgid "but it is a virtual package"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:341
+#: cmdline/apt-get.cc:342
 msgid "but it is not installed"
 msgid "but it is not installed"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:341
+#: cmdline/apt-get.cc:342
 msgid "but it is not going to be installed"
 msgid "but it is not going to be installed"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:346
+#: cmdline/apt-get.cc:347
 msgid " or"
 msgid " or"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:375
+#: cmdline/apt-get.cc:376
 msgid "The following NEW packages will be installed:"
 msgid "The following NEW packages will be installed:"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:401
+#: cmdline/apt-get.cc:402
 msgid "The following packages will be REMOVED:"
 msgid "The following packages will be REMOVED:"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:423
+#: cmdline/apt-get.cc:424
 msgid "The following packages have been kept back:"
 msgid "The following packages have been kept back:"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:444
+#: cmdline/apt-get.cc:445
 msgid "The following packages will be upgraded:"
 msgid "The following packages will be upgraded:"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:465
+#: cmdline/apt-get.cc:466
 msgid "The following packages will be DOWNGRADED:"
 msgid "The following packages will be DOWNGRADED:"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:485
+#: cmdline/apt-get.cc:486
 msgid "The following held packages will be changed:"
 msgid "The following held packages will be changed:"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:538
+#: cmdline/apt-get.cc:539
 #, c-format
 #, c-format
 msgid "%s (due to %s) "
 msgid "%s (due to %s) "
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:546
+#: cmdline/apt-get.cc:547
 msgid ""
 msgid ""
 "WARNING: The following essential packages will be removed.\n"
 "WARNING: The following essential packages will be removed.\n"
 "This should NOT be done unless you know exactly what you are doing!"
 "This should NOT be done unless you know exactly what you are doing!"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:577
+#: cmdline/apt-get.cc:578
 #, c-format
 #, c-format
 msgid "%lu upgraded, %lu newly installed, "
 msgid "%lu upgraded, %lu newly installed, "
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:581
+#: cmdline/apt-get.cc:582
 #, c-format
 #, c-format
 msgid "%lu reinstalled, "
 msgid "%lu reinstalled, "
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:583
+#: cmdline/apt-get.cc:584
 #, c-format
 #, c-format
 msgid "%lu downgraded, "
 msgid "%lu downgraded, "
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:585
+#: cmdline/apt-get.cc:586
 #, c-format
 #, c-format
 msgid "%lu to remove and %lu not upgraded.\n"
 msgid "%lu to remove and %lu not upgraded.\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:589
+#: cmdline/apt-get.cc:590
 #, c-format
 #, c-format
 msgid "%lu not fully installed or removed.\n"
 msgid "%lu not fully installed or removed.\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:649
+#: cmdline/apt-get.cc:650
 msgid "Correcting dependencies..."
 msgid "Correcting dependencies..."
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:652
+#: cmdline/apt-get.cc:653
 msgid " failed."
 msgid " failed."
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:655
+#: cmdline/apt-get.cc:656
 msgid "Unable to correct dependencies"
 msgid "Unable to correct dependencies"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:658
+#: cmdline/apt-get.cc:659
 msgid "Unable to minimize the upgrade set"
 msgid "Unable to minimize the upgrade set"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:660
+#: cmdline/apt-get.cc:661
 msgid " Done"
 msgid " Done"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:664
+#: cmdline/apt-get.cc:665
 msgid "You might want to run `apt-get -f install' to correct these."
 msgid "You might want to run `apt-get -f install' to correct these."
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:667
+#: cmdline/apt-get.cc:668
 msgid "Unmet dependencies. Try using -f."
 msgid "Unmet dependencies. Try using -f."
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:689
+#: cmdline/apt-get.cc:690
 msgid "WARNING: The following packages cannot be authenticated!"
 msgid "WARNING: The following packages cannot be authenticated!"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:693
+#: cmdline/apt-get.cc:694
 msgid "Authentication warning overridden.\n"
 msgid "Authentication warning overridden.\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:700
+#: cmdline/apt-get.cc:701
 msgid "Install these packages without verification [y/N]? "
 msgid "Install these packages without verification [y/N]? "
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:702
+#: cmdline/apt-get.cc:703
 msgid "Some packages could not be authenticated"
 msgid "Some packages could not be authenticated"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:711 cmdline/apt-get.cc:858
+#: cmdline/apt-get.cc:712 cmdline/apt-get.cc:859
 msgid "There are problems and -y was used without --force-yes"
 msgid "There are problems and -y was used without --force-yes"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:755
+#: cmdline/apt-get.cc:756
 msgid "Internal error, InstallPackages was called with broken packages!"
 msgid "Internal error, InstallPackages was called with broken packages!"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:764
+#: cmdline/apt-get.cc:765
 msgid "Packages need to be removed but remove is disabled."
 msgid "Packages need to be removed but remove is disabled."
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:775
+#: cmdline/apt-get.cc:776
 msgid "Internal error, Ordering didn't finish"
 msgid "Internal error, Ordering didn't finish"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:791 cmdline/apt-get.cc:1800 cmdline/apt-get.cc:1833
+#: cmdline/apt-get.cc:792 cmdline/apt-get.cc:1857 cmdline/apt-get.cc:1890
 msgid "Unable to lock the download directory"
 msgid "Unable to lock the download directory"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:801 cmdline/apt-get.cc:1881 cmdline/apt-get.cc:2117
+#: cmdline/apt-get.cc:802 cmdline/apt-get.cc:1938 cmdline/apt-get.cc:2174
 #: apt-pkg/cachefile.cc:67
 #: apt-pkg/cachefile.cc:67
 msgid "The list of sources could not be read."
 msgid "The list of sources could not be read."
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:816
+#: cmdline/apt-get.cc:817
 msgid "How odd.. The sizes didn't match, email apt@packages.debian.org"
 msgid "How odd.. The sizes didn't match, email apt@packages.debian.org"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:821
+#: cmdline/apt-get.cc:822
 #, c-format
 #, c-format
 msgid "Need to get %sB/%sB of archives.\n"
 msgid "Need to get %sB/%sB of archives.\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:824
+#: cmdline/apt-get.cc:825
 #, c-format
 #, c-format
 msgid "Need to get %sB of archives.\n"
 msgid "Need to get %sB of archives.\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:829
+#: cmdline/apt-get.cc:830
 #, c-format
 #, c-format
 msgid "After unpacking %sB of additional disk space will be used.\n"
 msgid "After unpacking %sB of additional disk space will be used.\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:832
+#: cmdline/apt-get.cc:833
 #, c-format
 #, c-format
 msgid "After unpacking %sB disk space will be freed.\n"
 msgid "After unpacking %sB disk space will be freed.\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:846 cmdline/apt-get.cc:1971
+#: cmdline/apt-get.cc:847 cmdline/apt-get.cc:2028
 #, c-format
 #, c-format
 msgid "Couldn't determine free space in %s"
 msgid "Couldn't determine free space in %s"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:849
+#: cmdline/apt-get.cc:850
 #, c-format
 #, c-format
 msgid "You don't have enough free space in %s."
 msgid "You don't have enough free space in %s."
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:864 cmdline/apt-get.cc:884
+#: cmdline/apt-get.cc:865 cmdline/apt-get.cc:885
 msgid "Trivial Only specified but this is not a trivial operation."
 msgid "Trivial Only specified but this is not a trivial operation."
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:866
+#: cmdline/apt-get.cc:867
 msgid "Yes, do as I say!"
 msgid "Yes, do as I say!"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:868
+#: cmdline/apt-get.cc:869
 #, c-format
 #, c-format
 msgid ""
 msgid ""
 "You are about to do something potentially harmful.\n"
 "You are about to do something potentially harmful.\n"
@@ -753,74 +753,74 @@ msgid ""
 " ?] "
 " ?] "
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:874 cmdline/apt-get.cc:893
+#: cmdline/apt-get.cc:875 cmdline/apt-get.cc:894
 msgid "Abort."
 msgid "Abort."
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:889
+#: cmdline/apt-get.cc:890
 msgid "Do you want to continue [Y/n]? "
 msgid "Do you want to continue [Y/n]? "
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:961 cmdline/apt-get.cc:1365 cmdline/apt-get.cc:2014
+#: cmdline/apt-get.cc:962 cmdline/apt-get.cc:1366 cmdline/apt-get.cc:2071
 #, c-format
 #, c-format
 msgid "Failed to fetch %s  %s\n"
 msgid "Failed to fetch %s  %s\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:979
+#: cmdline/apt-get.cc:980
 msgid "Some files failed to download"
 msgid "Some files failed to download"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:980 cmdline/apt-get.cc:2023
+#: cmdline/apt-get.cc:981 cmdline/apt-get.cc:2080
 msgid "Download complete and in download only mode"
 msgid "Download complete and in download only mode"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:986
+#: cmdline/apt-get.cc:987
 msgid ""
 msgid ""
 "Unable to fetch some archives, maybe run apt-get update or try with --fix-"
 "Unable to fetch some archives, maybe run apt-get update or try with --fix-"
 "missing?"
 "missing?"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:990
+#: cmdline/apt-get.cc:991
 msgid "--fix-missing and media swapping is not currently supported"
 msgid "--fix-missing and media swapping is not currently supported"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:995
+#: cmdline/apt-get.cc:996
 msgid "Unable to correct missing packages."
 msgid "Unable to correct missing packages."
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:996
+#: cmdline/apt-get.cc:997
 msgid "Aborting install."
 msgid "Aborting install."
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1030
+#: cmdline/apt-get.cc:1031
 #, c-format
 #, c-format
 msgid "Note, selecting %s instead of %s\n"
 msgid "Note, selecting %s instead of %s\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1040
+#: cmdline/apt-get.cc:1041
 #, c-format
 #, c-format
 msgid "Skipping %s, it is already installed and upgrade is not set.\n"
 msgid "Skipping %s, it is already installed and upgrade is not set.\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1058
+#: cmdline/apt-get.cc:1059
 #, c-format
 #, c-format
 msgid "Package %s is not installed, so not removed\n"
 msgid "Package %s is not installed, so not removed\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1069
+#: cmdline/apt-get.cc:1070
 #, c-format
 #, c-format
 msgid "Package %s is a virtual package provided by:\n"
 msgid "Package %s is a virtual package provided by:\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1081
+#: cmdline/apt-get.cc:1082
 msgid " [Installed]"
 msgid " [Installed]"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1086
+#: cmdline/apt-get.cc:1087
 msgid "You should explicitly select one to install."
 msgid "You should explicitly select one to install."
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1091
+#: cmdline/apt-get.cc:1092
 #, c-format
 #, c-format
 msgid ""
 msgid ""
 "Package %s is not available, but is referred to by another package.\n"
 "Package %s is not available, but is referred to by another package.\n"
@@ -828,79 +828,97 @@ msgid ""
 "is only available from another source\n"
 "is only available from another source\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1110
+#: cmdline/apt-get.cc:1111
 msgid "However the following packages replace it:"
 msgid "However the following packages replace it:"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1113
+#: cmdline/apt-get.cc:1114
 #, c-format
 #, c-format
 msgid "Package %s has no installation candidate"
 msgid "Package %s has no installation candidate"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1133
+#: cmdline/apt-get.cc:1134
 #, c-format
 #, c-format
 msgid "Reinstallation of %s is not possible, it cannot be downloaded.\n"
 msgid "Reinstallation of %s is not possible, it cannot be downloaded.\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1141
+#: cmdline/apt-get.cc:1142
 #, c-format
 #, c-format
 msgid "%s is already the newest version.\n"
 msgid "%s is already the newest version.\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1168
+#: cmdline/apt-get.cc:1169
 #, c-format
 #, c-format
 msgid "Release '%s' for '%s' was not found"
 msgid "Release '%s' for '%s' was not found"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1170
+#: cmdline/apt-get.cc:1171
 #, c-format
 #, c-format
 msgid "Version '%s' for '%s' was not found"
 msgid "Version '%s' for '%s' was not found"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1176
+#: cmdline/apt-get.cc:1177
 #, c-format
 #, c-format
 msgid "Selected version %s (%s) for %s\n"
 msgid "Selected version %s (%s) for %s\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1313
+#: cmdline/apt-get.cc:1314
 msgid "The update command takes no arguments"
 msgid "The update command takes no arguments"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1326
+#: cmdline/apt-get.cc:1327
 msgid "Unable to lock the list directory"
 msgid "Unable to lock the list directory"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1384
+#: cmdline/apt-get.cc:1385
 msgid ""
 msgid ""
 "Some index files failed to download, they have been ignored, or old ones "
 "Some index files failed to download, they have been ignored, or old ones "
 "used instead."
 "used instead."
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1403
+#: cmdline/apt-get.cc:1399
+msgid "We are not supposed to delete stuff, can't start AutoRemover"
+msgstr ""
+
+#: cmdline/apt-get.cc:1424
+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:1427 cmdline/apt-get.cc:1626
+msgid "The following information may help to resolve the situation:"
+msgstr ""
+
+#: cmdline/apt-get.cc:1431
+msgid "Internal Error, AutoRemover broke stuff"
+msgstr ""
+
+#: cmdline/apt-get.cc:1450
 msgid "Internal error, AllUpgrade broke stuff"
 msgid "Internal error, AllUpgrade broke stuff"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1493 cmdline/apt-get.cc:1529
+#: cmdline/apt-get.cc:1545 cmdline/apt-get.cc:1581
 #, c-format
 #, c-format
 msgid "Couldn't find package %s"
 msgid "Couldn't find package %s"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1516
+#: cmdline/apt-get.cc:1568
 #, c-format
 #, c-format
 msgid "Note, selecting %s for regex '%s'\n"
 msgid "Note, selecting %s for regex '%s'\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1546
+#: cmdline/apt-get.cc:1598
 msgid "You might want to run `apt-get -f install' to correct these:"
 msgid "You might want to run `apt-get -f install' to correct these:"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1549
+#: cmdline/apt-get.cc:1601
 msgid ""
 msgid ""
 "Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a "
 "Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a "
 "solution)."
 "solution)."
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1561
+#: cmdline/apt-get.cc:1613
 msgid ""
 msgid ""
 "Some packages could not be installed. This may mean that you have\n"
 "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"
 "requested an impossible situation or if you are using the unstable\n"
@@ -908,163 +926,159 @@ msgid ""
 "or been moved out of Incoming."
 "or been moved out of Incoming."
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1569
+#: cmdline/apt-get.cc:1621
 msgid ""
 msgid ""
 "Since you only requested a single operation it is extremely likely that\n"
 "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"
 "the package is simply not installable and a bug report against\n"
 "that package should be filed."
 "that package should be filed."
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1574
-msgid "The following information may help to resolve the situation:"
-msgstr ""
-
-#: cmdline/apt-get.cc:1577
+#: cmdline/apt-get.cc:1629
 msgid "Broken packages"
 msgid "Broken packages"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1603
+#: cmdline/apt-get.cc:1660
 msgid "The following extra packages will be installed:"
 msgid "The following extra packages will be installed:"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1674
+#: cmdline/apt-get.cc:1731
 msgid "Suggested packages:"
 msgid "Suggested packages:"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1675
+#: cmdline/apt-get.cc:1732
 msgid "Recommended packages:"
 msgid "Recommended packages:"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1695
+#: cmdline/apt-get.cc:1752
 msgid "Calculating upgrade... "
 msgid "Calculating upgrade... "
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1698 methods/ftp.cc:702 methods/connect.cc:101
+#: cmdline/apt-get.cc:1755 methods/ftp.cc:702 methods/connect.cc:101
 msgid "Failed"
 msgid "Failed"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1703
+#: cmdline/apt-get.cc:1760
 msgid "Done"
 msgid "Done"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1768 cmdline/apt-get.cc:1776
+#: cmdline/apt-get.cc:1825 cmdline/apt-get.cc:1833
 msgid "Internal error, problem resolver broke stuff"
 msgid "Internal error, problem resolver broke stuff"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1876
+#: cmdline/apt-get.cc:1933
 msgid "Must specify at least one package to fetch source for"
 msgid "Must specify at least one package to fetch source for"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1906 cmdline/apt-get.cc:2135
+#: cmdline/apt-get.cc:1963 cmdline/apt-get.cc:2192
 #, c-format
 #, c-format
 msgid "Unable to find a source package for %s"
 msgid "Unable to find a source package for %s"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1950
+#: cmdline/apt-get.cc:2007
 #, c-format
 #, c-format
 msgid "Skipping already downloaded file '%s'\n"
 msgid "Skipping already downloaded file '%s'\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1974
+#: cmdline/apt-get.cc:2031
 #, c-format
 #, c-format
 msgid "You don't have enough free space in %s"
 msgid "You don't have enough free space in %s"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1979
+#: cmdline/apt-get.cc:2036
 #, c-format
 #, c-format
 msgid "Need to get %sB/%sB of source archives.\n"
 msgid "Need to get %sB/%sB of source archives.\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1982
+#: cmdline/apt-get.cc:2039
 #, c-format
 #, c-format
 msgid "Need to get %sB of source archives.\n"
 msgid "Need to get %sB of source archives.\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:1988
+#: cmdline/apt-get.cc:2045
 #, c-format
 #, c-format
 msgid "Fetch source %s\n"
 msgid "Fetch source %s\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:2019
+#: cmdline/apt-get.cc:2076
 msgid "Failed to fetch some archives."
 msgid "Failed to fetch some archives."
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:2047
+#: cmdline/apt-get.cc:2104
 #, c-format
 #, c-format
 msgid "Skipping unpack of already unpacked source in %s\n"
 msgid "Skipping unpack of already unpacked source in %s\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:2059
+#: cmdline/apt-get.cc:2116
 #, c-format
 #, c-format
 msgid "Unpack command '%s' failed.\n"
 msgid "Unpack command '%s' failed.\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:2060
+#: cmdline/apt-get.cc:2117
 #, c-format
 #, c-format
 msgid "Check if the 'dpkg-dev' package is installed.\n"
 msgid "Check if the 'dpkg-dev' package is installed.\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:2077
+#: cmdline/apt-get.cc:2134
 #, c-format
 #, c-format
 msgid "Build command '%s' failed.\n"
 msgid "Build command '%s' failed.\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:2096
+#: cmdline/apt-get.cc:2153
 msgid "Child process failed"
 msgid "Child process failed"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:2112
+#: cmdline/apt-get.cc:2169
 msgid "Must specify at least one package to check builddeps for"
 msgid "Must specify at least one package to check builddeps for"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:2140
+#: cmdline/apt-get.cc:2197
 #, c-format
 #, c-format
 msgid "Unable to get build-dependency information for %s"
 msgid "Unable to get build-dependency information for %s"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:2160
+#: cmdline/apt-get.cc:2217
 #, c-format
 #, c-format
 msgid "%s has no build depends.\n"
 msgid "%s has no build depends.\n"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:2212
+#: cmdline/apt-get.cc:2269
 #, c-format
 #, c-format
 msgid ""
 msgid ""
 "%s dependency for %s cannot be satisfied because the package %s cannot be "
 "%s dependency for %s cannot be satisfied because the package %s cannot be "
 "found"
 "found"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:2264
+#: cmdline/apt-get.cc:2321
 #, c-format
 #, c-format
 msgid ""
 msgid ""
 "%s dependency for %s cannot be satisfied because no available versions of "
 "%s dependency for %s cannot be satisfied because no available versions of "
 "package %s can satisfy version requirements"
 "package %s can satisfy version requirements"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:2299
+#: cmdline/apt-get.cc:2356
 #, c-format
 #, c-format
 msgid "Failed to satisfy %s dependency for %s: Installed package %s is too new"
 msgid "Failed to satisfy %s dependency for %s: Installed package %s is too new"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:2324
+#: cmdline/apt-get.cc:2381
 #, c-format
 #, c-format
 msgid "Failed to satisfy %s dependency for %s: %s"
 msgid "Failed to satisfy %s dependency for %s: %s"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:2338
+#: cmdline/apt-get.cc:2395
 #, c-format
 #, c-format
 msgid "Build-dependencies for %s could not be satisfied."
 msgid "Build-dependencies for %s could not be satisfied."
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:2342
+#: cmdline/apt-get.cc:2399
 msgid "Failed to process build dependencies"
 msgid "Failed to process build dependencies"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:2374
+#: cmdline/apt-get.cc:2431
 msgid "Supported modules:"
 msgid "Supported modules:"
 msgstr ""
 msgstr ""
 
 
-#: cmdline/apt-get.cc:2415
+#: cmdline/apt-get.cc:2472
 msgid ""
 msgid ""
 "Usage: apt-get [options] command\n"
 "Usage: apt-get [options] command\n"
 "       apt-get [options] install|remove pkg1 [pkg2 ...]\n"
 "       apt-get [options] install|remove pkg1 [pkg2 ...]\n"
@@ -1349,9 +1363,9 @@ msgid "The info and temp directories need to be on the same filesystem"
 msgstr ""
 msgstr ""
 
 
 #. Build the status cache
 #. Build the status cache
-#: apt-inst/deb/dpkgdb.cc:139 apt-pkg/pkgcachegen.cc:643
-#: apt-pkg/pkgcachegen.cc:712 apt-pkg/pkgcachegen.cc:717
-#: apt-pkg/pkgcachegen.cc:840
+#: apt-inst/deb/dpkgdb.cc:139 apt-pkg/pkgcachegen.cc:645
+#: apt-pkg/pkgcachegen.cc:714 apt-pkg/pkgcachegen.cc:719
+#: apt-pkg/pkgcachegen.cc:842
 msgid "Reading package lists"
 msgid "Reading package lists"
 msgstr ""
 msgstr ""
 
 
@@ -1544,7 +1558,7 @@ msgstr ""
 msgid "Server closed the connection"
 msgid "Server closed the connection"
 msgstr ""
 msgstr ""
 
 
-#: methods/ftp.cc:338 apt-pkg/contrib/fileutl.cc:471 methods/rsh.cc:190
+#: methods/ftp.cc:338 methods/rsh.cc:190 apt-pkg/contrib/fileutl.cc:471
 msgid "Read error"
 msgid "Read error"
 msgstr ""
 msgstr ""
 
 
@@ -1556,7 +1570,7 @@ msgstr ""
 msgid "Protocol corruption"
 msgid "Protocol corruption"
 msgstr ""
 msgstr ""
 
 
-#: methods/ftp.cc:446 apt-pkg/contrib/fileutl.cc:510 methods/rsh.cc:232
+#: methods/ftp.cc:446 methods/rsh.cc:232 apt-pkg/contrib/fileutl.cc:510
 msgid "Write error"
 msgid "Write error"
 msgstr ""
 msgstr ""
 
 
@@ -1814,6 +1828,10 @@ msgstr ""
 msgid "Internal error"
 msgid "Internal error"
 msgstr ""
 msgstr ""
 
 
+#: methods/rsh.cc:330
+msgid "Connection closed prematurely"
+msgstr ""
+
 #: apt-pkg/contrib/mmap.cc:82
 #: apt-pkg/contrib/mmap.cc:82
 msgid "Can't mmap an empty file"
 msgid "Can't mmap an empty file"
 msgstr ""
 msgstr ""
@@ -2089,24 +2107,38 @@ msgstr ""
 msgid "extra"
 msgid "extra"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/depcache.cc:61 apt-pkg/depcache.cc:90
+#: apt-pkg/depcache.cc:101 apt-pkg/depcache.cc:130
 msgid "Building dependency tree"
 msgid "Building dependency tree"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/depcache.cc:62
+#: apt-pkg/depcache.cc:102
 msgid "Candidate versions"
 msgid "Candidate versions"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/depcache.cc:91
+#: apt-pkg/depcache.cc:131
 msgid "Dependency generation"
 msgid "Dependency generation"
 msgstr ""
 msgstr ""
 
 
+#: apt-pkg/depcache.cc:152 apt-pkg/depcache.cc:171 apt-pkg/depcache.cc:175
+msgid "Reading state information"
+msgstr ""
+
+#: apt-pkg/depcache.cc:190
+#, c-format
+msgid "Failed to open StateFile %s"
+msgstr ""
+
+#: apt-pkg/depcache.cc:196
+#, c-format
+msgid "Failed to write temporary StateFile %s"
+msgstr ""
+
 #: apt-pkg/tagfile.cc:72
 #: apt-pkg/tagfile.cc:72
 #, c-format
 #, c-format
 msgid "Unable to parse package file %s (1)"
 msgid "Unable to parse package file %s (1)"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/tagfile.cc:102
+#: apt-pkg/tagfile.cc:103
 #, c-format
 #, c-format
 msgid "Unable to parse package file %s (2)"
 msgid "Unable to parse package file %s (2)"
 msgstr ""
 msgstr ""
@@ -2174,19 +2206,19 @@ msgstr ""
 msgid "Index file type '%s' is not supported"
 msgid "Index file type '%s' is not supported"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/algorithms.cc:241
+#: apt-pkg/algorithms.cc:245
 #, c-format
 #, c-format
 msgid ""
 msgid ""
 "The package %s needs to be reinstalled, but I can't find an archive for it."
 "The package %s needs to be reinstalled, but I can't find an archive for it."
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/algorithms.cc:1059
+#: apt-pkg/algorithms.cc:1075
 msgid ""
 msgid ""
 "Error, pkgProblemResolver::Resolve generated breaks, this may be caused by "
 "Error, pkgProblemResolver::Resolve generated breaks, this may be caused by "
 "held packages."
 "held packages."
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/algorithms.cc:1061
+#: apt-pkg/algorithms.cc:1077
 msgid "Unable to correct problems, you have held broken packages."
 msgid "Unable to correct problems, you have held broken packages."
 msgstr ""
 msgstr ""
 
 
@@ -2266,82 +2298,82 @@ msgstr ""
 msgid "No priority (or zero) specified for pin"
 msgid "No priority (or zero) specified for pin"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/pkgcachegen.cc:74
+#: apt-pkg/pkgcachegen.cc:76
 msgid "Cache has an incompatible versioning system"
 msgid "Cache has an incompatible versioning system"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/pkgcachegen.cc:117
+#: apt-pkg/pkgcachegen.cc:119
 #, c-format
 #, c-format
 msgid "Error occurred while processing %s (NewPackage)"
 msgid "Error occurred while processing %s (NewPackage)"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/pkgcachegen.cc:129
+#: apt-pkg/pkgcachegen.cc:131
 #, c-format
 #, c-format
 msgid "Error occurred while processing %s (UsePackage1)"
 msgid "Error occurred while processing %s (UsePackage1)"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/pkgcachegen.cc:150
+#: apt-pkg/pkgcachegen.cc:152
 #, c-format
 #, c-format
 msgid "Error occurred while processing %s (UsePackage2)"
 msgid "Error occurred while processing %s (UsePackage2)"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/pkgcachegen.cc:154
+#: apt-pkg/pkgcachegen.cc:156
 #, c-format
 #, c-format
 msgid "Error occurred while processing %s (NewFileVer1)"
 msgid "Error occurred while processing %s (NewFileVer1)"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/pkgcachegen.cc:184
+#: apt-pkg/pkgcachegen.cc:186
 #, c-format
 #, c-format
 msgid "Error occurred while processing %s (NewVersion1)"
 msgid "Error occurred while processing %s (NewVersion1)"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/pkgcachegen.cc:188
+#: apt-pkg/pkgcachegen.cc:190
 #, c-format
 #, c-format
 msgid "Error occurred while processing %s (UsePackage3)"
 msgid "Error occurred while processing %s (UsePackage3)"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/pkgcachegen.cc:192
+#: apt-pkg/pkgcachegen.cc:194
 #, c-format
 #, c-format
 msgid "Error occurred while processing %s (NewVersion2)"
 msgid "Error occurred while processing %s (NewVersion2)"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/pkgcachegen.cc:207
+#: apt-pkg/pkgcachegen.cc:209
 msgid "Wow, you exceeded the number of package names this APT is capable of."
 msgid "Wow, you exceeded the number of package names this APT is capable of."
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/pkgcachegen.cc:210
+#: apt-pkg/pkgcachegen.cc:212
 msgid "Wow, you exceeded the number of versions this APT is capable of."
 msgid "Wow, you exceeded the number of versions this APT is capable of."
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/pkgcachegen.cc:213
+#: apt-pkg/pkgcachegen.cc:215
 msgid "Wow, you exceeded the number of dependencies this APT is capable of."
 msgid "Wow, you exceeded the number of dependencies this APT is capable of."
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/pkgcachegen.cc:241
+#: apt-pkg/pkgcachegen.cc:243
 #, c-format
 #, c-format
 msgid "Error occurred while processing %s (FindPkg)"
 msgid "Error occurred while processing %s (FindPkg)"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/pkgcachegen.cc:254
+#: apt-pkg/pkgcachegen.cc:256
 #, c-format
 #, c-format
 msgid "Error occurred while processing %s (CollectFileProvides)"
 msgid "Error occurred while processing %s (CollectFileProvides)"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/pkgcachegen.cc:260
+#: apt-pkg/pkgcachegen.cc:262
 #, c-format
 #, c-format
 msgid "Package %s %s was not found while processing file dependencies"
 msgid "Package %s %s was not found while processing file dependencies"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/pkgcachegen.cc:574
+#: apt-pkg/pkgcachegen.cc:576
 #, c-format
 #, c-format
 msgid "Couldn't stat source package list %s"
 msgid "Couldn't stat source package list %s"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/pkgcachegen.cc:658
+#: apt-pkg/pkgcachegen.cc:660
 msgid "Collecting File Provides"
 msgid "Collecting File Provides"
 msgstr ""
 msgstr ""
 
 
-#: apt-pkg/pkgcachegen.cc:785 apt-pkg/pkgcachegen.cc:792
+#: apt-pkg/pkgcachegen.cc:787 apt-pkg/pkgcachegen.cc:794
 msgid "IO Error saving source cache"
 msgid "IO Error saving source cache"
 msgstr ""
 msgstr ""
 
 
@@ -2526,7 +2558,3 @@ msgstr ""
 #, c-format
 #, c-format
 msgid "Completely removed %s"
 msgid "Completely removed %s"
 msgstr ""
 msgstr ""
-
-#: methods/rsh.cc:330
-msgid "Connection closed prematurely"
-msgstr ""

BIN
share/debian-archive.gpg