From 8c000d8c3a5062aa9098989c99997cd31028a6f6 Mon Sep 17 00:00:00 2001 From: Michael Schroeder Date: Tue, 4 Feb 2014 14:58:39 +0100 Subject: [PATCH] do not create update/feature rules for applications or patterns Also rename "multiversionupdaters" to "specialupdaters". --- src/rules.c | 35 ++++++++++++++++++++++++++++++----- src/solver.c | 51 +++++++++++++++++++++++++++++++++++---------------- src/solver.h | 2 +- 3 files changed, 66 insertions(+), 22 deletions(-) diff --git a/src/rules.c b/src/rules.c index fdbeff6..03c66e7 100644 --- a/src/rules.c +++ b/src/rules.c @@ -1058,6 +1058,29 @@ solver_addupdaterule(Solver *solv, Solvable *s, int allow_all) if (!allow_all && !solv->dupmap_all && solv->dupinvolvedmap.size && MAPTST(&solv->dupinvolvedmap, p)) addduppackages(solv, s, &qs); +#ifdef ENABLE_LINKED_PKGS + if (solv->instbuddy && solv->instbuddy[s - pool->solvables - solv->installed->start]) + { + const char *name = pool_id2str(pool, s->name); + if (strncmp(name, "pattern:", 8) == 0 || strncmp(name, "application:", 12) == 0) + { + /* a linked pseudo package. As it is linked, we do not need an update rule */ + /* nevertheless we set specialupdaters so we can update */ + solver_addrule(solv, 0, 0); + if (!allow_all && qs.count) + { + if (p != -SYSTEMSOLVABLE) + queue_unshift(&qs, p); + if (!solv->specialupdaters) + solv->specialupdaters = solv_calloc(solv->installed->end - solv->installed->start, sizeof(Id)); + solv->specialupdaters[s - pool->solvables - solv->installed->start] = pool_queuetowhatprovides(pool, &qs); + } + queue_free(&qs); + return; + } + } +#endif + if (!allow_all && qs.count && solv->multiversion.size) { int i, j; @@ -1087,9 +1110,9 @@ solver_addupdaterule(Solver *solv, Solvable *s, int allow_all) if (d && solv->installed && s->repo == solv->installed && (solv->updatemap_all || (solv->updatemap.size && MAPTST(&solv->updatemap, s - pool->solvables - solv->installed->start)))) { - if (!solv->multiversionupdaters) - solv->multiversionupdaters = solv_calloc(solv->installed->end - solv->installed->start, sizeof(Id)); - solv->multiversionupdaters[s - pool->solvables - solv->installed->start] = d; + if (!solv->specialupdaters) + solv->specialupdaters = solv_calloc(solv->installed->end - solv->installed->start, sizeof(Id)); + solv->specialupdaters[s - pool->solvables - solv->installed->start] = d; } if (j == 0 && p == -SYSTEMSOLVABLE && solv->dupmap_all) { @@ -1965,8 +1988,10 @@ jobtodisablelist(Solver *solv, Id how, Id what, Queue *q) if (pool->solvables[p].repo == installed) { queue_push2(q, DISABLE_UPDATE, p); +#ifdef ENABLE_LINKED_PKGS if (solv->instbuddy && solv->instbuddy[p - installed->start] > 1) queue_push2(q, DISABLE_UPDATE, solv->instbuddy[p - installed->start]); +#endif } return; default: @@ -2991,9 +3016,9 @@ solver_addbestrules(Solver *solv, int havebestinstalljobs) if (!r->p) /* identical to update rule? */ r = solv->rules + solv->updaterules + (p - installed->start); } - if (solv->multiversionupdaters && (d = solv->multiversionupdaters[p - installed->start]) != 0 && r == solv->rules + solv->updaterules + (p - installed->start)) + if (solv->specialupdaters && (d = solv->specialupdaters[p - installed->start]) != 0 && r == solv->rules + solv->updaterules + (p - installed->start)) { - /* need to check multiversionupdaters */ + /* need to check specialupdaters */ if (r->p == p) /* be careful with the dup case */ queue_push(&q, p); while ((p2 = pool->whatprovidesdata[d++]) != 0) diff --git a/src/solver.c b/src/solver.c index 5ac50b6..177dd0d 100644 --- a/src/solver.c +++ b/src/solver.c @@ -1585,7 +1585,7 @@ solver_free(Solver *solv) solv_free(solv->watches); solv_free(solv->obsoletes); solv_free(solv->obsoletes_data); - solv_free(solv->multiversionupdaters); + solv_free(solv->specialupdaters); solv_free(solv->choicerules_ref); solv_free(solv->bestrules_pkg); solv_free(solv->instbuddy); @@ -1900,7 +1900,7 @@ solver_run_sat(Solver *solv, int disablerules, int doweak) for (pass = solv->updatemap.size ? 0 : 1; pass < 2; pass++) { int passlevel = level; - Id *multiversionupdaters = solv->multiversion.size ? solv->multiversionupdaters : 0; + Id *specialupdaters = solv->specialupdaters; if (pass == 1 && !solv->decisioncnt_keep) solv->decisioncnt_keep = solv->decisionq.count; /* start with installedpos, the position that gave us problems the last time */ @@ -1915,7 +1915,7 @@ solver_run_sat(Solver *solv, int disablerules, int doweak) if (s->repo != installed) continue; - if (solv->decisionmap[i] > 0 && (!multiversionupdaters || !multiversionupdaters[i - installed->start])) + if (solv->decisionmap[i] > 0 && (!specialupdaters || !specialupdaters[i - installed->start])) continue; /* already decided */ if (!pass && solv->updatemap.size && !MAPTST(&solv->updatemap, i - installed->start)) continue; /* updates first */ @@ -1925,16 +1925,17 @@ 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) + if (!rr->p && (!specialupdaters || !specialupdaters[i - installed->start])) continue; /* orpaned 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 - * the installed package and not replace it with a newer version */ + * the installed package and not replace it with a newer version + * rr->p != i is for dup jobs where the installed package cannot be kept */ 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 != i)) + 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 (multiversionupdaters && (d = multiversionupdaters[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) @@ -1944,7 +1945,7 @@ solver_run_sat(Solver *solv, int disablerules, int doweak) queue_push(&dq, p); if (dq.count && solv->update_targets && solv->update_targets->elements[i - installed->start]) prune_to_update_targets(solv, solv->update_targets->elements + solv->update_targets->elements[i - installed->start], &dq); - if (dq.count) + if (dq.count && rr->p) { policy_filter_unwanted(solv, &dq, POLICY_MODE_CHOOSE); p = dq.elements[0]; @@ -2153,9 +2154,7 @@ solver_run_sat(Solver *solv, int disablerules, int doweak) continue; /* start over */ } - /* at this point we have a consistent system. now do the extras... */ - - /* first decide leftover cleandeps packages */ + /* decide leftover cleandeps packages */ if (solv->cleandepsmap.size && solv->installed) { for (p = solv->installed->start; p < solv->installed->end; p++) @@ -2176,6 +2175,8 @@ solver_run_sat(Solver *solv, int disablerules, int doweak) continue; } + /* at this point we have a consistent system. now do the extras... */ + if (!solv->decisioncnt_weak) solv->decisioncnt_weak = solv->decisionq.count; if (doweak) @@ -2490,7 +2491,25 @@ solver_run_sat(Solver *solv, int disablerules, int doweak) } } - if (solv->installed && solv->cleandepsmap.size) + /* one final pass to make sure we decided all installed packages */ + if (solv->installed) + { + for (p = solv->installed->start; p < solv->installed->end; p++) + { + if (solv->decisionmap[p]) + continue; /* already decided */ + s = pool->solvables + p; + if (s->repo != solv->installed) + continue; + POOL_DEBUG(SOLV_DEBUG_SOLVER, "removing unwanted %s\n", pool_solvid2str(pool, p)); + olevel = level; + level = setpropagatelearn(solv, level, -p, 0, 0); + if (level < olevel) + break; + } + } + + if (solv->installed && solv->cleandepsmap.size) { if (cleandeps_check_mistakes(solv, level)) { @@ -2500,7 +2519,7 @@ solver_run_sat(Solver *solv, int disablerules, int doweak) } } - if (solv->solution_callback) + if (solv->solution_callback) { solv->solution_callback(solv, solv->solution_callback_data); if (solv->branches.count) @@ -2536,7 +2555,7 @@ solver_run_sat(Solver *solv, int disablerules, int doweak) } /* auto-minimization step */ - if (solv->branches.count) + if (solv->branches.count) { int l = 0, lasti = -1, lastl = -1; Id why; @@ -3123,7 +3142,7 @@ solver_solve(Solver *solv, Queue *job) map_empty(&solv->suggestsmap); solv->recommends_index = 0; } - solv->multiversionupdaters = solv_free(solv->multiversionupdaters); + solv->specialupdaters = solv_free(solv->specialupdaters); /* @@ -3411,7 +3430,7 @@ solver_solve(Solver *solv, Queue *job) queue_push(&solv->orphaned, i); if (!r->p) { - assert(solv->dupmap_all && !sr->p); + /* assert(solv->dupmap_all && !sr->p); */ continue; } if (!solver_rulecmp(solv, r, sr)) diff --git a/src/solver.h b/src/solver.h index a0a101d..ae05bb1 100644 --- a/src/solver.h +++ b/src/solver.h @@ -136,7 +136,7 @@ struct _Solver { Id *obsoletes; /* obsoletes for each installed solvable */ Id *obsoletes_data; /* data area for obsoletes */ - Id *multiversionupdaters; /* updaters for multiversion packages in updatesystem mode */ + Id *specialupdaters; /* updaters for packages with a limited update rule */ /*------------------------------------------------------------------------------------------------------------- * Solver configuration -- 2.7.4