From: Michael Schroeder Date: Fri, 13 Jan 2012 15:04:37 +0000 (+0100) Subject: - add dup versions for the allow* flags, make dup automatically use them X-Git-Tag: BASE-SuSE-Code-12_2-Branch~205 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6bdd2a75661ff480af9ca757f54bb5118168b65e;p=thirdparty%2Flibsolv.git - add dup versions for the allow* flags, make dup automatically use them --- diff --git a/examples/p5solv b/examples/p5solv index 5cc9cff1..7a57f1ca 100755 --- a/examples/p5solv +++ b/examples/p5solv @@ -757,11 +757,6 @@ if ($cmd eq 'install' || $cmd eq 'erase' || $cmd eq 'up' || $cmd eq 'dup' || $cm $solver->set_flag($solv::Solver::SOLVER_FLAG_IGNORE_ALREADY_RECOMMENDED, 1); $solver->set_flag($solv::Solver::SOLVER_FLAG_SPLITPROVIDES, 1); $solver->set_flag($solv::Solver::SOLVER_FLAG_ALLOW_UNINSTALL, 1) if $cmd eq 'erase'; - if ($cmd eq 'dup' && @jobs == 1 && $jobs[0]->{'how'} == ($solv::Job::SOLVER_DISTUPGRADE | $solv::Job::SOLVER_SOLVABLE_ALL)) { - $solver->set_flag($solv::Solver::SOLVER_FLAG_ALLOW_DOWNGRADE, 1); - $solver->set_flag($solv::Solver::SOLVER_FLAG_ALLOW_VENDERCHANGE, 1); - $solver->set_flag($solv::Solver::SOLVER_FLAG_ALLOW_ARCHCHANGE, 1); - } my @problems = $solver->solve(\@jobs); last unless @problems; for my $problem (@problems) { diff --git a/examples/pysolv b/examples/pysolv index 197ba045..bd547bca 100755 --- a/examples/pysolv +++ b/examples/pysolv @@ -852,10 +852,6 @@ if cmd == 'install' or cmd == 'erase' or cmd == 'up' or cmd == 'dup' or cmd == ' solver.set_flag(Solver.SOLVER_FLAG_SPLITPROVIDES, 1); if cmd == 'erase': solver.set_flag(Solver.SOLVER_FLAG_ALLOW_UNINSTALL, 1); - if cmd == 'dup' and len(jobs) == 1 and jobs[0].how == (Job.SOLVER_DISTUPGRADE | Job.SOLVER_SOLVABLE_ALL): - solver.set_flag(Solver.SOLVER_FLAG_ALLOW_DOWNGRADE, 1); - solver.set_flag(Solver.SOLVER_FLAG_ALLOW_VENDORCHANGE, 1); - solver.set_flag(Solver.SOLVER_FLAG_ALLOW_ARCHCHANGE, 1); problems = solver.solve(jobs) if not problems: break diff --git a/examples/rbsolv b/examples/rbsolv index a53f1913..8ffd6390 100755 --- a/examples/rbsolv +++ b/examples/rbsolv @@ -759,11 +759,6 @@ if cmd == 'install' || cmd == 'erase' || cmd == 'up' || cmd == 'dup' || cmd == ' solver.set_flag(Solv::Solver::SOLVER_FLAG_IGNORE_ALREADY_RECOMMENDED, 1) solver.set_flag(Solv::Solver::SOLVER_FLAG_SPLITPROVIDES, 1) solver.set_flag(Solv::Solver::SOLVER_FLAG_ALLOW_UNINSTALL, 1) if cmd == 'erase' - if cmd == 'up' && jobs.length == 1 && jobs[0].how == (Solv::Job::SOLVER_DISTUPGRADE | Solv::Job::SOLVER_SOLVABLE_ALL) - solver.set_flag(Solv::Solver::SOLVER_FLAG_ALLOW_DOWNGRADE, 1) - solver.set_flag(Solv::Solver::SOLVER_FLAG_ALLOW_VENDORCHANGE, 1) - solver.set_flag(Solv::Solver::SOLVER_FLAG_ALLOW_ARCHCHANGE, 1) - end problems = solver.solve(jobs) break if problems.empty? for problem in problems diff --git a/examples/solv.c b/examples/solv.c index 004a85dc..753519db 100644 --- a/examples/solv.c +++ b/examples/solv.c @@ -2959,12 +2959,6 @@ rerunsolver: solv = solver_create(pool); solver_set_flag(solv, SOLVER_FLAG_IGNORE_ALREADY_RECOMMENDED, 1); solver_set_flag(solv, SOLVER_FLAG_SPLITPROVIDES, 1); - if (mainmode == MODE_DISTUPGRADE && allpkgs && !repofilter) - { - solver_set_flag(solv, SOLVER_FLAG_ALLOW_DOWNGRADE, 1); - solver_set_flag(solv, SOLVER_FLAG_ALLOW_ARCHCHANGE, 1); - solver_set_flag(solv, SOLVER_FLAG_ALLOW_VENDORCHANGE, 1); - } if (mainmode == MODE_ERASE || mainmode == MODE_ERASECLEAN) solver_set_flag(solv, SOLVER_FLAG_ALLOW_UNINSTALL, 1); /* don't nag */ diff --git a/src/policy.c b/src/policy.c index 494072f1..40fe50ee 100644 --- a/src/policy.c +++ b/src/policy.c @@ -732,17 +732,18 @@ policy_is_illegal(Solver *solv, Solvable *is, Solvable *s, int ignore) { Pool *pool = solv->pool; int ret = 0; - if (!(ignore & POLICY_ILLEGAL_DOWNGRADE) && !solv->allowdowngrade) + int duppkg = solv->dupmap_all ? 1 : 0; + if (!(ignore & POLICY_ILLEGAL_DOWNGRADE) && !(duppkg ? solv->dup_allowdowngrade : solv->allowdowngrade)) { if (is->name == s->name && pool_evrcmp(pool, is->evr, s->evr, EVRCMP_COMPARE) > 0) ret |= POLICY_ILLEGAL_DOWNGRADE; } - if (!(ignore & POLICY_ILLEGAL_ARCHCHANGE) && !solv->allowarchchange) + if (!(ignore & POLICY_ILLEGAL_ARCHCHANGE) && !(duppkg ? solv->dup_allowarchchange : !solv->allowarchchange)) { if (is->arch != s->arch && policy_illegal_archchange(solv, is, s)) ret |= POLICY_ILLEGAL_ARCHCHANGE; } - if (!(ignore & POLICY_ILLEGAL_VENDORCHANGE) && !solv->allowvendorchange) + if (!(ignore & POLICY_ILLEGAL_VENDORCHANGE) && !(duppkg ? solv->dup_allowvendorchange : !solv->allowvendorchange)) { if (is->vendor != s->vendor && policy_illegal_vendorchange(solv, is, s)) ret |= POLICY_ILLEGAL_VENDORCHANGE; @@ -840,6 +841,7 @@ policy_create_obsolete_index(Solver *solv) * s: installed solvable to be updated * qs: [out] queue to hold Ids of candidates * allow_all: 0 = dont allow downgrades, 1 = allow all candidates + * 2 = dup mode * */ void @@ -851,6 +853,15 @@ policy_findupdatepackages(Solver *solv, Solvable *s, Queue *qs, int allow_all) Id obs, *obsp; Solvable *ps; int haveprovobs = 0; + int allowdowngrade = allow_all ? 1 : solv->allowdowngrade; + int allowarchchange = allow_all ? 1 : solv->allowarchchange; + int allowvendorchange = allow_all ? 1 : solv->allowvendorchange; + if (allow_all == 2) + { + allowdowngrade = solv->dup_allowdowngrade; + allowarchchange = solv->dup_allowarchchange; + allowvendorchange = solv->dup_allowvendorchange; + } queue_empty(qs); @@ -872,7 +883,7 @@ policy_findupdatepackages(Solver *solv, Solvable *s, Queue *qs, int allow_all) ps = pool->solvables + p; if (s->name == ps->name) /* name match */ { - if (!allow_all && !solv->allowdowngrade && pool_evrcmp(pool, s->evr, ps->evr, EVRCMP_COMPARE) > 0) + if (!allowdowngrade && pool_evrcmp(pool, s->evr, ps->evr, EVRCMP_COMPARE) > 0) continue; } else if (!solv->noupdateprovide && ps->obsoletes) /* provides/obsoletes combination ? */ @@ -902,9 +913,9 @@ policy_findupdatepackages(Solver *solv, Solvable *s, Queue *qs, int allow_all) } else continue; - if (!allow_all && !solv->allowarchchange && s->arch != ps->arch && policy_illegal_archchange(solv, s, ps)) + if (!allowarchchange && s->arch != ps->arch && policy_illegal_archchange(solv, s, ps)) continue; - if (!allow_all && !solv->allowvendorchange && s->vendor != ps->vendor && policy_illegal_vendorchange(solv, s, ps)) + if (!allowvendorchange && s->vendor != ps->vendor && policy_illegal_vendorchange(solv, s, ps)) continue; queue_push(qs, p); } @@ -918,9 +929,9 @@ policy_findupdatepackages(Solver *solv, Solvable *s, Queue *qs, int allow_all) for (opp = solv->obsoletes_data + solv->obsoletes[n - solv->installed->start]; (p = *opp++) != 0;) { ps = pool->solvables + p; - if (!allow_all && !solv->allowarchchange && s->arch != ps->arch && policy_illegal_archchange(solv, s, ps)) + if (!allowarchchange && s->arch != ps->arch && policy_illegal_archchange(solv, s, ps)) continue; - if (!allow_all && !solv->allowvendorchange && s->vendor != ps->vendor && policy_illegal_vendorchange(solv, s, ps)) + if (!allowvendorchange && s->vendor != ps->vendor && policy_illegal_vendorchange(solv, s, ps)) continue; queue_push(qs, p); } diff --git a/src/rules.c b/src/rules.c index bfa79579..df6a9b66 100644 --- a/src/rules.c +++ b/src/rules.c @@ -849,7 +849,7 @@ finddistupgradepackages(Solver *solv, Solvable *s, Queue *qs, int allow_all) Pool *pool = solv->pool; int i; - policy_findupdatepackages(solv, s, qs, allow_all); + policy_findupdatepackages(solv, s, qs, allow_all ? allow_all : 2); if (!qs->count) { if (allow_all) diff --git a/src/solver.c b/src/solver.c index 6f164163..958fc7a0 100644 --- a/src/solver.c +++ b/src/solver.c @@ -1269,6 +1269,10 @@ solver_create(Pool *pool) solv->pool = pool; solv->installed = pool->installed; + solv->dup_allowdowngrade = 1; + solv->dup_allowarchchange = 1; + solv->dup_allowvendorchange = 1; + queue_init(&solv->ruletojob); queue_init(&solv->decisionq); queue_init(&solv->decisionq_why); diff --git a/src/solver.h b/src/solver.h index 67eb4137..02cc5e02 100644 --- a/src/solver.h +++ b/src/solver.h @@ -198,6 +198,9 @@ struct _Solver { Map dupmap; /* dup these packages*/ 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_allowarchchange; /* dup mode: allow to change architecture of installed solvables */ + int dup_allowvendorchange; /* dup mode: allow to change vendor of installed solvables */ Map droporphanedmap; /* packages to drop in dup mode */ int droporphanedmap_all;