From baca23f183939f0d0b68b60179878b14ce89af47 Mon Sep 17 00:00:00 2001 From: Michael Schroeder Date: Wed, 29 Feb 2012 16:02:40 +0100 Subject: [PATCH] - fix cleandeps mistake handling --- src/rules.c | 32 ++++++++++++++++++++++++++++++++ src/rules.h | 1 + src/solver.c | 3 ++- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/rules.c b/src/rules.c index e7ea9fa..335b01e 100644 --- a/src/rules.c +++ b/src/rules.c @@ -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); +} + /*********************************************************************** *** diff --git a/src/rules.h b/src/rules.h index 43a1786..a7ba790 100644 --- a/src/rules.h +++ b/src/rules.h @@ -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); diff --git a/src/solver.c b/src/solver.c index 667190a..5e6081e 100644 --- a/src/solver.c +++ b/src/solver.c @@ -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; } -- 2.7.4