also prune to suggests/enhances, fixes tpctl testcases
authorMichael Schroeder <mls@suse.de>
Mon, 15 Oct 2007 13:25:30 +0000 (13:25 +0000)
committerMichael Schroeder <mls@suse.de>
Mon, 15 Oct 2007 13:25:30 +0000 (13:25 +0000)
src/solver.c
src/solver.h

index 6213b58..dba72df 100644 (file)
@@ -117,11 +117,12 @@ prune_to_recommended(Solver *solv, Queue *plist)
   Pool *pool = solv->pool;
   int i, j;
   Solvable *s;
-  Id p, *pp, sup, *supp, rec, *recp;
+  Id p, *pp, sup, *supp, rec, *recp, sug, *sugp, enh, *enhp;
 
   if (solv->recommends_index < 0)
     {
       MAPZERO(&solv->recommends);
+      MAPZERO(&solv->suggests);
       solv->recommends_index = 0;
     }
   while (solv->recommends_index < solv->decisionq.count)
@@ -130,12 +131,16 @@ prune_to_recommended(Solver *solv, Queue *plist)
       if (p < 0)
        continue;
       s = pool->solvables + p;
-      if (!(recp = s->recommends))
-       continue;
-      while ((rec = *recp++) != 0)
-       FOR_PROVIDES(p, pp, rec)
-         MAPSET(&solv->recommends, p);
-    }
+      if ((recp = s->recommends) != 0)
+        while ((rec = *recp++) != 0)
+         FOR_PROVIDES(p, pp, rec)
+           MAPSET(&solv->recommends, p);
+      if ((sugp = s->suggests) != 0)
+        while ((sug = *sugp++) != 0)
+         FOR_PROVIDES(p, pp, sug)
+           MAPSET(&solv->suggests, p);
+    }
+  /* prune to recommended/supplemented */
   for (i = j = 0; i < plist->count; i++)
     {
       p = plist->elements[i];
@@ -167,6 +172,30 @@ prune_to_recommended(Solver *solv, Queue *plist)
     }
   if (j)
     plist->count = j;
+
+  /* prune to suggested/enhanced*/
+  if (plist->count < 2)
+    return;
+  for (i = j = 0; i < plist->count; i++)
+    {
+      p = plist->elements[i];
+      if (MAPTST(&solv->suggests, p))
+       {
+         plist->elements[j++] = p;
+         continue;
+       }
+      s = pool->solvables + p;
+      if (!(enhp = s->enhances))
+       continue;
+      while ((enh = *enhp++) != 0)
+       if (dep_fulfilled(solv, enh))
+         break;
+      if (!enh)
+       continue;
+      plist->elements[j++] = s - pool->solvables;
+    }
+  if (j)
+    plist->count = j;
 }
 
 /*
@@ -1693,6 +1722,7 @@ solver_create(Pool *pool, Source *system)
   queueinit(&solv->learnt_pool);
 
   mapinit(&solv->recommends, pool->nsolvables);
+  mapinit(&solv->suggests, pool->nsolvables);
   solv->recommends_index = 0;
 
   solv->decisionmap = (Id *)xcalloc(pool->nsolvables, sizeof(Id));
@@ -1716,6 +1746,7 @@ solver_free(Solver *solv)
   queuefree(&solv->learnt_why);
   queuefree(&solv->learnt_pool);
   mapfree(&solv->recommends);
+  mapfree(&solv->suggests);
   xfree(solv->decisionmap);
   xfree(solv->rules);
   xfree(solv->watches);
index 470b087..7c8aa4e 100644 (file)
@@ -77,6 +77,7 @@ typedef struct solver {
   Queue problems;
 
   Map recommends;                      /* recommended packages from decisionmap */
+  Map suggests;                                /* suggested packages from decisionmap */
   int recommends_index;                        /* recommended level */
 
   int rc_output;                       /* output result compatible to redcarpet/zypp testsuite, set == 2 for pure rc (will suppress architecture) */