Przeglądaj źródła

Added OR group handling to ResolveByKeep. Fixes 133950
Author: jgg
Date: 2002-04-02 05:55:24 GMT
Added OR group handling to ResolveByKeep. Fixes 133950

Arch Librarian 22 lat temu
rodzic
commit
c5532863dc
1 zmienionych plików z 38 dodań i 41 usunięć
  1. 38 41
      apt-pkg/algorithms.cc

+ 38 - 41
apt-pkg/algorithms.cc

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
-// $Id: algorithms.cc,v 1.38 2002/03/26 07:38:58 jgg Exp $
+// $Id: algorithms.cc,v 1.39 2002/04/02 05:55:24 jgg Exp $
 /* ######################################################################
 
    Algorithms - A set of misc algorithms
@@ -1099,18 +1099,10 @@ bool pkgProblemResolver::ResolveByKeep()
       // Isolate the problem dependencies
       for (pkgCache::DepIterator D = Cache[I].InstVerIter(Cache).DependsList(); D.end() == false;)
       {
-	 // Compute a single dependency element (glob or)
-	 pkgCache::DepIterator Start = D;
-	 pkgCache::DepIterator End = D;
-	 unsigned char State = 0;
-	 for (bool LastOR = true; D.end() == false && LastOR == true; D++)
-	 {
-	    State |= Cache[D];
-	    LastOR = (D->CompareOp & pkgCache::Dep::Or) == pkgCache::Dep::Or;
-	    if (LastOR == true)
-	       End = D;
-	 }
-	 
+	 DepIterator Start;
+	 DepIterator End;
+	 D.GlobOr(Start,End);
+
 	 // We only worry about critical deps.
 	 if (End.IsCritical() != true)
 	    continue;
@@ -1118,42 +1110,47 @@ bool pkgProblemResolver::ResolveByKeep()
 	 // Dep is ok
 	 if ((Cache[End] & pkgDepCache::DepGInstall) == pkgDepCache::DepGInstall)
 	    continue;
-	 
-	 // Hm, the group is broken.. I have no idea how to handle this
-	 if (Start != End)
-	 {
-	    clog << "Note, a broken or group was found in " << I.Name() << "." << endl;
-	    if ((Flags[I->ID] & Protected) == 0)
-	       Cache.MarkKeep(I);
-	    break;
-	 }
-	 
-	 if (Debug == true)
-	    clog << "Package " << I.Name() << " has broken dep on " << End.TargetPkg().Name() << endl;
-	 
-	 // Look at all the possible provides on this package
-	 SPtrArray<pkgCache::Version *> VList = End.AllTargets();
-	 for (pkgCache::Version **V = VList; *V != 0; V++)
+
+	 /* Hm, the group is broken.. I suppose the best thing to do is to
+	    is to try every combination of keep/not-keep for the set, but thats
+	    slow, and this never happens, just be conservative and assume the
+	    list of ors is in preference and keep till it starts to work. */
+	 while (true)
 	 {
-	    pkgCache::VerIterator Ver(Cache,*V);
-	    pkgCache::PkgIterator Pkg = Ver.ParentPkg();
-	    
-	    // It is not keepable
-	    if (Cache[Pkg].InstallVer == 0 || 
-		Pkg->CurrentVer == 0)
-	       continue;
+	    if (Debug == true)
+	       clog << "Package " << I.Name() << " has broken dep on " << Start.TargetPkg().Name() << endl;
 	    
-	    if ((Flags[I->ID] & Protected) == 0)
+	    // Look at all the possible provides on this package
+	    SPtrArray<pkgCache::Version *> VList = Start.AllTargets();
+	    for (pkgCache::Version **V = VList; *V != 0; V++)
 	    {
-	       if (Debug == true)
-		  clog << "  Keeping Package " << Pkg.Name() << " due to dep" << endl;
-	       Cache.MarkKeep(Pkg);
+	       pkgCache::VerIterator Ver(Cache,*V);
+	       pkgCache::PkgIterator Pkg = Ver.ParentPkg();
+	       
+	       // It is not keepable
+	       if (Cache[Pkg].InstallVer == 0 ||
+		   Pkg->CurrentVer == 0)
+		  continue;
+	       
+	       if ((Flags[I->ID] & Protected) == 0)
+	       {
+		  if (Debug == true)
+		     clog << "  Keeping Package " << Pkg.Name() << " due to dep" << endl;
+		  Cache.MarkKeep(Pkg);
+	       }
+	       
+	       if (Cache[I].InstBroken() == false)
+		  break;
 	    }
 	    
 	    if (Cache[I].InstBroken() == false)
 	       break;
-	 }
 
+	    if (Start == End)
+	       break;
+	    Start++;
+	 }
+	      
 	 if (Cache[I].InstBroken() == false)
 	    break;
       }