]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
Add solvable_matchessolvable() function
authorMichael Schroeder <mls@suse.de>
Tue, 22 Oct 2019 12:08:23 +0000 (14:08 +0200)
committerMichael Schroeder <mls@suse.de>
Tue, 22 Oct 2019 12:08:23 +0000 (14:08 +0200)
Checks if one of the dependencies of a solvable is matched by
the provides of another solvable. It is also possible to get
the list of matching dependencies.

src/libsolv.ver
src/pool.c
src/selection.c
src/solvable.c
src/solvable.h

index eafe3e6885e97b149c4e5af14d8baff97c8e2653..ee40d0ada7e27fbb6155973d3aa313cff216902b 100644 (file)
@@ -325,6 +325,7 @@ SOLV_1.0 {
                solvable_lookup_type;
                solvable_lookup_void;
                solvable_matchesdep;
+               solvable_matchessolvable;
                solvable_selfprovidedep;
                solvable_set_deparray;
                solvable_set_id;
index 76636a78c16e1f55f7915380f6ad554470928a68..0b4b9ddc1cc08191f6c8f455402ea67f7ed6db37 100644 (file)
@@ -1542,7 +1542,7 @@ pool_whatmatchessolvable(Pool *pool, Id keyname, Id solvid, Queue *q, int marker
        continue;
       if (s->repo != pool->installed && !pool_installable(pool, s))
        continue;
-      if (solvable_matchessolvable_int(s, keyname, marker, solvid, 0, &qq, &missc, reloff))
+      if (solvable_matchessolvable_int(s, keyname, marker, solvid, 0, &qq, &missc, reloff, 0))
         queue_push(q, p);
     }
   map_free(&missc);
index e58d731a76c9d64f525ef87a86c8c7ba5c42a632..5f01e2b501f8feb4befa22e4dfb945649ba05f04 100644 (file)
@@ -1502,7 +1502,7 @@ selection_make_matchsolvable_common(Pool *pool, Queue *selection, Queue *solvidq
        continue;
       if (!solvable_matches_selection_flags(pool, s, flags))
        continue;
-      if (solvable_matchessolvable_int(s, keyname, marker, solvid, solvidq ? &m : 0, &q, &missc, reloff))
+      if (solvable_matchessolvable_int(s, keyname, marker, solvid, solvidq ? &m : 0, &q, &missc, reloff, 0))
         queue_push(selection, p);
     }
   queue_free(&q);
index d3d2d31dff6e9fae7639ed8ccec95a8c1aca969e..332e6747e35348ff4ab13f8f4d0589183314edcf 100644 (file)
@@ -645,7 +645,7 @@ solvable_matchesdep(Solvable *s, Id keyname, Id dep, int marker)
 }
 
 int
-solvable_matchessolvable_int(Solvable *s, Id keyname, int marker, Id solvid, Map *solvidmap, Queue *depq, Map *missc, int reloff)
+solvable_matchessolvable_int(Solvable *s, Id keyname, int marker, Id solvid, Map *solvidmap, Queue *depq, Map *missc, int reloff, Queue *outdepq)
 {
   Pool *pool = s->repo->pool;
   int i, boff;
@@ -653,6 +653,8 @@ solvable_matchessolvable_int(Solvable *s, Id keyname, int marker, Id solvid, Map
 
   if (depq->count)
     queue_empty(depq);
+  if (outdepq && outdepq->count)
+    queue_empty(outdepq);
   solvable_lookup_deparray(s, keyname, depq, marker);
   for (i = 0; i < depq->count; i++)
     {
@@ -695,15 +697,46 @@ solvable_matchessolvable_int(Solvable *s, Id keyname, int marker, Id solvid, Map
        {
          for (; *wp; wp++)
            if (MAPTST(solvidmap, *wp))
-             return 1;
+             break;
        }
       else
        {
          for (; *wp; wp++)
            if (*wp == solvid)
-             return 1;
+             break;
+       }
+      if (*wp)
+       {
+         if (outdepq)
+           {
+             queue_pushunique(outdepq, dep);
+             continue;
+           }
+         return 1;
        }
       MAPSET(missc, boff);
     }
-  return 0;
+  return outdepq && outdepq->count ? 1 : 0;
+}
+
+int
+solvable_matchessolvable(Solvable *s, Id keyname, int marker, Id solvid, Queue *depq)
+{
+  Pool *pool = s->repo->pool;
+  Map missc;           /* cache for misses */
+  int res, reloff;
+  Queue qq;
+
+  if (depq && depq->count)
+    queue_empty(depq);
+  if (s - pool->solvables == solvid)
+    return 0;          /* no self-matches */
+
+  queue_init(&qq);
+  reloff = pool->ss.nstrings;
+  map_init(&missc, reloff + pool->nrels);
+  res = solvable_matchessolvable_int(s, keyname, marker, solvid, 0, &qq, &missc, reloff, depq);
+  map_free(&missc);
+  queue_free(&qq);
+  return res;
 }
index bf92a0003584253f222dcf540b9306c955cb9ef4..d5258f2cb0e77ed348d49ace520bb55ce8244859 100644 (file)
@@ -81,9 +81,10 @@ int solvable_identical(Solvable *s1, Solvable *s2);
 Id solvable_selfprovidedep(Solvable *s);
 
 int solvable_matchesdep(Solvable *s, Id keyname, Id dep, int marker);
+int solvable_matchessolvable(Solvable *s, Id keyname, int marker, Id solvid, Queue *depq);
 
 /* internal */
-int solvable_matchessolvable_int(Solvable *s, Id keyname, int marker, Id solvid, Map *solvidmap, Queue *depq, Map *missc, int reloff);
+int solvable_matchessolvable_int(Solvable *s, Id keyname, int marker, Id solvid, Map *solvidmap, Queue *depq, Map *missc, int reloff, Queue *outdepq);
 
 
 /* weird suse stuff */