]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
linked packages: fix rule generation
authorMichael Schroeder <mls@suse.de>
Fri, 15 Jan 2016 15:15:41 +0000 (16:15 +0100)
committerMichael Schroeder <mls@suse.de>
Fri, 15 Jan 2016 15:15:41 +0000 (16:15 +0100)
Add multiple rules for different package names instead of ORing
them all together. I hope this works out better for our applications.

src/rules.c

index 6f357203e1e42347eaa43c36cf7a9325024a97b3..4cd53d3313b40fb652313a77f10062e9c8b03804 100644 (file)
@@ -417,6 +417,19 @@ addpkgrule(Solver *solv, Id p, Id p2, Id d, int type, Id dep)
 
 #ifdef ENABLE_LINKED_PKGS
 
+static int
+addlinks_cmp(const void *ap, const void *bp, void *dp)
+{
+  Pool *pool = dp;
+  Id a = *(Id *)ap;
+  Id b = *(Id *)bp;
+  Solvable *sa = pool->solvables + a;
+  Solvable *sb = pool->solvables + b;
+  if (sa->name != sb->name)
+    return sa->name - sb->name;
+  return sa - sb;
+}
+
 static void
 addlinks(Solver *solv, Solvable *s, Id req, Queue *qr, Id prv, Queue *qp, Map *m, Queue *workq)
 {
@@ -424,6 +437,8 @@ addlinks(Solver *solv, Solvable *s, Id req, Queue *qr, Id prv, Queue *qp, Map *m
   int i;
   if (!qr->count)
     return;
+  if (qp->count > 1)
+    solv_sort(qp->elements, qp->count, sizeof(Id), addlinks_cmp, pool);
 #if 0
   printf("ADDLINKS %s\n -> %s\n", pool_solvable2str(pool, s), pool_dep2str(pool, req));
   for (i = 0; i < qr->count; i++)
@@ -439,9 +454,17 @@ addlinks(Solver *solv, Solvable *s, Id req, Queue *qr, Id prv, Queue *qp, Map *m
     addpkgrule(solv, -(s - pool->solvables), 0, pool_queuetowhatprovides(pool, qr), SOLVER_RULE_PKG_REQUIRES, req);
   if (qp->count > 1)
     {
-      Id d = pool_queuetowhatprovides(pool, qp);
-      for (i = 0; i < qr->count; i++)
-       addpkgrule(solv, -qr->elements[i], 0, d, SOLVER_RULE_PKG_REQUIRES, prv);
+      int j;
+      for (i = j = 0; i < qp->count; i = j)
+       {
+         Id d = pool->solvables[qp->elements[i]].name;
+         for (j = i + 1; j < qp->count; j++)
+           if (d != pool->solvables[qp->elements[j]].name)
+             break;
+         d = pool_ids2whatprovides(pool, qp->elements + i, j - i);
+         for (i = 0; i < qr->count; i++)
+           addpkgrule(solv, -qr->elements[i], 0, d, SOLVER_RULE_PKG_REQUIRES, prv);
+       }
     }
   else if (qp->count)
     {