Skip to content

Commit f5a6b16

Browse files
committed
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.
1 parent ea03772 commit f5a6b16

5 files changed

Lines changed: 42 additions & 7 deletions

File tree

src/libsolv.ver

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@ SOLV_1.0 {
325325
solvable_lookup_type;
326326
solvable_lookup_void;
327327
solvable_matchesdep;
328+
solvable_matchessolvable;
328329
solvable_selfprovidedep;
329330
solvable_set_deparray;
330331
solvable_set_id;

src/pool.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1542,7 +1542,7 @@ pool_whatmatchessolvable(Pool *pool, Id keyname, Id solvid, Queue *q, int marker
15421542
continue;
15431543
if (s->repo != pool->installed && !pool_installable(pool, s))
15441544
continue;
1545-
if (solvable_matchessolvable_int(s, keyname, marker, solvid, 0, &qq, &missc, reloff))
1545+
if (solvable_matchessolvable_int(s, keyname, marker, solvid, 0, &qq, &missc, reloff, 0))
15461546
queue_push(q, p);
15471547
}
15481548
map_free(&missc);

src/selection.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1502,7 +1502,7 @@ selection_make_matchsolvable_common(Pool *pool, Queue *selection, Queue *solvidq
15021502
continue;
15031503
if (!solvable_matches_selection_flags(pool, s, flags))
15041504
continue;
1505-
if (solvable_matchessolvable_int(s, keyname, marker, solvid, solvidq ? &m : 0, &q, &missc, reloff))
1505+
if (solvable_matchessolvable_int(s, keyname, marker, solvid, solvidq ? &m : 0, &q, &missc, reloff, 0))
15061506
queue_push(selection, p);
15071507
}
15081508
queue_free(&q);

src/solvable.c

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -645,14 +645,16 @@ solvable_matchesdep(Solvable *s, Id keyname, Id dep, int marker)
645645
}
646646

647647
int
648-
solvable_matchessolvable_int(Solvable *s, Id keyname, int marker, Id solvid, Map *solvidmap, Queue *depq, Map *missc, int reloff)
648+
solvable_matchessolvable_int(Solvable *s, Id keyname, int marker, Id solvid, Map *solvidmap, Queue *depq, Map *missc, int reloff, Queue *outdepq)
649649
{
650650
Pool *pool = s->repo->pool;
651651
int i, boff;
652652
Id *wp;
653653

654654
if (depq->count)
655655
queue_empty(depq);
656+
if (outdepq && outdepq->count)
657+
queue_empty(outdepq);
656658
solvable_lookup_deparray(s, keyname, depq, marker);
657659
for (i = 0; i < depq->count; i++)
658660
{
@@ -695,15 +697,46 @@ solvable_matchessolvable_int(Solvable *s, Id keyname, int marker, Id solvid, Map
695697
{
696698
for (; *wp; wp++)
697699
if (MAPTST(solvidmap, *wp))
698-
return 1;
700+
break;
699701
}
700702
else
701703
{
702704
for (; *wp; wp++)
703705
if (*wp == solvid)
704-
return 1;
706+
break;
707+
}
708+
if (*wp)
709+
{
710+
if (outdepq)
711+
{
712+
queue_pushunique(outdepq, dep);
713+
continue;
714+
}
715+
return 1;
705716
}
706717
MAPSET(missc, boff);
707718
}
708-
return 0;
719+
return outdepq && outdepq->count ? 1 : 0;
720+
}
721+
722+
int
723+
solvable_matchessolvable(Solvable *s, Id keyname, int marker, Id solvid, Queue *depq)
724+
{
725+
Pool *pool = s->repo->pool;
726+
Map missc; /* cache for misses */
727+
int res, reloff;
728+
Queue qq;
729+
730+
if (depq && depq->count)
731+
queue_empty(depq);
732+
if (s - pool->solvables == solvid)
733+
return 0; /* no self-matches */
734+
735+
queue_init(&qq);
736+
reloff = pool->ss.nstrings;
737+
map_init(&missc, reloff + pool->nrels);
738+
res = solvable_matchessolvable_int(s, keyname, marker, solvid, 0, &qq, &missc, reloff, depq);
739+
map_free(&missc);
740+
queue_free(&qq);
741+
return res;
709742
}

src/solvable.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,10 @@ int solvable_identical(Solvable *s1, Solvable *s2);
8181
Id solvable_selfprovidedep(Solvable *s);
8282

8383
int solvable_matchesdep(Solvable *s, Id keyname, Id dep, int marker);
84+
int solvable_matchessolvable(Solvable *s, Id keyname, int marker, Id solvid, Queue *depq);
8485

8586
/* internal */
86-
int solvable_matchessolvable_int(Solvable *s, Id keyname, int marker, Id solvid, Map *solvidmap, Queue *depq, Map *missc, int reloff);
87+
int solvable_matchessolvable_int(Solvable *s, Id keyname, int marker, Id solvid, Map *solvidmap, Queue *depq, Map *missc, int reloff, Queue *outdepq);
8788

8889

8990
/* weird suse stuff */

0 commit comments

Comments
 (0)