* created from product data in the repository (which is generated from files
* in /etc/products.d. In the future we may switch to using product()
* provides of packages.
- *
+ *
* pattern:
* created from pattern() provides of packages.
*
Id req = 0;
Id prv = 0;
Id p, pp;
+ Id pkgname = 0;
/* find appdata requires */
if (s->requires)
{
+ Id appdataid = 0;
Id *reqp = s->repo->idarraydata + s->requires;
while ((req = *reqp++) != 0) /* go through all requires */
{
if (ISRELDEP(req))
continue;
if (!strncmp("appdata(", pool_id2str(pool, req), 8))
- break;
+ appdataid = req;
+ else
+ pkgname = req;
}
+ req = appdataid;
}
if (!req)
return;
}
}
if (!prv)
- return;
+ return; /* huh, no provides found? */
/* now link em */
FOR_PROVIDES(p, pp, req)
if (pool->solvables[p].repo == s->repo)
- queue_push(qr, p);
- if (reqidp)
- *reqidp = req;
+ if (!pkgname || pool->solvables[p].name == pkgname)
+ queue_push(qr, p);
+ if (!qr->count && pkgname)
+ {
+ /* huh, no matching package? try without pkgname filter */
+ FOR_PROVIDES(p, pp, req)
+ if (pool->solvables[p].repo == s->repo)
+ queue_push(qr, p);
+ }
if (qp)
{
FOR_PROVIDES(p, pp, prv)
if (pool->solvables[p].repo == s->repo)
- queue_push(qp, pp);
- if (prvidp)
- *prvidp = req;
+ queue_push(qp, p);
}
+ if (reqidp)
+ *reqidp = req;
+ if (prvidp)
+ *prvidp = prv;
}
void
find_product_link(Pool *pool, Solvable *s, Id *reqidp, Queue *qr, Id *prvidp, Queue *qp)
{
- Id n = s - pool->solvables;
Id p, pp, namerelid;
char *str;
- if (pool->nscallback)
- {
- Id buddy = pool->nscallback(pool, pool->nscallbackdata, NAMESPACE_PRODUCTBUDDY, n);
- if (buddy > 0 && buddy != SYSTEMSOLVABLE && buddy != n && buddy < pool->nsolvables)
- {
- if (reqidp)
- *reqidp = solvable_selfprovidedep(pool->solvables + buddy);
- queue_push(qr, buddy);
- if (prvidp)
- *prvidp = solvable_selfprovidedep(s);
- if (qp)
- queue_push(qp, n);
- return;
- }
- }
/* search for project requires */
namerelid = 0;
if (s->requires)
dataiterator_free(&di);
}
}
- else
+ else if (qp)
{
/* find qp */
FOR_PROVIDES(p, pp, s->name)
*prvidp = aprel;
}
+/* the following two functions are used in solvable_lookup_str_base to do
+ * translated lookups on the product/pattern packages
+ */
Id
find_autopattern_name(Pool *pool, Solvable *s)
{
return 0;
for (prvp = s->repo->idarraydata + s->provides; (prv = *prvp++) != 0; )
if (ISRELDEP(prv))
- {
+ {
Reldep *rd = GETRELDEP(pool, prv);
if (rd->flags == REL_EQ && !strcmp(pool_id2str(pool, rd->name), "autopattern()"))
return strncmp(pool_id2str(pool, rd->evr), "pattern:", 8) != 0 ? rd->evr : 0;
- }
+ }
+ return 0;
+}
+
+Id
+find_autoproduct_name(Pool *pool, Solvable *s)
+{
+ Id prv, *prvp;
+ if (!s->provides)
+ return 0;
+ for (prvp = s->repo->idarraydata + s->provides; (prv = *prvp++) != 0; )
+ if (ISRELDEP(prv))
+ {
+ Reldep *rd = GETRELDEP(pool, prv);
+ if (rd->flags == REL_EQ && !strcmp(pool_id2str(pool, rd->name), "autoproduct()"))
+ return strncmp(pool_id2str(pool, rd->evr), "product:", 8) != 0 ? rd->evr : 0;
+ }
return 0;
}