[Aptitude-devel] r3080 - in branches/aptitude-0.3/aptitude: . src/generic

Daniel Burrows dburrows@costa.debian.org
Sat, 23 Apr 2005 18:12:35 +0000


Author: dburrows
Date: Sat Apr 23 18:12:32 2005
New Revision: 3080

Modified:
   branches/aptitude-0.3/aptitude/ChangeLog
   branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver.h
Log:
Make the conversion layer's reverse dep iterator *actually* go through
provides instead of just saying it does.

Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog	(original)
+++ branches/aptitude-0.3/aptitude/ChangeLog	Sat Apr 23 18:12:32 2005
@@ -2,6 +2,11 @@
 
 	* src/generic/aptitude_resolver.h:
 
+	  Fix a silly logic error in the revdep_iterator that caused
+	  reverse dependencies through Provides: to not be considered.
+
+	* src/generic/aptitude_resolver.h:
+
 	  Don't generate inapplicable revdeps, even if they're the first
 	  item in the list.
 

Modified: branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver.h	(original)
+++ branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver.h	Sat Apr 23 18:12:32 2005
@@ -336,19 +336,29 @@
 	  (!dep_lst.IsCritical() || !applicable()))
       ++dep_lst;
 
-    // When we've run out of provides, give up..
-    while(dep_lst.end() && !prv_lst.end())
+    if(dep_lst.end() && !provides_open)
       {
-	if(!provides_open)
+	assert(prv_lst.end());
+	prv_lst=ver.ProvidesList();
+	if(!prv_lst.end())
 	  {
-	    provides_open=true;
-	    prv_lst=ver.ProvidesList();
+	    dep_lst=prv_lst.ParentPkg().RevDependsList();
+	    while(!dep_lst.end() &&
+		  (!dep_lst.IsCritical() || !applicable()))
+	      ++dep_lst;
 	  }
-	else
-	  ++prv_lst;
+	provides_open=true;
+      }
+
+    // When we've run out of provides, give up..
+    while(dep_lst.end() && !prv_lst.end())
+      {
+	assert(provides_open);
+	++prv_lst;
 
 	if(!prv_lst.end())
 	  {
+	    assert(!prv_lst.ParentPkg().end());
 	    dep_lst=prv_lst.ParentPkg().RevDependsList();
 
 	    while(!dep_lst.end() &&
@@ -391,6 +401,10 @@
     // but those are handled in the usual way).
     if(!v.end())
       dep_lst=v.ParentPkg().RevDependsList();
+    else
+      // Immediately flag this as an end iterator, and avoid crashing
+      // in normalize() when we look at v.ProvidesList().
+      provides_open=true;
     normalize();
   }