瀏覽代碼

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 年之前
父節點
當前提交
940f21606b
共有 1 個文件被更改,包括 11 次插入8 次删除
  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)