]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
Also use suggests for ordering packages
authorMichael Schroeder <mls@suse.de>
Thu, 1 Mar 2018 10:00:00 +0000 (11:00 +0100)
committerMichael Schroeder <mls@suse.de>
Thu, 1 Mar 2018 10:00:00 +0000 (11:00 +0100)
package/libsolv.changes
src/order.c

index b647a2932648b1cb66493ddc566341a234ee1b84..55ae6088bbc1e22d5ea0369bfd0a32b2b1c042ea 100644 (file)
@@ -1,8 +1,13 @@
+-------------------------------------------------------------------
+Thu Mar  1 10:52:23 CET 2018 - mls@suse.de
+
+- also use suggests for ordering packages [bnc#1077635]
+
 -------------------------------------------------------------------
 Wed Feb 28 16:29:55 CET 2018 - mls@suse.de
 
 - fix bad assignment in solution refinement that led
-  to a memory leak
+  to a memory leak [bnc#1075978]
 - use license tag instead of doc in the spec file [bnc#1082318]
 - bump version to 0.6.33
 
index 02e11d19fc2fb0fa3e4140ac7b9b2ec6835e67c7..c92c3328dc787212eb6764ad406e0c6cd184c8b3 100644 (file)
@@ -43,10 +43,11 @@ struct _TransactionOrderdata {
 #define TYPE_REQ_P     (1<<2)
 #define TYPE_PREREQ_P  (1<<3)
 
-#define TYPE_REC       (1<<4)
+#define TYPE_SUG       (1<<4)
+#define TYPE_REC       (1<<5)
 
-#define TYPE_REQ       (1<<5)
-#define TYPE_PREREQ    (1<<6)
+#define TYPE_REQ       (1<<6)
+#define TYPE_PREREQ    (1<<7)
 
 #define TYPE_CYCLETAIL  (1<<16)
 #define TYPE_CYCLEHEAD  (1<<17)
@@ -247,7 +248,6 @@ addsolvableedges(struct orderdata *od, Solvable *s)
 {
   Transaction *trans = od->trans;
   Pool *pool = trans->pool;
-  Id req, *reqp, con, *conp, rec, *recp;
   Id p, p2, pp2;
   int i, j, pre, numins;
   Repo *installed = pool->installed;
@@ -262,6 +262,7 @@ addsolvableedges(struct orderdata *od, Solvable *s)
   queue_init(&depq);
   if (s->requires)
     {
+      Id req, *reqp;
       reqp = s->repo->idarraydata + s->requires;
       pre = TYPE_REQ;
       while ((req = *reqp++) != 0)
@@ -385,6 +386,7 @@ addsolvableedges(struct orderdata *od, Solvable *s)
     }
   if (s->conflicts)
     {
+      Id con, *conp;
       conp = s->repo->idarraydata + s->conflicts;
       while ((con = *conp++) != 0)
        {
@@ -423,6 +425,7 @@ addsolvableedges(struct orderdata *od, Solvable *s)
     }
   if (s->recommends && s->repo != installed)
     {
+      Id rec, *recp;
       recp = s->repo->idarraydata + s->recommends;
       while ((rec = *recp++) != 0)
        {
@@ -455,6 +458,41 @@ addsolvableedges(struct orderdata *od, Solvable *s)
            }
        }
     }
+  if (s->suggests && s->repo != installed)
+    {
+      Id sug, *sugp;
+      sugp = s->repo->idarraydata + s->suggests;
+      while ((sug = *sugp++) != 0)
+       {
+         queue_empty(&depq);
+         FOR_PROVIDES(p2, pp2, sug)
+           {
+             s2 = pool->solvables + p2;
+             if (p2 == p)
+               {
+                 depq.count = 0;       /* self provides */
+                 break;
+               }
+             if (s2->repo == installed && !MAPTST(&trans->transactsmap, p2))
+               continue;
+             if (s2->repo != installed && !MAPTST(&trans->transactsmap, p2))
+               continue;               /* package stays uninstalled */
+             if (s2->repo != installed)
+               queue_pushunique(&depq, p2);
+           }
+          for (i = 0; i < depq.count; i++)
+           {
+             p2 = depq.elements[i];
+             if (pool->solvables[p2].repo != installed)
+               {
+#if 0
+                 printf("add suggests inst->inst edge (%s -> %s -> %s)\n", pool_solvid2str(pool, p), pool_dep2str(pool, sug), pool_solvid2str(pool, p2));
+#endif
+                 addedge(od, p, p2, TYPE_SUG);
+               }
+           }
+       }
+    }
   if (s->repo == installed && solvable_lookup_idarray(s, SOLVABLE_TRIGGERS, &depq) && depq.count)
     {
       /* we're getting deinstalled/updated. Try to do this before our