- add dup versions for the allow* flags, make dup automatically use them
authorMichael Schroeder <mls@suse.de>
Fri, 13 Jan 2012 15:04:37 +0000 (16:04 +0100)
committerMichael Schroeder <mls@suse.de>
Fri, 13 Jan 2012 15:04:37 +0000 (16:04 +0100)
examples/p5solv
examples/pysolv
examples/rbsolv
examples/solv.c
src/policy.c
src/rules.c
src/solver.c
src/solver.h

index 5cc9cff..7a57f1c 100755 (executable)
@@ -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) {
index 197ba04..bd547bc 100755 (executable)
@@ -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
index a53f191..8ffd639 100755 (executable)
@@ -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
index 004a85d..753519d 100644 (file)
@@ -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 */
 
index 494072f..40fe50e 100644 (file)
@@ -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);
        }
index bfa7957..df6a9b6 100644 (file)
@@ -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)
index 6f16416..958fc7a 100644 (file)
@@ -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);
index 67eb413..02cc5e0 100644 (file)
@@ -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;