Przeglądaj źródła

Applied DonKult (David)'s excellent fix for inproving the loop management. Now both SmartConfigure and SmartUnPack can be
called mutiple times on the same package, this is to make sure that when loops are broken all packages that are required
are kept in the same dpkg run.

Christopher Baines 15 lat temu
rodzic
commit
940f21606b
1 zmienionych plików z 11 dodań i 8 usunięć
  1. 11 8
      apt-pkg/packagemanager.cc

+ 11 - 8
apt-pkg/packagemanager.cc

@@ -536,14 +536,11 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate)
    if (Pkg.State() == pkgCache::PkgIterator::NeedsConfigure &&
        Cache[Pkg].Keep() == true)
    {
-      List->Flag(Pkg,pkgOrderList::UnPacked,pkgOrderList::States);
-      if (Immediate == true &&
-	  List->IsFlag(Pkg,pkgOrderList::Immediate) == true)
-	 if (SmartConfigure(Pkg) == false)
-	    _error->Warning(_("Could not perform immediate configuration on already unpacked '%s'. "
-			"Please see man 5 apt.conf under APT::Immediate-Configure for details."),Pkg.Name());
-      return true;
+      cout << "SmartUnPack called on Package " << Pkg.Name() << " but its unpacked" << endl;
+      return false;
    }
+ 
+   bool PkgLoop = List->IsFlag(Pkg,pkgOrderList::Loop);
    
    VerIterator const instVer = Cache[Pkg].InstVerIter(Cache);
 
@@ -674,7 +671,11 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate)
 	    
 	    // Check if it needs to be unpacked
 	    if (List->IsFlag(BrokenPkg,pkgOrderList::InList) && Cache[BrokenPkg].Delete() == false && 
-	        !List->IsFlag(BrokenPkg,pkgOrderList::Loop) && List->IsNow(BrokenPkg)) {
+	        List->IsNow(BrokenPkg)) {
+	      if (PkgLoop && List->IsFlag(BrokenPkg,pkgOrderList::Loop)) {
+	        // This dependancy has already been dealt with by another SmartUnPack on Pkg
+	        break;
+	      }
               List->Flag(Pkg,pkgOrderList::Loop);
 	      // Found a break, so unpack the package
 	      if (Debug) 
@@ -702,6 +703,8 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate)
 	  P.end() == false; P++)
         CheckRConflicts(Pkg,P.ParentPkg().RevDependsList(),P.ProvideVersion());
 
+   if (PkgLoop) return true;
+
    List->Flag(Pkg,pkgOrderList::UnPacked,pkgOrderList::States);
 
    if (instVer->MultiArch == pkgCache::Version::Same)