#include "evr.h"
#include "policy.h"
#include "solverdebug.h"
+#include "linkedpkg.h"
#define RULES_BLOCK 63
queue_push(workq, s - pool->solvables);
return;
}
- if (!m && workq)
- {
- /* just push required packages on the work queue */
- for (i = 0; i < qr->count; i++)
- queue_push(workq, qr->elements[i]);
- return;
- }
#if 0
printf("ADDLINKS %s\n -> %s\n", pool_solvable2str(pool, s), pool_dep2str(pool, req));
for (i = 0; i < qr->count; i++)
}
static void
-add_application_link(Solver *solv, Solvable *s, Map *m, Queue *workq)
-{
- Pool *pool = solv->pool;
- Id req = 0;
- Id prv = 0;
- Id p, pp;
- Queue qr, qp;
-
- /* find appdata requires */
- if (s->requires)
- {
- 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;
- }
- }
- if (!req)
- return;
- /* find application-appdata provides */
- if (s->provides)
- {
- Id *prvp = s->repo->idarraydata + s->provides;
- while ((prv = *prvp++) != 0) /* go through all provides */
- {
- if (ISRELDEP(prv))
- continue;
- if (strncmp("application-appdata(", pool_id2str(pool, prv), 20))
- continue;
- if (!strcmp(pool_id2str(pool, prv) + 12, pool_id2str(pool, req)))
- break;
- }
- }
- if (!prv)
- return;
- /* now link em */
- queue_init(&qr);
- queue_init(&qp);
- FOR_PROVIDES(p, pp, req)
- if (pool->solvables[p].repo == s->repo)
- queue_push(&qr, p);
- FOR_PROVIDES(p, pp, prv)
- if (pool->solvables[p].repo == s->repo)
- queue_push(&qp, pp);
- addlinks(solv, s, req, &qr, prv, &qp, m, workq);
- queue_free(&qr);
- queue_free(&qp);
-}
-
-static void
-add_product_link(Solver *solv, Solvable *s, Map *m, Queue *workq)
-{
- Pool *pool = solv->pool;
- Id n = s - pool->solvables;
- Id p, pp, namerelid;
- Queue qp, qr;
- 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)
- {
- queue_init(&qr);
- queue_init(&qp);
- queue_push(&qr, buddy);
- queue_push(&qp, n);
- addlinks(solv, s, solvable_selfprovidedep(pool->solvables + buddy), &qr, solvable_selfprovidedep(s), &qp, m, workq);
- queue_free(&qr);
- queue_free(&qp);
- if (m && !MAPTST(m, buddy))
- queue_push(workq, buddy);
- return;
- }
- }
- /* search for project requires */
- namerelid = 0;
- if (s->requires)
- {
- Id req, *reqp = s->repo->idarraydata + s->requires;
- const char *nn = pool_id2str(pool, s->name);
- int nnl = strlen(nn);
- while ((req = *reqp++) != 0) /* go through all requires */
- if (ISRELDEP(req))
- {
- const char *rn;
- Reldep *rd = GETRELDEP(pool, req);
- if (rd->flags != REL_EQ || rd->evr != s->evr)
- continue;
- rn = pool_id2str(pool, rd->name);
- if (!strncmp(rn, "product(", 8) && !strncmp(rn + 8, nn + 8, nnl - 8) && !strcmp( rn + nnl, ")"))
- {
- namerelid = req;
- break;
- }
- }
- }
- if (!namerelid)
- {
- /* too bad. construct from scratch */
- str = pool_tmpjoin(pool, pool_id2str(pool, s->name), ")", 0);
- str[7] = '(';
- namerelid = pool_rel2id(pool, pool_str2id(pool, str, 1), s->evr, REL_EQ, 1);
- }
- queue_init(&qr);
- queue_init(&qp);
- FOR_PROVIDES(p, pp, namerelid)
- {
- Solvable *ps = pool->solvables + p;
- if (ps->repo != s->repo || ps->arch != s->arch)
- continue;
- queue_push(&qr, p);
- }
- if (!qr.count && s->repo == solv->installed)
- {
- /* oh no! Look up reference file */
- Dataiterator di;
- const char *refbasename = solvable_lookup_str(s, PRODUCT_REFERENCEFILE);
- dataiterator_init(&di, pool, s->repo, 0, SOLVABLE_FILELIST, refbasename, SEARCH_STRING);
- while (dataiterator_step(&di))
- queue_push(&qr, di.solvid);
- dataiterator_free(&di);
- dataiterator_init(&di, pool, s->repo, 0, PRODUCT_REFERENCEFILE, refbasename, SEARCH_STRING);
- while (dataiterator_step(&di))
- queue_push(&qp, di.solvid);
- dataiterator_free(&di);
- }
- else
- {
- /* find qp */
- FOR_PROVIDES(p, pp, s->name)
- {
- Solvable *ps = pool->solvables + p;
- if (s->name != ps->name || ps->repo != s->repo || ps->arch != s->arch || s->evr != ps->evr)
- continue;
- queue_push(&qp, p);
- }
- }
- addlinks(solv, s, namerelid, &qr, solvable_selfprovidedep(s), &qp, m, workq);
- queue_free(&qr);
- queue_free(&qp);
-}
-
-static void
-add_autopattern_link(Solver *solv, Solvable *s, Map *m, Queue *workq)
+add_package_link(Solver *solv, Solvable *s, Map *m, Queue *workq)
{
- Pool *pool = solv->pool;
- Id p, pp, *pr, apevr = 0, aprel = 0;
Queue qr, qp;
-
- /* check if autopattern */
- if (!s->provides)
- return;
- for (pr = s->repo->idarraydata + s->provides; (p = *pr++) != 0; )
- if (ISRELDEP(p))
- {
- Reldep *rd = GETRELDEP(pool, p);
- if (rd->flags == REL_EQ && !strcmp(pool_id2str(pool, rd->name), "autopattern()"))
- {
- aprel = p;
- apevr = rd->evr;
- break;
- }
- }
- if (!apevr)
- return;
+ Id req = 0, prv = 0;
queue_init(&qr);
queue_init(&qp);
- FOR_PROVIDES(p, pp, apevr)
- {
- Solvable *s2 = pool->solvables + p;
- if (s2->repo == s->repo && s2->name == apevr && s2->evr == s->evr && s2->vendor == s->vendor)
- queue_push(&qr, p);
- }
- FOR_PROVIDES(p, pp, aprel)
- {
- Solvable *s2 = pool->solvables + p;
- if (s2->repo == s->repo && s2->evr == s->evr && s2->vendor == s->vendor)
- queue_push(&qp, pp);
- }
- addlinks(solv, s, apevr, &qr, aprel, &qp, m, workq);
+ find_package_link(solv->pool, s, &req, &qr, &prv, &qp);
+ if (qr.count)
+ addlinks(solv, s, req, &qr, prv, &qp, m, workq);
queue_free(&qr);
queue_free(&qp);
}
-static inline void
-add_package_link(Solver *solv, Solvable *s, Map *m, Queue *workq)
-{
- const char *name = pool_id2str(solv->pool, s->name);
- if (name[0] == 'a' && !strncmp("application:", name, 12))
- add_application_link(solv, s, m, workq);
- if (name[0] == 'p' && !strncmp("pattern:", name, 7))
- add_autopattern_link(solv, s, m, workq);
- if (name[0] == 'p' && !strncmp("product:", name, 8))
- add_product_link(solv, s, m, workq);
-}
-
#endif
/*-------------------------------------------------------------------
#ifdef ENABLE_LINKED_PKGS
/* add pseudo-package <-> real-package links */
- add_package_link(solv, s, m, &workq);
+ if (has_package_link(pool, s))
+ add_package_link(solv, s, m, &workq);
#endif
/*-----------------------------------------
{
if (l <= 0 || !strchr(pool_id2str(pool, pool->solvables[l].name), ':'))
break;
- add_package_link(solv, pool->solvables + l, 0, 0);
+ if (has_package_link(pool, pool->solvables + l))
+ add_package_link(solv, pool->solvables + l, 0, 0);
}
#endif
solv->ruleinfoq = 0;