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

* apt-pkg/packagemanager.{cc,h}:
- propergate the Immediate flag to make hitting the
"E: Internal Error, Could not perform immediate configuration (2)"
harder

Michael Vogt лет назад: 18
Родитель
Сommit
3a6d37fdcf
3 измененных файлов с 46 добавлено и 12 удалено
  1. 41 12
      apt-pkg/packagemanager.cc
  2. 1 0
      apt-pkg/packagemanager.h
  3. 4 0
      debian/changelog

+ 41 - 12
apt-pkg/packagemanager.cc

@@ -118,6 +118,41 @@ bool pkgPackageManager::FixMissing()
 }
 									/*}}}*/
 
+// PM::ImmediateAdd - Add the immediate flag recursivly			/*{{{*/
+// ---------------------------------------------------------------------
+/* This adds the immediate flag to the pkg and recursively to the
+   dependendies 
+ */
+void pkgPackageManager::ImmediateAdd(PkgIterator I, bool UseInstallVer)
+{
+   DepIterator D;
+   
+   if(UseInstallVer)
+   {
+      if(Cache[I].InstallVer == 0)
+	 return;
+      D = Cache[I].InstVerIter(Cache).DependsList(); 
+   } else {
+      if (I->CurrentVer == 0)
+	 return;
+      D = I.CurrentVer().DependsList(); 
+   }
+
+   for ( /* nothing */  ; D.end() == false; D++)
+      if (D->Type == pkgCache::Dep::Depends || D->Type == pkgCache::Dep::PreDepends)
+      {
+	 if(!List->IsFlag(D.TargetPkg(), pkgOrderList::Immediate))
+	 {
+	    if(Debug)
+	       clog << "ImmediateAdd(): Adding Immediate flag to " << I.Name() << endl;
+	    List->Flag(D.TargetPkg(),pkgOrderList::Immediate);
+	    ImmediateAdd(D.TargetPkg(), UseInstallVer);
+	 }
+      }
+   return;
+}
+									/*}}}*/
+
 // PM::CreateOrderList - Create the ordering class			/*{{{*/
 // ---------------------------------------------------------------------
 /* This populates the ordering list with all the packages that are
@@ -144,21 +179,15 @@ bool pkgPackageManager::CreateOrderList()
 	   (I->Flags & pkgCache::Flag::Important) == pkgCache::Flag::Important) &&
 	  NoImmConfigure == false)
       {
+	 if(Debug)
+	    clog << "CreateOrderList(): Adding Immediate flag for " << I.Name() << endl;
 	 List->Flag(I,pkgOrderList::Immediate);
-	 
-	 // Look for other packages to make immediate configurea
-	 if (Cache[I].InstallVer != 0)
-	    for (DepIterator D = Cache[I].InstVerIter(Cache).DependsList(); 
-		 D.end() == false; D++)
-	       if (D->Type == pkgCache::Dep::Depends || D->Type == pkgCache::Dep::PreDepends)
-		  List->Flag(D.TargetPkg(),pkgOrderList::Immediate);
+
+	 // Look for other install packages to make immediate configurea
+	 ImmediateAdd(I, true);
 	 
 	 // And again with the current version.
-	 if (I->CurrentVer != 0)
-	    for (DepIterator D = I.CurrentVer().DependsList(); 
-		 D.end() == false; D++)
-	       if (D->Type == pkgCache::Dep::Depends || D->Type == pkgCache::Dep::PreDepends)
-		  List->Flag(D.TargetPkg(),pkgOrderList::Immediate);
+	 ImmediateAdd(I, false);
       }
       
       // Not interesting

+ 1 - 0
apt-pkg/packagemanager.h

@@ -49,6 +49,7 @@ class pkgPackageManager : protected pkgCache::Namespace
    bool Debug;
          
    bool DepAdd(pkgOrderList &Order,PkgIterator P,int Depth = 0);
+   void ImmediateAdd(PkgIterator P, bool UseInstallVer);
    virtual OrderResult OrderInstall();
    bool CheckRConflicts(PkgIterator Pkg,DepIterator Dep,const char *Ver);
    bool CreateOrderList();

+ 4 - 0
debian/changelog

@@ -43,6 +43,10 @@ apt (0.7.10) UNRELEASED; urgency=low
   * apt-pkg/acquire-item.{cc,h}:
     - make the authentication download code more robust against
       servers/proxies with broken If-Range implementations
+  * apt-pkg/packagemanager.{cc,h}:
+    - propergate the Immediate flag to make hitting the 
+      "E: Internal Error, Could not perform immediate configuration (2)"
+      harder
 
   [ Chris Cheney ]
   * ftparchive/contents.cc: