Skip to content

Commit 0416f0d

Browse files
committed
Add pool_whatmatchessolvable() function to match against the provides of a solvable
1 parent facc582 commit 0416f0d

4 files changed

Lines changed: 119 additions & 1 deletion

File tree

examples/solv/solv.c

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,40 @@ find_repo(const char *name, Pool *pool, struct repoinfo *repoinfos, int nrepoinf
169169
return 0;
170170
}
171171

172+
static int
173+
selection_alldeps(Pool *pool, Queue *selection, const char *name, int flags, int keyname, int marker)
174+
{
175+
int i, j, r;
176+
Queue pkgs, q;
177+
178+
queue_empty(selection);
179+
queue_init(&q);
180+
r = selection_make(pool, &q, name, flags);
181+
if (!q.count)
182+
{
183+
queue_free(&q);
184+
return 0;
185+
}
186+
queue_init(&pkgs);
187+
selection_solvables(pool, &q, &pkgs);
188+
for (i = 0; i < pkgs.count; i++)
189+
{
190+
queue_empty(&q);
191+
pool_whatmatchessolvable(pool, keyname, pkgs.elements[i], &q, marker);
192+
for (j = 0; j < q.count; j++)
193+
if (q.elements[j] != pkgs.elements[i])
194+
queue_pushunique(selection, q.elements[j]);
195+
}
196+
queue_free(&q);
197+
j = selection->count;
198+
queue_insertn(selection, 0, j, 0);
199+
for (i = 0; i < j; i++)
200+
{
201+
selection->elements[2 * i] = SOLVER_SOLVABLE | SOLVER_NOAUTOSET;
202+
selection->elements[2 * i + 1] = selection->elements[i + j];
203+
}
204+
return j ? r : 0;
205+
}
172206

173207
#define MODE_LIST 0
174208
#define MODE_INSTALL 1
@@ -227,6 +261,7 @@ main(int argc, char **argv)
227261
char *rootdir = 0;
228262
char *keyname = 0;
229263
int keyname_depstr = 0;
264+
int keyname_alldeps = 0; /* dnf repoquesy --alldeps */
230265
int debuglevel = 0;
231266
int answer, acnt = 0;
232267
char *testcase = 0;
@@ -316,9 +351,15 @@ main(int argc, char **argv)
316351
argc--;
317352
argv++;
318353
}
354+
else if (argc > 1 && !strcmp(argv[1], "--alldeps"))
355+
{
356+
keyname_alldeps = 1; /* dnf repoquesy --alldeps */
357+
argc--;
358+
argv++;
359+
}
319360
else if (argc > 1 && !strcmp(argv[1], "--depstr"))
320361
{
321-
keyname_depstr = 1;
362+
keyname_depstr = 1; /* do literal matching instead of dep intersection */
322363
argc--;
323364
argv++;
324365
}
@@ -541,6 +582,8 @@ main(int argc, char **argv)
541582
flags |= SELECTION_MATCH_DEPSTR;
542583
if (!keyname)
543584
rflags = selection_make(pool, &job2, argv[i], flags);
585+
else if (keyname_alldeps)
586+
rflags = selection_alldeps(pool, &job2, argv[i], flags, pool_str2id(pool, keyname, 1), 0);
544587
else
545588
rflags = selection_make_matchdeps(pool, &job2, argv[i], flags, pool_str2id(pool, keyname, 1), 0);
546589
if (repofilter.count)
@@ -554,6 +597,8 @@ main(int argc, char **argv)
554597
flags |= SELECTION_NOCASE;
555598
if (!keyname)
556599
rflags = selection_make(pool, &job2, argv[i], flags);
600+
else if (keyname_alldeps)
601+
rflags = selection_alldeps(pool, &job2, argv[i], flags, pool_str2id(pool, keyname, 1), 0);
557602
else
558603
rflags = selection_make_matchdeps(pool, &job2, argv[i], flags, pool_str2id(pool, keyname, 1), 0);
559604
if (repofilter.count)

