]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
Implement color filtering when adding update targets
authorMichael Schroeder <mls@suse.de>
Mon, 14 Apr 2025 12:14:59 +0000 (14:14 +0200)
committerMichael Schroeder <mls@suse.de>
Mon, 14 Apr 2025 12:14:59 +0000 (14:14 +0200)
The old code created update jobs spanning multiple architectures
even if "implicitobsoleteusescolors" was set.
Also add color filtering in replaces_installed_package, where it
seems to be also missing

Fixes issue #583.

src/solver.c

index 2d78f80a8a998f38935df0109b70d63d30be79c9..2d18e089f8fa1d07df50f684d6037f7f11b79b6d 100644 (file)
@@ -1148,8 +1148,11 @@ replaces_installed_package(Pool *pool, Id p, Map *noupdate)
   FOR_PROVIDES(p2, pp2, s->name)
     {
       s2 = pool->solvables + p2;
-      if (s2->repo == installed && s2->name == s->name && !(noupdate && MAPTST(noupdate, p2 - installed->start)))
-       return 1;
+      if (s2->name != s->name || s2->repo != installed || (noupdate && MAPTST(noupdate, p2 - installed->start)))
+       continue;
+      if (pool->implicitobsoleteusescolors && !pool_colormatch(pool, s, s2))
+       continue;
+      return 1;
     }
   if (!s->obsoletes)
     return 0;
@@ -1159,7 +1162,7 @@ replaces_installed_package(Pool *pool, Id p, Map *noupdate)
       FOR_PROVIDES(p2, pp2, obs)
        {
          s2 = pool->solvables + p2;
-         if (s2->repo != pool->installed || (noupdate && MAPTST(noupdate, p2 - installed->start)))
+         if (s2->repo != installed || (noupdate && MAPTST(noupdate, p2 - installed->start)))
            continue;
          if (!pool->obsoleteusesprovides && !pool_match_nevr(pool, s2, obs))
            continue;
@@ -3354,8 +3357,11 @@ add_update_target(Solver *solv, Id p, Id how)
       FOR_PROVIDES(pi, pip, s->name)
        {
          Solvable *si = pool->solvables + pi;
-         if (si->repo == installed && si->name == s->name && pi != p)
-           queue_push2(solv->update_targets, pi, p);
+         if (si->repo != installed || si->name != s->name || pi == p)
+           continue;
+         if (pool->implicitobsoleteusescolors && !pool_colormatch(pool, s, si))
+           continue;
+         queue_push2(solv->update_targets, pi, p);
        }
       return;
     }
@@ -3366,6 +3372,8 @@ add_update_target(Solver *solv, Id p, Id how)
       Solvable *si = pool->solvables + pi;
       if (si->repo != installed || si->name != s->name)
        continue;
+      if (pool->implicitobsoleteusescolors && !pool_colormatch(pool, s, si))
+       continue;
       if (how & SOLVER_FORCEBEST)
        {
          if (!solv->bestupdatemap.size)