From d4295440a1b7555d666884728d2939e7a24cc1ec Mon Sep 17 00:00:00 2001 From: Michael Schroeder Date: Mon, 26 Mar 2012 13:38:08 +0200 Subject: [PATCH] - add "allownamechange" flag for completeness --- examples/solv.c | 7 +++++-- ext/testcase.c | 1 + src/policy.c | 11 +++++++++++ src/policy.h | 1 + src/rules.c | 6 +++++- src/solver.c | 10 +++++++++- src/solver.h | 6 +++++- src/solverdebug.c | 7 +++++++ 8 files changed, 44 insertions(+), 5 deletions(-) diff --git a/examples/solv.c b/examples/solv.c index 49bc038..4baa6cf 100644 --- a/examples/solv.c +++ b/examples/solv.c @@ -2127,14 +2127,17 @@ limitrepo(Pool *pool, Id repofilter, Queue *job) if (mq.count) { /* here we assume that repo == vendor, so we also set SOLVER_SETVENDOR */ + Id flags = (job->elements[i] & SOLVER_SETMASK) | SOLVER_SETVENDOR | SOLVER_SETREPO; + if ((job->elements[i] & SOLVER_SELECTMASK) == SOLVER_SOLVABLE_NAME) + flags |= SOLVER_SETNAME; if (mq.count == 1) { - job->elements[j] = SOLVER_SOLVABLE | (job->elements[i] & SOLVER_SETMASK) | SOLVER_SETVENDOR | SOLVER_SETREPO | SOLVER_NOAUTOSET; + job->elements[j] = SOLVER_SOLVABLE | SOLVER_NOAUTOSET | flags; job->elements[j + 1] = mq.elements[0]; } else { - job->elements[j] = SOLVER_SOLVABLE_ONE_OF | (job->elements[i] & SOLVER_SETMASK) | SOLVER_SETVENDOR | SOLVER_SETREPO; + job->elements[j] = SOLVER_SOLVABLE_ONE_OF | flags; job->elements[j + 1] = pool_queuetowhatprovides(pool, &mq); } j += 2; diff --git a/ext/testcase.c b/ext/testcase.c index 2d5fff3..701a69f 100644 --- a/ext/testcase.c +++ b/ext/testcase.c @@ -81,6 +81,7 @@ static struct solverflags2str { int def; } solverflags2str[] = { { SOLVER_FLAG_ALLOW_DOWNGRADE, "allowdowngrade", 0 }, + { SOLVER_FLAG_ALLOW_NAMECHANGE, "allownamechange", 1 }, { SOLVER_FLAG_ALLOW_ARCHCHANGE, "allowarchchange", 0 }, { SOLVER_FLAG_ALLOW_VENDORCHANGE, "allowvendorchange", 0 }, { SOLVER_FLAG_ALLOW_UNINSTALL, "allowuninstall", 0 }, diff --git a/src/policy.c b/src/policy.c index 40fe50e..3e8a6ed 100644 --- a/src/policy.c +++ b/src/policy.c @@ -748,6 +748,11 @@ policy_is_illegal(Solver *solv, Solvable *is, Solvable *s, int ignore) if (is->vendor != s->vendor && policy_illegal_vendorchange(solv, is, s)) ret |= POLICY_ILLEGAL_VENDORCHANGE; } + if (!(ignore & POLICY_ILLEGAL_NAMECHANGE) && !(duppkg ? solv->dup_allownamechange : !solv->allownamechange)) + { + if (is->name != s->name) + ret |= POLICY_ILLEGAL_NAMECHANGE; + } return ret; } @@ -854,11 +859,13 @@ policy_findupdatepackages(Solver *solv, Solvable *s, Queue *qs, int allow_all) Solvable *ps; int haveprovobs = 0; int allowdowngrade = allow_all ? 1 : solv->allowdowngrade; + int allownamechange = allow_all ? 1 : solv->allownamechange; int allowarchchange = allow_all ? 1 : solv->allowarchchange; int allowvendorchange = allow_all ? 1 : solv->allowvendorchange; if (allow_all == 2) { allowdowngrade = solv->dup_allowdowngrade; + allownamechange = solv->dup_allownamechange; allowarchchange = solv->dup_allowarchchange; allowvendorchange = solv->dup_allowvendorchange; } @@ -886,6 +893,8 @@ policy_findupdatepackages(Solver *solv, Solvable *s, Queue *qs, int allow_all) if (!allowdowngrade && pool_evrcmp(pool, s->evr, ps->evr, EVRCMP_COMPARE) > 0) continue; } + else if (!allownamechange) + continue; else if (!solv->noupdateprovide && ps->obsoletes) /* provides/obsoletes combination ? */ { obsp = ps->repo->idarraydata + ps->obsoletes; @@ -919,6 +928,8 @@ policy_findupdatepackages(Solver *solv, Solvable *s, Queue *qs, int allow_all) continue; queue_push(qs, p); } + if (!allownamechange) + return; /* if we have found some valid candidates and noupdateprovide is not set, we're done. otherwise we fallback to all obsoletes */ if (!solv->noupdateprovide && haveprovobs) diff --git a/src/policy.h b/src/policy.h index 734ffde..8f81ca3 100644 --- a/src/policy.h +++ b/src/policy.h @@ -20,6 +20,7 @@ #define POLICY_ILLEGAL_DOWNGRADE 1 #define POLICY_ILLEGAL_ARCHCHANGE 2 #define POLICY_ILLEGAL_VENDORCHANGE 4 +#define POLICY_ILLEGAL_NAMECHANGE 8 extern void policy_filter_unwanted(Solver *solv, Queue *plist, int mode); extern int policy_illegal_archchange(Solver *solv, Solvable *s1, Solvable *s2); diff --git a/src/rules.c b/src/rules.c index 66b9706..59a04a0 100644 --- a/src/rules.c +++ b/src/rules.c @@ -1455,8 +1455,10 @@ jobtodisablelist(Solver *solv, Id how, Id what, Queue *q) if (!(set & SOLVER_NOAUTOSET)) { /* automatically add set bits by analysing the job */ + if (select == SOLVER_SOLVABLE_NAME) + set |= SOLVER_SETNAME; if (select == SOLVER_SOLVABLE) - set |= SOLVER_SETARCH | SOLVER_SETVENDOR | SOLVER_SETREPO | SOLVER_SETEVR; + set |= SOLVER_SETNAME | SOLVER_SETARCH | SOLVER_SETVENDOR | SOLVER_SETREPO | SOLVER_SETEVR; else if ((select == SOLVER_SOLVABLE_NAME || select == SOLVER_SOLVABLE_PROVIDES) && ISRELDEP(what)) { Reldep *rd = GETRELDEP(pool, what); @@ -1582,6 +1584,8 @@ jobtodisablelist(Solver *solv, Id how, Id what, Queue *q) s = pool->solvables + p; if ((set & SOLVER_SETEVR) != 0) illegal |= POLICY_ILLEGAL_DOWNGRADE; /* ignore */ + if ((set & SOLVER_SETNAME) != 0) + illegal |= POLICY_ILLEGAL_NAMECHANGE; /* ignore */ if ((set & SOLVER_SETARCH) != 0) illegal |= POLICY_ILLEGAL_ARCHCHANGE; /* ignore */ if ((set & SOLVER_SETVENDOR) != 0) diff --git a/src/solver.c b/src/solver.c index 9bc36af..23a8d71 100644 --- a/src/solver.c +++ b/src/solver.c @@ -1360,7 +1360,10 @@ solver_create(Pool *pool) solv->pool = pool; solv->installed = pool->installed; + solv->allownamechange = 1; + solv->dup_allowdowngrade = 1; + solv->dup_allownamechange = 1; solv->dup_allowarchchange = 1; solv->dup_allowvendorchange = 1; @@ -1452,6 +1455,8 @@ solver_get_flag(Solver *solv, int flag) { case SOLVER_FLAG_ALLOW_DOWNGRADE: return solv->allowdowngrade; + case SOLVER_FLAG_ALLOW_NAMECHANGE: + return solv->allownamechange; case SOLVER_FLAG_ALLOW_ARCHCHANGE: return solv->allowarchchange; case SOLVER_FLAG_ALLOW_VENDORCHANGE: @@ -1483,6 +1488,9 @@ solver_set_flag(Solver *solv, int flag, int value) case SOLVER_FLAG_ALLOW_DOWNGRADE: solv->allowdowngrade = value; break; + case SOLVER_FLAG_ALLOW_NAMECHANGE: + solv->allownamechange = value; + break; case SOLVER_FLAG_ALLOW_ARCHCHANGE: solv->allowarchchange = value; break; @@ -2559,7 +2567,7 @@ solver_solve(Solver *solv, Queue *job) /* log solver options */ POOL_DEBUG(SOLV_DEBUG_STATS, "solver started\n"); POOL_DEBUG(SOLV_DEBUG_STATS, "dosplitprovides=%d, noupdateprovide=%d noinfarchcheck=%d\n", solv->dosplitprovides, solv->noupdateprovide, solv->noinfarchcheck); - POOL_DEBUG(SOLV_DEBUG_STATS, "allowuninstall=%d, allowdowngrade=%d, allowarchchange=%d, allowvendorchange=%d\n", solv->allowuninstall, solv->allowdowngrade, solv->allowarchchange, solv->allowvendorchange); + POOL_DEBUG(SOLV_DEBUG_STATS, "allowuninstall=%d, allowdowngrade=%d, allownamechange=%d, allowarchchange=%d, allowvendorchange=%d\n", solv->allowuninstall, solv->allowdowngrade, solv->allownamechange, solv->allowarchchange, solv->allowvendorchange); POOL_DEBUG(SOLV_DEBUG_STATS, "promoteepoch=%d, forbidselfconflicts=%d\n", pool->promoteepoch, pool->forbidselfconflicts); POOL_DEBUG(SOLV_DEBUG_STATS, "obsoleteusesprovides=%d, implicitobsoleteusesprovides=%d, obsoleteusescolors=%d\n", pool->obsoleteusesprovides, pool->implicitobsoleteusesprovides, pool->obsoleteusescolors); POOL_DEBUG(SOLV_DEBUG_STATS, "dontinstallrecommended=%d, addalreadyrecommended=%d\n", solv->dontinstallrecommended, solv->addalreadyrecommended); diff --git a/src/solver.h b/src/solver.h index 033956c..84ffb8e 100644 --- a/src/solver.h +++ b/src/solver.h @@ -183,6 +183,7 @@ struct _Solver { *-------------------------------------------------------------------------------------------------------------*/ int allowdowngrade; /* allow to downgrade installed solvable */ + int allownamechange; /* allow to change name of installed solvables */ int allowarchchange; /* allow to change architecture of installed solvables */ int allowvendorchange; /* allow to change vendor of installed solvables */ int allowuninstall; /* allow removal of installed solvables */ @@ -199,6 +200,7 @@ struct _Solver { int dupmap_all; /* dup all packages */ Map dupinvolvedmap; /* packages involved in dup process */ int dup_allowdowngrade; /* dup mode: allow to downgrade installed solvable */ + int dup_allownamechange; /* dup mode: allow to change name of installed solvable */ int dup_allowarchchange; /* dup mode: allow to change architecture of installed solvables */ int dup_allowvendorchange; /* dup mode: allow to change vendor of installed solvables */ @@ -253,8 +255,9 @@ typedef struct _Solver Solver; #define SOLVER_SETVENDOR 0x08000000 #define SOLVER_SETREPO 0x10000000 #define SOLVER_NOAUTOSET 0x20000000 +#define SOLVER_SETNAME 0x40000000 -#define SOLVER_SETMASK 0x2f000000 +#define SOLVER_SETMASK 0x7f000000 #define SOLVER_REASON_UNRELATED 0 #define SOLVER_REASON_UNIT_RULE 1 @@ -279,6 +282,7 @@ typedef struct _Solver Solver; #define SOLVER_FLAG_IGNORE_RECOMMENDED 7 #define SOLVER_FLAG_ADD_ALREADY_RECOMMENDED 8 #define SOLVER_FLAG_NO_INFARCHCHECK 9 +#define SOLVER_FLAG_ALLOW_NAMECHANGE 10 extern Solver *solver_create(Pool *pool); extern void solver_free(Solver *solv); diff --git a/src/solverdebug.c b/src/solverdebug.c index a33e7ad..408fc6e 100644 --- a/src/solverdebug.c +++ b/src/solverdebug.c @@ -711,6 +711,8 @@ solver_printsolution(Solver *solv, Id problem, Id solution) int illegal = policy_is_illegal(solv, s, sd, 0); if ((illegal & POLICY_ILLEGAL_DOWNGRADE) != 0) POOL_DEBUG(SOLV_DEBUG_RESULT, " - allow downgrade of %s to %s\n", pool_solvable2str(pool, s), pool_solvable2str(pool, sd)); + if ((illegal & POLICY_ILLEGAL_NAMECHANGE) != 0) + POOL_DEBUG(SOLV_DEBUG_RESULT, " - allow name change of %s to %s\n", pool_solvable2str(pool, s), pool_solvable2str(pool, sd)); if ((illegal & POLICY_ILLEGAL_ARCHCHANGE) != 0) POOL_DEBUG(SOLV_DEBUG_RESULT, " - allow architecture change of %s to %s\n", pool_solvable2str(pool, s), pool_solvable2str(pool, sd)); if ((illegal & POLICY_ILLEGAL_VENDORCHANGE) != 0) @@ -1026,6 +1028,11 @@ policy_illegal2str(Solver *solv, int illegal, Solvable *s, Solvable *rs) str = pool_tmpjoin(pool, "downgrade of ", pool_solvable2str(pool, s), 0); return pool_tmpappend(pool, str, " to ", pool_solvable2str(pool, rs)); } + if (illegal == POLICY_ILLEGAL_NAMECHANGE) + { + str = pool_tmpjoin(pool, "name change of ", pool_solvable2str(pool, s), 0); + return pool_tmpappend(pool, str, " to ", pool_solvable2str(pool, rs)); + } if (illegal == POLICY_ILLEGAL_ARCHCHANGE) { str = pool_tmpjoin(pool, "architecture change of ", pool_solvable2str(pool, s), 0); -- 2.7.4