src/libsolv.ver

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ SOLV_1.0 {
120120
pool_trivial_installable_multiversionmap;
121121
pool_vendor2mask;
122122
pool_whatmatchesdep;
123+
pool_whatmatchessolvable;
123124
pool_whatcontainsdep;
124125
queue_alloc_one;
125126
queue_alloc_one_head;

src/pool.c

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1485,6 +1485,77 @@ pool_whatcontainsdep(Pool *pool, Id keyname, Id dep, Queue *q, int marker)
14851485
queue_free(&qq);
14861486
}
14871487

1488+
/* intersect dependencies in keyname with all provides of solvable solvid,
1489+
* return list of matching packages */
1490+
/* this currently only works for installable packages */
1491+
void
1492+
pool_whatmatchessolvable(Pool *pool, Id keyname, Id solvid, Queue *q, int marker)
1493+
{
1494+
Id p, *wp;
1495+
Queue qq;
1496+
int i;
1497+
Map missc; /* cache for misses */
1498+
int reloff, boff;
1499+
1500+
queue_empty(q);
1501+
queue_init(&qq);
1502+
reloff = pool->ss.nstrings;
1503+
map_init(&missc, reloff + pool->nrels);
1504+
FOR_POOL_SOLVABLES(p)
1505+
{
1506+
Solvable *s = pool->solvables + p;
1507+
if (p == solvid)
1508+
continue; /* filter out self-matches */
1509+
if (s->repo->disabled)
1510+
continue;
1511+
if (s->repo != pool->installed && !pool_installable(pool, s))
1512+
continue;
1513+
if (qq.count)
1514+
queue_empty(&qq);
1515+
solvable_lookup_deparray(s, keyname, &qq, marker);
1516+
for (i = 0; i < qq.count; i++)
1517+
{
1518+
Id dep = qq.elements[i];
1519+
boff = ISRELDEP(dep) ? reloff + GETRELID(dep) : dep;
1520+
if (MAPTST(&missc, boff))
1521+
continue;
1522+
if (ISRELDEP(dep))
1523+
{
1524+
Reldep *rd = GETRELDEP(pool, dep);
1525+
if (!ISRELDEP(rd->name) && rd->flags < 8)
1526+
{
1527+
/* do pre-filtering on the base */
1528+
if (MAPTST(&missc, rd->name))
1529+
continue;
1530+
wp = pool_whatprovides_ptr(pool, rd->name);
1531+
for (wp = pool_whatprovides_ptr(pool, dep); *wp; wp++)
1532+
if (*wp == solvid)
1533+
break;
1534+
if (!*wp)
1535+
{
1536+
/* the base does not include solvid, no need to check the complete dep */
1537+
MAPSET(&missc, rd->name);
1538+
MAPSET(&missc, boff);
1539+
continue;
1540+
}
1541+
}
1542+
}
1543+
wp = pool_whatprovides_ptr(pool, dep);
1544+
for (wp = pool_whatprovides_ptr(pool, dep); *wp; wp++)
1545+
if (*wp == solvid)
1546+
break;
1547+
if (*wp)
1548+
{
1549+
queue_push(q, p);
1550+
break;
1551+
}
1552+
MAPSET(&missc, boff);
1553+
}
1554+
}
1555+
map_free(&missc);
1556+
queue_free(&qq);
1557+
}
1558+
14881559
/*************************************************************************/
14891560

14901561
void

src/pool.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,7 @@ static inline Id *pool_whatprovides_ptr(Pool *pool, Id d)
348348

349349
void pool_whatmatchesdep(Pool *pool, Id keyname, Id dep, Queue *q, int marker);
350350
void pool_whatcontainsdep(Pool *pool, Id keyname, Id dep, Queue *q, int marker);
351+
void pool_whatmatchessolvable(Pool *pool, Id keyname, Id solvid, Queue *q, int marker);
351352
void pool_set_whatprovides(Pool *pool, Id id, Id providers);
352353

353354

0 commit comments

Comments
 (0)