From: Michael Schroeder Date: Thu, 10 Mar 2016 12:03:04 +0000 (+0100) Subject: Simplify handling of pseudo package updates X-Git-Tag: 0.6.20~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=158735278eeffd5d4d38c9d98ee0d99b6816bcbe;p=thirdparty%2Flibsolv.git Simplify handling of pseudo package updates We extend the updatemap to the instbuddies instead of doing complex stuff in the package update code. Lets see if this is sufficient... --- diff --git a/src/linkedpkg.c b/src/linkedpkg.c index 6387373c..635e69b8 100644 --- a/src/linkedpkg.c +++ b/src/linkedpkg.c @@ -37,7 +37,9 @@ #include "pool.h" #include "repo.h" +#include "solver.h" #include "evr.h" +#include "bitmap.h" #include "linkedpkg.h" #ifdef ENABLE_LINKED_PKGS @@ -377,5 +379,30 @@ pool_link_evrcmp(Pool *pool, Solvable *s1, Solvable *s2) return 0; } +void +extend_updatemap_to_buddies(Solver *solv) +{ + Pool *pool = solv->pool; + Repo *installed = solv->installed; + Solvable *s; + int p, ip; + + if (!installed) + return; + if (!solv->updatemap.size || !solv->instbuddy) + return; + FOR_REPO_SOLVABLES(installed, p, s) + { + if (!MAPTST(&solv->updatemap, p - installed->start)) + continue; + if ((ip = solv->instbuddy[p - installed->start]) <= 1) + continue; + if (!has_package_link(pool, s)) /* only look at pseudo -> real relations */ + continue; + if (ip < installed->start || ip >= installed->end || pool->solvables[ip].repo != installed) + continue; /* just in case... */ + MAPSET(&solv->updatemap, ip - installed->start); + } +} #endif diff --git a/src/linkedpkg.h b/src/linkedpkg.h index d0f5960d..51b82a5d 100644 --- a/src/linkedpkg.h +++ b/src/linkedpkg.h @@ -35,5 +35,6 @@ extern Id find_autoproduct_name(Pool *pool, Solvable *s); /* generic */ extern void find_package_link(Pool *pool, Solvable *s, Id *reqidp, Queue *qr, Id *prvidp, Queue *qp); extern int pool_link_evrcmp(Pool *pool, Solvable *s1, Solvable *s2); +extern void extend_updatemap_to_buddies(Solver *solv); #endif diff --git a/src/rules.c b/src/rules.c index 0e2c9559..f06c03f8 100644 --- a/src/rules.c +++ b/src/rules.c @@ -1346,18 +1346,20 @@ solver_addupdaterule(Solver *solv, Solvable *s) Id qsbuf[64]; int isorphaned = 0; Rule *r; - int islinkedpseudo = 0; p = s - pool->solvables; -#ifdef ENABLE_LINKED_PKGS - islinkedpseudo = is_linked_pseudo_package(solv, s); -#endif - /* Orphan detection. We cheat by looking at the feature rule, which * we already calculated */ r = solv->rules + solv->featurerules + (p - solv->installed->start); - if (!r->p && !islinkedpseudo) + if (!r->p) { +#ifdef ENABLE_LINKED_PKGS + if (is_linked_pseudo_package(solv, s)) + { + solver_addrule(solv, 0, 0, 0); + return; + } +#endif p = 0; queue_push(&solv->orphaned, s - pool->solvables); /* an orphaned package */ if (solv->keep_orphans && !(solv->droporphanedmap_all || (solv->droporphanedmap.size && MAPTST(&solv->droporphanedmap, s - pool->solvables - solv->installed->start)))) @@ -1373,24 +1375,6 @@ solver_addupdaterule(Solver *solv, Solvable *s) else policy_findupdatepackages(solv, s, &qs, 0); -#ifdef ENABLE_LINKED_PKGS - if (islinkedpseudo) - { - /* a linked pseudo package. As it is linked, we do not need an update/feature rule */ - /* nevertheless we set specialupdaters so we can update */ - solver_addrule(solv, 0, 0, 0); - if (qs.count) - { - if (p != -SYSTEMSOLVABLE) - queue_unshift(&qs, p); - if (qs.count) - set_specialupdaters(solv, s, pool_queuetowhatprovides(pool, &qs)); - } - queue_free(&qs); - return; - } -#endif - if (qs.count && solv->multiversion.size) { int i, j; diff --git a/src/solver.c b/src/solver.c index c6f59e20..c1fcd582 100644 --- a/src/solver.c +++ b/src/solver.c @@ -2193,8 +2193,8 @@ solver_run_sat(Solver *solv, int disablerules, int doweak) rr -= solv->installed->end - solv->installed->start; if (!rr->p) /* identical to update rule? */ rr = r; - if (!rr->p && !(specialupdaters && specialupdaters[i - installed->start])) - continue; /* orpaned package */ + if (!rr->p) + continue; /* orpaned package or pseudo package */ /* check if we should update this package to the latest version * noupdate is set for erase jobs, in that case we want to deinstall @@ -2203,30 +2203,7 @@ solver_run_sat(Solver *solv, int disablerules, int doweak) queue_empty(&dq); if (!MAPTST(&solv->noupdate, i - installed->start) && (solv->decisionmap[i] < 0 || solv->updatemap_all || (solv->updatemap.size && MAPTST(&solv->updatemap, i - installed->start)) || (rr->p && rr->p != i))) { - if (!rr->p) - { - /* specialupdater with no update/feature rule, i.e. a pseudo package */ - /* ignore if we also update the linked package */ - /* XXX: better map package in the updatemap? */ - if (solv->instbuddy && solv->instbuddy[s - pool->solvables - installed->start] > 1) - { - Id ip = solv->instbuddy[s - pool->solvables - installed->start]; - if (ip >= installed->start && ip < installed->end) - if (MAPTST(&solv->noupdate, ip - installed->start) || solv->updatemap_all || (solv->updatemap.size && MAPTST(&solv->updatemap, ip - installed->start))) - continue; - } - for (d = specialupdaters[i - installed->start]; (p = pool->whatprovidesdata[d++]) != 0; ) - { - if (solv->decisionmap[p] > 0) - { - dq.count = 0; - break; - } - if (!solv->decisionmap[p]) - queue_push(&dq, p); - } - } - else if (specialupdaters && (d = specialupdaters[i - installed->start]) != 0) + if (specialupdaters && (d = specialupdaters[i - installed->start]) != 0) { /* special multiversion handling, make sure best version is chosen */ if (rr->p == i && solv->decisionmap[i] >= 0) @@ -4000,6 +3977,11 @@ solver_solve(Solver *solv, Queue *job) else solv->duprules = solv->duprules_end = solv->nrules; +#ifdef ENABLE_LINKED_PKGS + if (solv->instbuddy && solv->updatemap.size) + extend_updatemap_to_buddies(solv); +#endif + if (solv->bestupdatemap_all || solv->bestupdatemap.size || hasbestinstalljob) solver_addbestrules(solv, hasbestinstalljob); else