]> git.saurik.com Git - apt.git/commitdiff
We need to kill also pseudo packages which have no dependency, no
authorDavid Kalnischkies <kalnischkies@gmail.com>
Mon, 1 Mar 2010 20:59:03 +0000 (21:59 +0100)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Mon, 1 Mar 2010 20:59:03 +0000 (21:59 +0100)
installed reverse dependency and which also doesn't provide something.
They cause problems if this pseudo packages get new dependencies.

As a consequence we also need to recheck the dependencies of a killed
pseudo package (and especially the providers of these dependencies)
to really kill all non required packages.

apt-pkg/depcache.cc
apt-pkg/depcache.h

index 45c614c6fe69e431797663a4a787b7642be56ab6..893164ea1c367e761222391622b262c526f124a7 100644 (file)
@@ -630,11 +630,46 @@ bool pkgDepCache::RemovePseudoInstalledPkg(PkgIterator &Pkg, std::set<unsigned l
    if (V->MultiArch != Version::All)
       return false;
 
-   unsigned char const DepState = VersionState(V.DependsList(),DepInstall,DepInstMin,DepInstPolicy);
-   if ((DepState & DepInstMin) == DepInstMin)
+   // Never ever kill an "all" package - they have no dependency so they can't be broken
+   if (strcmp(Pkg.Arch(),"all") == 0)
       return false;
 
-   // Dependencies for this arch all are not statisfied
+// std::cout << "CHECK " << Pkg << std::endl;
+
+   unsigned char const DepState = VersionState(V.DependsList(),DepInstall,DepInstMin,DepInstPolicy);
+   if ((DepState & DepInstMin) == DepInstMin) {
+      // okay, the package isn't broken, but is the package also required?
+      // If it has no real dependencies, no installed rdepends and doesn't
+      // provide something of value, we will kill it as not required.
+      // These pseudopackages have otherwise interesting effects if they get
+      // a new dependency in a newer version…
+      for (pkgCache::DepIterator D = V.DependsList();
+          D.end() != true; ++D)
+        if ((D->Type == pkgCache::Dep::Depends ||
+             D->Type == pkgCache::Dep::PreDepends) &&
+            D.ParentPkg()->Group != Pkg->Group)
+           return false;
+      for (DepIterator D = Pkg.RevDependsList(); D.end() != true; ++D)
+      {
+        if (D->Type != pkgCache::Dep::Depends &&
+            D->Type != pkgCache::Dep::PreDepends)
+           continue;
+        PkgIterator const P = D.ParentPkg();
+        if (P->CurrentVer != 0)
+           return false;
+      }
+      for (PrvIterator Prv = V.ProvidesList(); Prv.end() != true; Prv++)
+        for (DepIterator d = Prv.ParentPkg().RevDependsList();
+             d.end() != true; ++d)
+        {
+           PkgIterator const P = d.ParentPkg();
+           if (P->CurrentVer != 0 &&
+               P->Group != Pkg->Group)
+              return false;
+        }
+   }
+
+   // Dependencies for this arch all package are not statisfied
    // so we installed it only for our convenience: get right of it now.
    RemoveSizes(Pkg);
    RemoveStates(Pkg);
@@ -655,15 +690,33 @@ bool pkgDepCache::RemovePseudoInstalledPkg(PkgIterator &Pkg, std::set<unsigned l
         recheck.insert(P.Index());
    }
 
-   if (V.end() != true)
-      for (PrvIterator Prv = V.ProvidesList(); Prv.end() != true; Prv++)
-        for (DepIterator d = Prv.ParentPkg().RevDependsList();
-             d.end() != true; ++d)
-        {
-           PkgIterator const P = d.ParentPkg();
-           if (P->CurrentVer != 0)
-              recheck.insert(P.Index());
-        }
+   for (DepIterator d = V.DependsList(); d.end() != true; ++d)
+   {
+      PkgIterator const P = d.TargetPkg();
+      for (PrvIterator Prv = P.ProvidesList(); Prv.end() != true; ++Prv)
+      {
+        PkgIterator const O = Prv.OwnerPkg();
+        if (O->CurrentVer != 0)
+           recheck.insert(O.Index());
+      }
+
+      if (P->CurrentVer != 0)
+        recheck.insert(P.Index());
+   }
+
+   for (PrvIterator Prv = V.ProvidesList(); Prv.end() != true; Prv++)
+   {
+      for (DepIterator d = Prv.ParentPkg().RevDependsList();
+          d.end() != true; ++d)
+      {
+        PkgIterator const P = d.ParentPkg();
+        if (P->CurrentVer == 0)
+           continue;
+
+           recheck.insert(P.Index());
+      }
+   }
+
 
    return true;
 }
index 23b29cc13d3f4f6bf2e9157dae0416884ef534ac..ea605f199c709b4a10c76f21e897ccb1e909d60e 100644 (file)
@@ -332,6 +332,7 @@ class pkgDepCache : protected pkgCache::Namespace
    inline operator pkgCache &() {return *Cache;};
    inline Header &Head() {return *Cache->HeaderP;};
    inline PkgIterator PkgBegin() {return Cache->PkgBegin();};
+   inline GrpIterator FindGrp(string const &Name) {return Cache->FindGrp(Name);};
    inline PkgIterator FindPkg(string const &Name) {return Cache->FindPkg(Name);};
    inline PkgIterator FindPkg(string const &Name, string const &Arch) {return Cache->FindPkg(Name, Arch);};