$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) {
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
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
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 */
{
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;
* 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
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);
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 ? */
}
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);
}
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);
}
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)
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);
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;