From: Michael Schroeder Date: Wed, 4 Dec 2013 17:41:42 +0000 (+0100) Subject: implement lock-stepping for infarch packages in implicitobsoleteusescolors mode X-Git-Tag: 0.6.4~142 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=047a5a57b2010558426d95064a5b2b0b93c9f8da;p=thirdparty%2Flibsolv.git implement lock-stepping for infarch packages in implicitobsoleteusescolors mode Makeing the infarch rules weak when implicitobsoleteusescolors is set is too simplistic, lets hope that the lock-step approach is good enough. --- diff --git a/src/rules.c b/src/rules.c index 6f9c1700..7041b2a3 100644 --- a/src/rules.c +++ b/src/rules.c @@ -1181,9 +1181,11 @@ solver_addinfarchrules(Solver *solv, Map *addedmap) Id p, pp, a, aa, bestarch; Solvable *s, *ps, *bests; Queue badq, allowedarchs; + Queue lsq; queue_init(&badq); queue_init(&allowedarchs); + queue_init(&lsq); solv->infarchrules = solv->nrules; for (i = 1; i < pool->nsolvables; i++) { @@ -1253,9 +1255,26 @@ solver_addinfarchrules(Solver *solv, Map *addedmap) for (j = 0; j < badq.count; j++) { p = badq.elements[j]; - solver_addrule(solv, -p, 0); + /* lock-step */ + if (pool->implicitobsoleteusescolors) + { + Id p2; + queue_empty(&lsq); + FOR_PROVIDES(p2, pp, s->name) + { + Solvable *s2 = pool->solvables + p2; + if (p2 == p || s2->name != s->name || s2->evr != pool->solvables[p].evr || s2->arch == pool->solvables[p].arch) + continue; + a = s2->arch; + a = (a <= pool->lastarch) ? pool->id2arch[a] : 0; + if (a && (a == 1 || a == bestarch)) + queue_push(&lsq, p2); + } + } + solver_addrule(solv, -p, lsq.count ? pool_queuetowhatprovides(pool, &lsq) : 0); } } + queue_free(&lsq); queue_free(&badq); queue_free(&allowedarchs); solv->infarchrules_end = solv->nrules; diff --git a/src/solver.c b/src/solver.c index 0396f4a7..26a81615 100644 --- a/src/solver.c +++ b/src/solver.c @@ -3622,6 +3622,7 @@ solver_solve(Solver *solv, Queue *job) if (!solv->noinfarchcheck) { solver_addinfarchrules(solv, &addedmap); +#if 0 if (pool->implicitobsoleteusescolors) { /* currently doesn't work well with infarch rules, so make @@ -3629,6 +3630,7 @@ solver_solve(Solver *solv, Queue *job) for (i = solv->infarchrules; i < solv->infarchrules_end; i++) queue_push(&solv->weakruleq, i); } +#endif } else solv->infarchrules = solv->infarchrules_end = solv->nrules;