]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
Also fulfill the update rule if we did a "special updater" update
authorMichael Schroeder <mls@suse.de>
Wed, 14 Feb 2024 09:24:47 +0000 (10:24 +0100)
committerMichael Schroeder <mls@suse.de>
Wed, 14 Feb 2024 09:24:47 +0000 (10:24 +0100)
src/solver.c

index a1a41f6772689ce869c589b1223af03f42b5dbaf..04bf473130859e9ddc6d63920e345409f624c4db 100644 (file)
@@ -1891,31 +1891,44 @@ resolve_installed(Solver *solv, int level, int disablerules, Queue *dq)
                }
              if (dq->count)
                queue_empty(dq);
-             /* find update candidates */
+             /* update to best package of the special updaters */
              if (specialupdaters && specialupdaters[i - installed->start] != 0)
                {
                  get_special_updaters(solv, i, rr, dq);
-                 /* if we have an update set rr to the feature rule */
                  if (dq->count)
                    {
-                     rr = solv->rules + solv->featurerules + (i - solv->installed->start);
-                     if (!rr->p)               /* update rule == feature rule? */
-                       rr = rr - solv->featurerules + solv->updaterules;
+                     /* use the feature rule as reason */
+                     Rule *rrf = solv->rules + solv->featurerules + (i - solv->installed->start);
+                     if (!rrf->p)
+                       rrf = rrf - solv->featurerules + solv->updaterules;
+                     olevel = level;
+                     level = selectandinstall(solv, level, dq, disablerules, rrf - solv->rules, SOLVER_REASON_UPDATE_INSTALLED);
+
+                     if (level <= olevel)
+                       {
+                         if (level < passlevel)
+                           break;      /* trouble */
+                         if (level < olevel)
+                           n = installed->start;       /* redo all */
+                         i--;
+                         n--;
+                         continue;
+                       }
+                     if (dq->count)
+                       queue_empty(dq);
                    }
+                 /* continue with checking the update rule */
                }
-             else
+             /* update to best package of the update rule */
+             FOR_RULELITERALS(p, pp, rr)
                {
-                 /* update to best package of the update rule */
-                 FOR_RULELITERALS(p, pp, rr)
+                 if (solv->decisionmap[p] > 0)
                    {
-                     if (solv->decisionmap[p] > 0)
-                       {
-                         dq->count = 0;                /* already fulfilled */
-                         break;
-                       }
-                     if (!solv->decisionmap[p])
-                       queue_push(dq, p);
+                     dq->count = 0;            /* already fulfilled */
+                     break;
                    }
+                 if (!solv->decisionmap[p])
+                   queue_push(dq, p);
                }
              if (dq->count && solv->update_targets && solv->update_targets->elements[i - installed->start])
                prune_to_update_targets(solv, solv->update_targets->elements + solv->update_targets->elements[i - installed->start], dq);