]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
Fix distupgrade with allowuninstall
authorMichael Schroeder <mls@suse.de>
Mon, 1 Jun 2015 11:43:41 +0000 (13:43 +0200)
committerMichael Schroeder <mls@suse.de>
Mon, 1 Jun 2015 11:43:41 +0000 (13:43 +0200)
It used to dump core in rare circumstances, it also did not
always produce the correct result.

src/rules.c
src/solver.c
test/testcases/distupgrade/dup_allowuninstall [new file with mode: 0644]
test/testcases/distupgrade/dup_noarchchange [new file with mode: 0644]

index 0888fb0d7ce2c24b1e1e1fa56dcbd2851765103f..67de769ad4703bcdace7e1b06c1641c06f10f33c 100644 (file)
@@ -1721,6 +1721,15 @@ solver_createdupmaps(Solver *solv)
                  solver_addtodupmaps(solv, p, how, targeted);
                }
            }
+         else if (select == SOLVER_SOLVABLE_ALL)
+           {
+             FOR_POOL_SOLVABLES(p)
+               {
+                 MAPSET(&solv->dupinvolvedmap, p);
+                 if (installed && pool->solvables[p].repo != installed)
+                   MAPSET(&solv->dupmap, p);
+               }
+           }
          else
            {
              targeted = how & SOLVER_TARGETED ? 1 : 0;
index 8dcdde562e3e343b18558815895da43a3abbf5f6..f5517311777a404c984b7292c5269e2183ced1fa 100644 (file)
@@ -182,17 +182,10 @@ autouninstall(Solver *solv, Id *problem)
     {
       if (v < 0)
        extraflags &= solv->job.elements[-v - 1];
-      if (v >= solv->featurerules && v < solv->featurerules_end)
-       if (v > lastfeature)
-         lastfeature = v;
       if (v >= solv->updaterules && v < solv->updaterules_end)
        {
-         /* check if identical to feature rule */
-         Id p = solv->rules[v].p;
-         Rule *r;
-         if (p <= 0)
-           continue;
-         r = solv->rules + solv->featurerules + (p - solv->installed->start);
+         /* check if identical to feature rule, we don't like that */
+         Rule *r = solv->rules + solv->featurerules + (v - solv->updaterules);
          if (!r->p)
            {
              /* update rule == feature rule */
@@ -3550,7 +3543,7 @@ solver_solve(Solver *solv, Queue *job)
              if (how & SOLVER_FORCEBEST)
                solv->bestupdatemap_all = 1;
            }
-         if (!solv->dupmap_all)
+         if (!solv->dupmap_all || solv->allowuninstall)
            hasdupjob = 1;
          break;
        default:
diff --git a/test/testcases/distupgrade/dup_allowuninstall b/test/testcases/distupgrade/dup_allowuninstall
new file mode 100644 (file)
index 0000000..86a8af9
--- /dev/null
@@ -0,0 +1,13 @@
+repo system 0 testtags <inline>
+#>=Pkg: a 1 1 i686
+#>=Pkg: b 2 1 i686
+repo available 0 testtags <inline>
+#>=Pkg: a 2 1 i586
+#>=Con: b = 1-1
+#>=Pkg: b 1 1 i586
+system i686 * system
+solverflags !dupallowarchchange allowuninstall
+job distupgrade all packages
+result transaction,problems <inline>
+#>erase b-2-1.i686@system
+#>upgrade a-1-1.i686@system a-2-1.i586@available
diff --git a/test/testcases/distupgrade/dup_noarchchange b/test/testcases/distupgrade/dup_noarchchange
new file mode 100644 (file)
index 0000000..f500d9b
--- /dev/null
@@ -0,0 +1,15 @@
+repo system 0 testtags <inline>
+#>=Pkg: a 1 1 i686
+#>=Pkg: b 1 1 i686
+repo available 0 testtags <inline>
+#>=Pkg: a 2 1 i586
+#>=Pkg: b 2 1 i586
+#>=Pkg: b 2 1 i686
+system i686 * system
+solverflags !dupallowarchchange
+job distupgrade all packages
+result transaction,problems <inline>
+#>problem c43b1300 info problem with installed package a-1-1.i686
+#>problem c43b1300 solution c43b1300 replace a-1-1.i686@system a-2-1.i586@available
+#>upgrade a-1-1.i686@system a-2-1.i586@available
+#>upgrade b-1-1.i686@system b-2-1.i686@available