]> git.saurik.com Git - apt.git/commitdiff
Remove and Unpack operations should not be ignored for pseudo packages -
authorDavid Kalnischkies <kalnischkies@gmail.com>
Mon, 1 Mar 2010 14:27:55 +0000 (15:27 +0100)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Mon, 1 Mar 2010 14:27:55 +0000 (15:27 +0100)
they should trigger the remove/unpack of the "all" package.
Otherwise - as this package has no dependencies - it will be triggered
to late. The Configuration step doesn't need it as the "all" package is
a dependency of the pseudo-package, so it will be configured before
the pseudo packages are tried: So at this step the ignorance is okay.

Also IsMissing() should report the status of the all package if an
pseudo package is checked instead of always reporting no-miss.

apt-pkg/orderlist.cc
apt-pkg/packagemanager.cc

index 2e7618b5582f0d2f7e9c2ed564f33a7b1edcb913..7c950292ace11ed299290451cf33a816e800c048 100644 (file)
@@ -127,8 +127,9 @@ bool pkgOrderList::IsMissing(PkgIterator Pkg)
    if (FileList[Pkg->ID].empty() == false)
       return false;
 
+   // Missing Pseudo packages are missing if the real package is missing
    if (pkgCache::VerIterator(Cache, Cache[Pkg].CandidateVer).Pseudo() == true)
-      return false;
+      return IsMissing(Pkg.Group().FindPkg("all"));
 
    return true;
 }
@@ -203,7 +204,7 @@ bool pkgOrderList::OrderCritical()
       {
         PkgIterator P(Cache,*I);
         if (IsNow(P) == true)
-           clog << "  " << P.Name() << ' ' << IsMissing(P) << ',' << IsFlag(P,After) << endl;
+           clog << "  " << P.FullName() << ' ' << IsMissing(P) << ',' << IsFlag(P,After) << endl;
       }
    }
 
@@ -276,7 +277,7 @@ bool pkgOrderList::OrderUnpack(string *FileList)
       {
         PkgIterator P(Cache,*I);
         if (IsNow(P) == true)
-           clog << "  " << P.Name() << ' ' << IsMissing(P) << ',' << IsFlag(P,After) << endl;
+           clog << "  " << P.FullName() << ' ' << IsMissing(P) << ',' << IsFlag(P,After) << endl;
       }
    }
 
@@ -547,7 +548,7 @@ bool pkgOrderList::VisitNode(PkgIterator Pkg)
    if (Debug == true)
    {
       for (int j = 0; j != Depth; j++) clog << ' ';
-      clog << "Visit " << Pkg.Name() << endl;
+      clog << "Visit " << Pkg.FullName() << endl;
    }
    
    Depth++;
@@ -606,7 +607,7 @@ bool pkgOrderList::VisitNode(PkgIterator Pkg)
    if (Debug == true)
    {
       for (int j = 0; j != Depth; j++) clog << ' ';
-      clog << "Leave " << Pkg.Name() << ' ' << IsFlag(Pkg,Added) << ',' << IsFlag(Pkg,AddPending) << endl;
+      clog << "Leave " << Pkg.FullName() << ' ' << IsFlag(Pkg,Added) << ',' << IsFlag(Pkg,AddPending) << endl;
    }
    
    return true;
index db882721e800f2d00c7db0da928bf82b15937dc3..35cc245509e24c34d7e54ecb106dbf1be3886bcc 100644 (file)
@@ -470,6 +470,8 @@ bool pkgPackageManager::SmartRemove(PkgIterator Pkg)
 
    if (pkgCache::VerIterator(Cache, Cache[Pkg].CandidateVer).Pseudo() == false)
       return Remove(Pkg,(Cache[Pkg].iFlags & pkgDepCache::Purge) == pkgDepCache::Purge);
+   else
+      return SmartRemove(Pkg.Group().FindPkg("all"));
    return true;
 }
                                                                        /*}}}*/
@@ -584,11 +586,14 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg)
    for (PrvIterator P = Cache[Pkg].InstVerIter(Cache).ProvidesList(); 
        P.end() == false; P++)
       CheckRConflicts(Pkg,P.ParentPkg().RevDependsList(),P.ProvideVersion());
-   
-   if (pkgCache::VerIterator(Cache, Cache[Pkg].CandidateVer).Pseudo() == false &&
-       Install(Pkg,FileNames[Pkg->ID]) == false)
+
+   if (pkgCache::VerIterator(Cache, Cache[Pkg].CandidateVer).Pseudo() == false)
+   {
+      if(Install(Pkg,FileNames[Pkg->ID]) == false)
+         return false;
+   } else if (SmartUnPack(Pkg.Group().FindPkg("all")) == false)
       return false;
-   
+
    List->Flag(Pkg,pkgOrderList::UnPacked,pkgOrderList::States);
    
    // Perform immedate configuration of the package.