rework branch handling so that the old decisions are still available
[platform/upstream/libsolv.git] / src / policy.c
index 98991c5..5b72517 100644 (file)
@@ -331,34 +331,14 @@ recheck_complex_dep(Solver *solv, Id p, Map *m, Queue **cqp)
 
 #endif
 
-/*
- * prune to recommended/suggested packages.
- * does not prune installed packages (they are also somewhat recommended).
- */
 
-static void
-prune_to_recommended(Solver *solv, Queue *plist)
+void
+policy_update_recommendsmap(Solver *solv)
 {
   Pool *pool = solv->pool;
-  int i, j, k, ninst;
   Solvable *s;
   Id p, pp, rec, *recp, sug, *sugp;
 
-  ninst = 0;
-  if (pool->installed)
-    {
-      for (i = 0; i < plist->count; i++)
-       {
-         p = plist->elements[i];
-         s = pool->solvables + p;
-         if (pool->installed && s->repo == pool->installed)
-           ninst++;
-       }
-    }
-  if (plist->count - ninst < 2)
-    return;
-
-  /* update our recommendsmap/suggestsmap */
   if (solv->recommends_index < 0)
     {
       MAPZERO(&solv->recommendsmap);
@@ -424,6 +404,38 @@ prune_to_recommended(Solver *solv, Queue *plist)
            }
        }
     }
+}
+
+/*
+ * prune to recommended/suggested packages.
+ * does not prune installed packages (they are also somewhat recommended).
+ */
+
+static void
+prune_to_recommended(Solver *solv, Queue *plist)
+{
+  Pool *pool = solv->pool;
+  int i, j, k, ninst;
+  Solvable *s;
+  Id p;
+
+  ninst = 0;
+  if (pool->installed)
+    {
+      for (i = 0; i < plist->count; i++)
+       {
+         p = plist->elements[i];
+         s = pool->solvables + p;
+         if (pool->installed && s->repo == pool->installed)
+           ninst++;
+       }
+    }
+  if (plist->count - ninst < 2)
+    return;
+
+  /* update our recommendsmap/suggestsmap */
+  if (solv->recommends_index < solv->decisionq.count)
+    policy_update_recommendsmap(solv);
 
   /* prune to recommended/supplemented */
   ninst = 0;
@@ -1058,7 +1070,8 @@ policy_findupdatepackages(Solver *solv, Solvable *s, Queue *qs, int allow_all)
       ps = pool->solvables + p;
       if (s->name == ps->name) /* name match */
        {
-         /* XXX: check implicitobsoleteusescolors? */
+         if (pool->implicitobsoleteusescolors && !pool_colormatch(pool, s, ps))
+           continue;
          if (!allowdowngrade && pool_evrcmp(pool, s->evr, ps->evr, EVRCMP_COMPARE) > 0)
            continue;
        }
@@ -1066,6 +1079,11 @@ policy_findupdatepackages(Solver *solv, Solvable *s, Queue *qs, int allow_all)
        continue;
       else if (!solv->noupdateprovide && ps->obsoletes)   /* provides/obsoletes combination ? */
        {
+         /* check if package ps obsoletes installed package s */
+         /* implicitobsoleteusescolors is somewhat wrong here, but we nevertheless
+          * use it to limit our update candidates */
+         if ((pool->obsoleteusescolors || pool->implicitobsoleteusescolors) && !pool_colormatch(pool, s, ps))
+           continue;
          obsp = ps->repo->idarraydata + ps->obsoletes;
          while ((obs = *obsp++) != 0)  /* for all obsoletes */
            {
@@ -1074,8 +1092,6 @@ policy_findupdatepackages(Solver *solv, Solvable *s, Queue *qs, int allow_all)
                  Solvable *ps2 = pool->solvables + p2;
                  if (!pool->obsoleteusesprovides && !pool_match_nevr(pool, ps2, obs))
                    continue;
-                 if (pool->obsoleteusescolors && !pool_colormatch(pool, s, ps2))
-                   continue;
                  if (p2 == n)          /* match ! */
                    break;
                }
@@ -1113,6 +1129,10 @@ policy_findupdatepackages(Solver *solv, Solvable *s, Queue *qs, int allow_all)
            continue;
          if (!allowvendorchange && s->vendor != ps->vendor && policy_illegal_vendorchange(solv, s, ps))
            continue;
+         /* implicitobsoleteusescolors is somewhat wrong here, but we nevertheless
+          * use it to limit our update candidates */
+         if (pool->implicitobsoleteusescolors && !pool_colormatch(pool, s, ps))
+           continue;
          queue_push(qs, p);
        }
     }