From: Michael Schroeder Date: Tue, 22 Oct 2019 12:08:23 +0000 (+0200) Subject: Add solvable_matchessolvable() function X-Git-Tag: 0.7.8~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f5a6b1656360fed253480ff112c40b8e0e94ffe4;p=thirdparty%2Flibsolv.git Add solvable_matchessolvable() function 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. --- diff --git a/src/libsolv.ver b/src/libsolv.ver index eafe3e68..ee40d0ad 100644 --- a/src/libsolv.ver +++ b/src/libsolv.ver @@ -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; diff --git a/src/pool.c b/src/pool.c index 76636a78..0b4b9ddc 100644 --- a/src/pool.c +++ b/src/pool.c @@ -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); diff --git a/src/selection.c b/src/selection.c index e58d731a..5f01e2b5 100644 --- a/src/selection.c +++ b/src/selection.c @@ -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); diff --git a/src/solvable.c b/src/solvable.c index d3d2d31d..332e6747 100644 --- a/src/solvable.c +++ b/src/solvable.c @@ -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; } diff --git a/src/solvable.h b/src/solvable.h index bf92a000..d5258f2c 100644 --- a/src/solvable.h +++ b/src/solvable.h @@ -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 */