Imported Upstream version 0.6.23
[platform/upstream/libsolv.git] / src / rules.c
index 32855e4..aa90b5f 100644 (file)
@@ -3869,9 +3869,8 @@ complex_cleandeps_addback(Pool *pool, Id ip, Id req, Map *im, Map *installedm, Q
            {
              if (!MAPTST(installedm, -p))
                break;
-             continue;
            }
-         if (MAPTST(im, p))
+         else if (p == ip)
            break;
        }
       if (!p)
@@ -3880,6 +3879,8 @@ complex_cleandeps_addback(Pool *pool, Id ip, Id req, Map *im, Map *installedm, Q
            {
              if (p < 0)
                continue;
+             if (MAPTST(im, p))
+               continue;
              if (!MAPTST(installedm, p))
                continue;
              if (p == ip || MAPTST(userinstalled, p - pool->installed->start))
@@ -4387,6 +4388,36 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded)
 #ifdef CLEANDEPSDEBUG
       printf("adding back %s\n", pool_solvable2str(pool, s));
 #endif
+      if (s->repo == installed && pool->implicitobsoleteusescolors)
+       {
+         Id a, bestarch = 0;
+         FOR_PROVIDES(p, pp, s->name)
+           {
+             Solvable *ps = pool->solvables + p;
+             if (ps->name != s->name || ps->repo == installed)
+               continue;
+             a = ps->arch;
+             a = (a <= pool->lastarch) ? pool->id2arch[a] : 0;
+             if (a && a != 1 && (!bestarch || a < bestarch))
+               bestarch = a;
+           }
+         if (bestarch && (s->arch > pool->lastarch || pool->id2arch[s->arch] != bestarch))
+           {
+             FOR_PROVIDES(p, pp, s->name)
+               {
+                 Solvable *ps = pool->solvables + p;
+                 if (ps->repo == installed && ps->name == s->name && ps->evr == s->evr && ps->arch != s->arch && ps->arch < pool->lastarch && pool->id2arch[ps->arch] == bestarch)
+                   if (!MAPTST(&im, p))
+                     {
+#ifdef CLEANDEPSDEBUG
+                       printf("%s lockstep %s\n", pool_solvid2str(pool, ip), pool_solvid2str(pool, p));
+#endif
+                       MAPSET(&im, p);
+                       queue_push(&iq, p);
+                     }
+               }
+           }
+       }
       if (s->requires)
        {
          reqp = s->repo->idarraydata + s->requires;
@@ -4400,12 +4431,14 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded)
                }
 #endif
              FOR_PROVIDES(p, pp, req)
-               if (MAPTST(&im, p))
+               if (p == ip)
                  break;
              if (p)
                continue;
              FOR_PROVIDES(p, pp, req)
                {
+                 if (MAPTST(&im, p))
+                   continue;
                  if (MAPTST(&installedm, p))
                    {
                      if (p == ip)
@@ -4434,12 +4467,14 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded)
                }
 #endif
              FOR_PROVIDES(p, pp, req)
-               if (MAPTST(&im, p))
+               if (p == ip)
                  break;
              if (p)
                continue;
              FOR_PROVIDES(p, pp, req)
                {
+                 if (MAPTST(&im, p))
+                   continue;
                  if (MAPTST(&installedm, p))
                    {
                      if (p == ip)