From 047a5a57b2010558426d95064a5b2b0b93c9f8da Mon Sep 17 00:00:00 2001 From: Michael Schroeder Date: Wed, 4 Dec 2013 18:41:42 +0100 Subject: [PATCH] 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. --- src/rules.c | 21 ++++++++++++++++++++- src/solver.c | 2 ++ 2 files changed, 22 insertions(+), 1 deletion(-) 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; -- 2.47.3