From: Michael Schroeder Date: Tue, 22 Jul 2008 13:21:43 +0000 (+0000) Subject: - resolve job rules before installing system packages [#411086] X-Git-Tag: BASE-SuSE-Code-12_1-Branch~308^2~294 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ae05cb01e3c4f08d3c4e1166ea2f0e8f98afb0b4;p=thirdparty%2Flibsolv.git - resolve job rules before installing system packages [#411086] --- diff --git a/src/solver.c b/src/solver.c index 545ee1d9..c8866b44 100644 --- a/src/solver.c +++ b/src/solver.c @@ -2350,6 +2350,60 @@ run_solver(Solver *solv, int disablerules, int doweak) } } + if (level < systemlevel) + { + POOL_DEBUG(SAT_DEBUG_STATS, "resolving job rules\n"); + for (i = solv->jobrules, r = solv->rules + i; i < solv->jobrules_end; i++, r++) + { + Id l; + if (r->d < 0) /* ignore disabled rules */ + continue; + queue_empty(&dq); + FOR_RULELITERALS(l, dp, r) + { + if (l < 0) + { + if (solv->decisionmap[-l] <= 0) + break; + } + else + { + if (solv->decisionmap[l] > 0) + break; + if (solv->decisionmap[l] == 0) + queue_push(&dq, l); + } + } + if (l || !dq.count) + continue; + if (!solv->updatesystem && solv->installed && dq.count > 1) + { + int j, k; + for (j = k = 0; j < dq.count; j++) + { + Solvable *s = pool->solvables + dq.elements[j]; + if (s->repo == solv->installed) + dq.elements[k++] = dq.elements[j]; + } + if (k) + dq.count = k; + } + olevel = level; + level = selectandinstall(solv, level, &dq, 0, disablerules); + if (level == 0) + { + queue_free(&dq); + return; + } + if (level <= olevel) + break; + } + systemlevel = level + 1; + if (i < solv->jobrules_end) + continue; + } + + /* * installed packages */ @@ -2457,11 +2511,14 @@ run_solver(Solver *solv, int disablerules, int doweak) if (level <= olevel) break; } + systemlevel = level + 1; if (i < solv->installed->end) continue; - systemlevel = level; } + if (level < systemlevel) + systemlevel = level; + /* * decide */