diff options
Diffstat (limited to 'src/rules.c')
-rw-r--r-- | src/rules.c | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/src/rules.c b/src/rules.c index 32855e4..aa90b5f 100644 --- a/src/rules.c +++ b/src/rules.c @@ -3869,9 +3869,8 @@ complex_cleandeps_addback(Pool *pool, Id ip, Id req, Map *im, Map *installedm, Q { if (!MAPTST(installedm, -p)) break; - continue; } - if (MAPTST(im, p)) + else if (p == ip) break; } if (!p) @@ -3880,6 +3879,8 @@ complex_cleandeps_addback(Pool *pool, Id ip, Id req, Map *im, Map *installedm, Q { if (p < 0) continue; + if (MAPTST(im, p)) + continue; if (!MAPTST(installedm, p)) continue; if (p == ip || MAPTST(userinstalled, p - pool->installed->start)) @@ -4387,6 +4388,36 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded) #ifdef CLEANDEPSDEBUG printf("adding back %s\n", pool_solvable2str(pool, s)); #endif + if (s->repo == installed && pool->implicitobsoleteusescolors) + { + Id a, bestarch = 0; + FOR_PROVIDES(p, pp, s->name) + { + Solvable *ps = pool->solvables + p; + if (ps->name != s->name || ps->repo == installed) + continue; + a = ps->arch; + a = (a <= pool->lastarch) ? pool->id2arch[a] : 0; + if (a && a != 1 && (!bestarch || a < bestarch)) + bestarch = a; + } + if (bestarch && (s->arch > pool->lastarch || pool->id2arch[s->arch] != bestarch)) + { + FOR_PROVIDES(p, pp, s->name) + { + Solvable *ps = pool->solvables + p; + if (ps->repo == installed && ps->name == s->name && ps->evr == s->evr && ps->arch != s->arch && ps->arch < pool->lastarch && pool->id2arch[ps->arch] == bestarch) + if (!MAPTST(&im, p)) + { +#ifdef CLEANDEPSDEBUG + printf("%s lockstep %s\n", pool_solvid2str(pool, ip), pool_solvid2str(pool, p)); +#endif + MAPSET(&im, p); + queue_push(&iq, p); + } + } + } + } if (s->requires) { reqp = s->repo->idarraydata + s->requires; @@ -4400,12 +4431,14 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded) } #endif FOR_PROVIDES(p, pp, req) - if (MAPTST(&im, p)) + if (p == ip) break; if (p) continue; FOR_PROVIDES(p, pp, req) { + if (MAPTST(&im, p)) + continue; if (MAPTST(&installedm, p)) { if (p == ip) @@ -4434,12 +4467,14 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded) } #endif FOR_PROVIDES(p, pp, req) - if (MAPTST(&im, p)) + if (p == ip) break; if (p) continue; FOR_PROVIDES(p, pp, req) { + if (MAPTST(&im, p)) + continue; if (MAPTST(&installedm, p)) { if (p == ip) |