From: Michael Schroeder Date: Wed, 23 Nov 2016 13:27:11 +0000 (+0100) Subject: Add SOLVER_FLAG_INSTALL_ALSO_UPDATES solver flag X-Git-Tag: 0.6.25~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=45f575e2315af3b9f02d41b1eef9fd5e41985dda;p=thirdparty%2Flibsolv.git Add SOLVER_FLAG_INSTALL_ALSO_UPDATES solver flag --- diff --git a/bindings/solv.i b/bindings/solv.i index 9e0a8176..03fd1394 100644 --- a/bindings/solv.i +++ b/bindings/solv.i @@ -3288,6 +3288,7 @@ rb_eval_string( static const int SOLVER_FLAG_NEED_UPDATEPROVIDE = SOLVER_FLAG_NEED_UPDATEPROVIDE; static const int SOLVER_FLAG_FOCUS_BEST = SOLVER_FLAG_FOCUS_BEST; static const int SOLVER_FLAG_STRONG_RECOMMENDS = SOLVER_FLAG_STRONG_RECOMMENDS; + static const int SOLVER_FLAG_INSTALL_ALSO_UPDATES = SOLVER_FLAG_INSTALL_ALSO_UPDATES; static const int SOLVER_REASON_UNRELATED = SOLVER_REASON_UNRELATED; static const int SOLVER_REASON_UNIT_RULE = SOLVER_REASON_UNIT_RULE; diff --git a/ext/testcase.c b/ext/testcase.c index ce090b66..ccfcb61d 100644 --- a/ext/testcase.c +++ b/ext/testcase.c @@ -117,6 +117,7 @@ static struct solverflags2str { { SOLVER_FLAG_URPM_REORDER, "urpmreorder", 0 }, { SOLVER_FLAG_FOCUS_BEST, "focusbest", 0 }, { SOLVER_FLAG_STRONG_RECOMMENDS, "strongrecommends", 0 }, + { SOLVER_FLAG_INSTALL_ALSO_UPDATES, "installalsoupdates", 0 }, { 0, 0, 0 } }; diff --git a/src/solver.c b/src/solver.c index 08ad92d1..c7597466 100644 --- a/src/solver.c +++ b/src/solver.c @@ -1711,6 +1711,8 @@ solver_get_flag(Solver *solv, int flag) return solv->urpmreorder; case SOLVER_FLAG_STRONG_RECOMMENDS: return solv->strongrecommends; + case SOLVER_FLAG_INSTALL_ALSO_UPDATES: + return solv->install_also_updates; default: break; } @@ -1798,6 +1800,9 @@ solver_set_flag(Solver *solv, int flag, int value) case SOLVER_FLAG_STRONG_RECOMMENDS: solv->strongrecommends = value; break; + case SOLVER_FLAG_INSTALL_ALSO_UPDATES: + solv->install_also_updates = value; + break; default: break; } @@ -1838,24 +1843,26 @@ resolve_jobrules(Solver *solv, int level, int disablerules, Queue *dq) continue; /* prune to installed if not updating */ if (dq->count > 1 && solv->installed && !solv->updatemap_all && + !solv->install_also_updates && !(solv->job.elements[solv->ruletojob.elements[i - solv->jobrules]] & SOLVER_ORUPDATE)) { - int j, k; - for (j = k = 0; j < dq->count; j++) + int j = dq->count, k; + if (solv->updatemap.size) { - Solvable *s = pool->solvables + dq->elements[j]; - if (s->repo == solv->installed) - { - dq->elements[k++] = dq->elements[j]; - if (solv->updatemap.size && MAPTST(&solv->updatemap, dq->elements[j] - solv->installed->start)) - { - k = 0; /* package wants to be updated, do not prune */ - break; - } - } + /* do not prune if an installed package wants to be updated */ + for (j = 0; j < dq->count; j++) + if (pool->solvables[dq->elements[j]].repo == solv->installed + && MAPTST(&solv->updatemap, dq->elements[j] - solv->installed->start)) + break; + } + if (j == dq->count) + { + for (j = k = 0; j < dq->count; j++) + if (pool->solvables[dq->elements[j]].repo == solv->installed) + dq->elements[k++] = dq->elements[j]; + if (k) + dq->count = k; } - if (k) - dq->count = k; } olevel = level; level = selectandinstall(solv, level, dq, disablerules, i, SOLVER_REASON_RESOLVE_JOB); diff --git a/src/solver.h b/src/solver.h index 8f0b0dbe..15fdf3f2 100644 --- a/src/solver.h +++ b/src/solver.h @@ -165,6 +165,7 @@ struct _Solver { int do_yum_obsoletes; /* true: add special yumobs rules */ int urpmreorder; /* true: do special urpm package reordering */ int strongrecommends; /* true: create weak rules for recommends */ + int install_also_updates; /* true: do not prune install job rules to installed packages */ Map dupmap; /* dup these packages*/ int dupmap_all; /* dup all packages */ @@ -313,6 +314,7 @@ typedef struct _Solver Solver; #define SOLVER_FLAG_URPM_REORDER 23 #define SOLVER_FLAG_FOCUS_BEST 24 #define SOLVER_FLAG_STRONG_RECOMMENDS 25 +#define SOLVER_FLAG_INSTALL_ALSO_UPDATES 26 #define GET_USERINSTALLED_NAMES (1 << 0) /* package names instead of ids */ #define GET_USERINSTALLED_INVERTED (1 << 1) /* autoinstalled */