From: Michael Schroeder Date: Fri, 13 May 2016 13:03:39 +0000 (+0200) Subject: Add the SOLVER_FLAG_URPM_REORDER solver flag X-Git-Tag: 0.6.21~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=565280da80a62dbd48bcd30043149be210e3b5c3;p=thirdparty%2Flibsolv.git Add the SOLVER_FLAG_URPM_REORDER solver flag It makes the solver reorder alternatives more closely to what urpm does. --- diff --git a/ext/testcase.c b/ext/testcase.c index 16c7a187..6e2b5746 100644 --- a/ext/testcase.c +++ b/ext/testcase.c @@ -114,6 +114,7 @@ static struct solverflags2str { { SOLVER_FLAG_FOCUS_INSTALLED, "focusinstalled", 0 }, { SOLVER_FLAG_YUM_OBSOLETES, "yumobsoletes", 0 }, { SOLVER_FLAG_NEED_UPDATEPROVIDE, "needupdateprovide", 0 }, + { SOLVER_FLAG_URPM_REORDER, "urpmreorder", 0 }, { 0, 0, 0 } }; @@ -1556,7 +1557,11 @@ testcase_setsolverflags(Solver *solv, const char *str) pool_debug(solv->pool, SOLV_ERROR, "setsolverflags: unknown flag '%.*s'\n", (int)(p - s), s); return 0; } - solver_set_flag(solv, solverflags2str[i].flag, v); + if (solver_set_flag(solv, solverflags2str[i].flag, v) == -1) + { + pool_debug(solv->pool, SOLV_ERROR, "setsolverflags: unsupported flag '%s'\n", solverflags2str[i].str); + return 0; + } } return 1; } diff --git a/src/policy.c b/src/policy.c index 8b8412dd..85c9e075 100644 --- a/src/policy.c +++ b/src/policy.c @@ -1195,6 +1195,63 @@ dislike_old_versions(Pool *pool, Queue *plist) } } + +/* special lang package handling for urpm */ +/* see https://bugs.mageia.org/show_bug.cgi?id=18315 */ + +static int +urpm_reorder_cmp(const void *ap, const void *bp, void *dp) +{ + return ((Id *)bp)[1] - ((Id *)ap)[1]; +} + +static void +urpm_reorder(Solver *solv, Queue *plist) +{ + Pool *pool = solv->pool; + int i, count = plist->count; + /* add locale score to packages */ + queue_insertn(plist, count, count, 0); + for (i = count - 1; i >= 0; i--) + { + Solvable *s = pool->solvables + plist->elements[i]; + int score = 1; + if (s->requires) + { + Id id, *idp, p, pp; + const char *deps; + for (idp = s->repo->idarraydata + s->requires; (id = *idp) != 0; idp++) + { + while (ISRELDEP(id)) + { + Reldep *rd = GETRELDEP(pool, id); + id = rd->name; + } + deps = strstr(pool_id2str(pool, id), "locales-"); + if (!deps) + continue; + if (!strncmp(deps + 8, "en", 2)) + score = 2; + else + { + score = 0; + FOR_PROVIDES(p, pp, id) + if (solv->decisionmap[p] > 0 || (pool->installed && pool->solvables[p].repo == pool->installed)) + score = 3; + break; + } + } + } + plist->elements[i * 2] = plist->elements[i]; + plist->elements[i * 2 + 1] = score; + } + solv_sort(plist->elements, count, sizeof(Id) * 2, urpm_reorder_cmp, pool); + for (i = 0; i < count; i++) + plist->elements[i] = plist->elements[2 * i]; + queue_truncate(plist, count); +} + + /* * POLICY_MODE_CHOOSE: default, do all pruning steps * POLICY_MODE_RECOMMEND: leave out prune_to_recommended @@ -1209,6 +1266,8 @@ policy_filter_unwanted(Solver *solv, Queue *plist, int mode) /* reorder only */ dislike_old_versions(pool, plist); sort_by_common_dep(pool, plist); + if (solv->urpmreorder) + urpm_reorder(solv, plist); prefer_suggested(solv, plist); policy_prefer_favored(solv, plist); return; @@ -1235,6 +1294,8 @@ policy_filter_unwanted(Solver *solv, Queue *plist, int mode) #endif dislike_old_versions(pool, plist); sort_by_common_dep(pool, plist); + if (solv->urpmreorder) + urpm_reorder(solv, plist); prefer_suggested(solv, plist); policy_prefer_favored(solv, plist); } diff --git a/src/solver.c b/src/solver.c index dc42dcdc..5da85295 100644 --- a/src/solver.c +++ b/src/solver.c @@ -1784,6 +1784,8 @@ solver_get_flag(Solver *solv, int flag) return solv->do_yum_obsoletes; case SOLVER_FLAG_NEED_UPDATEPROVIDE: return solv->needupdateprovide; + case SOLVER_FLAG_URPM_REORDER: + return solv->urpmreorder; default: break; } @@ -1862,6 +1864,9 @@ solver_set_flag(Solver *solv, int flag, int value) case SOLVER_FLAG_NEED_UPDATEPROVIDE: solv->needupdateprovide = value; break; + case SOLVER_FLAG_URPM_REORDER: + solv->urpmreorder = value; + break; default: break; } diff --git a/src/solver.h b/src/solver.h index 9424902f..3495fd81 100644 --- a/src/solver.h +++ b/src/solver.h @@ -167,6 +167,7 @@ struct _Solver { int noautotarget; /* true: do not assume targeted for up/dup jobs that contain no installed solvable */ int focus_installed; /* true: resolve update rules first */ int do_yum_obsoletes; /* true: add special yumobs rules */ + int urpmreorder; /* true: do special urpm package reordering */ Map dupmap; /* dup these packages*/ int dupmap_all; /* dup all packages */ @@ -307,6 +308,7 @@ typedef struct _Solver Solver; #define SOLVER_FLAG_FOCUS_INSTALLED 20 #define SOLVER_FLAG_YUM_OBSOLETES 21 #define SOLVER_FLAG_NEED_UPDATEPROVIDE 22 +#define SOLVER_FLAG_URPM_REORDER 23 #define GET_USERINSTALLED_NAMES (1 << 0) /* package names instead of ids */ #define GET_USERINSTALLED_INVERTED (1 << 1) /* autoinstalled */