- fix cleandeps mistake handling
authorMichael Schroeder <mls@suse.de>
Wed, 29 Feb 2012 15:02:40 +0000 (16:02 +0100)
committerMichael Schroeder <mls@suse.de>
Wed, 29 Feb 2012 15:02:40 +0000 (16:02 +0100)
src/rules.c
src/rules.h
src/solver.c

index e7ea9fa..335b01e 100644 (file)
@@ -1730,6 +1730,38 @@ solver_reenablepolicyrules(Solver *solv, int jobidx)
   queue_free(&q);
 }
 
+/* we just removed a package from the cleandeps map, now reenable all policy rules that were
+ * disabled because of this */
+void
+solver_reenablepolicyrules_cleandeps(Solver *solv, Id pkg)
+{
+  Queue *job = &solv->job;
+  int i, j;
+  Queue allq;
+  Rule *r;
+  Id lastjob = -1;
+  Id allqbuf[128];
+
+  queue_init_buffer(&allq, allqbuf, sizeof(allqbuf)/sizeof(*allqbuf));
+  for (i = solv->jobrules; i < solv->jobrules_end; i++)
+    {
+      r = solv->rules + i;
+      if (r->d < 0)    /* disabled? */
+       continue;
+      j = solv->ruletojob.elements[i - solv->jobrules];
+      if (j == lastjob)
+       continue;
+      lastjob = j;
+      jobtodisablelist(solv, job->elements[j], job->elements[j + 1], &allq);
+    }
+  for (i = 0; i < allq.count; i += 2)
+    if (allq.elements[i] == DISABLE_UPDATE && allq.elements[i + 1] == pkg)
+      break;
+  if (i == allq.count)
+    reenableupdaterule(solv, pkg);
+  queue_free(&allq);
+}
+
 
 /***********************************************************************
  ***
index 43a1786..a7ba790 100644 (file)
@@ -121,6 +121,7 @@ extern void solver_disablechoicerules(struct _Solver *solv, Rule *r);
 /* policy rule disabling/reenabling */
 extern void solver_disablepolicyrules(struct _Solver *solv);
 extern void solver_reenablepolicyrules(struct _Solver *solv, int jobidx);
+extern void solver_reenablepolicyrules_cleandeps(struct _Solver *solv, Id pkg);
 
 /* rule info */
 extern int solver_allruleinfos(struct _Solver *solv, Id rid, Queue *rq);
index 667190a..5e6081e 100644 (file)
@@ -1478,6 +1478,7 @@ cleandeps_check_mistakes(Solver *solv, int level)
                    }
                  queue_push(solv->cleandeps_mistakes, i);
                  MAPCLR(&solv->cleandepsmap, i - solv->installed->start);
+                 solver_reenablepolicyrules_cleandeps(solv, i);
                  mademistake = 1;
                }
            }
@@ -1486,7 +1487,7 @@ cleandeps_check_mistakes(Solver *solv, int level)
   if (mademistake)
     {
       level = 1;
-      revert(solv, level);
+      solver_reset(solv);
     }
   return level;
 }