From: Michael Schroeder Date: Wed, 16 Oct 2013 09:57:50 +0000 (+0200) Subject: refactor most of the linked pkg code into a seperate source file X-Git-Tag: 0.6.4~187 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cd702d8aac52e5cf8d888e0c5fd645983d04a0c2;p=thirdparty%2Flibsolv.git refactor most of the linked pkg code into a seperate source file --- diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 16567d9c..c917c7e9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -17,7 +17,7 @@ SET (libsolv_SRCS bitmap.c poolarch.c poolvendor.c poolid.c strpool.c dirpool.c solver.c solverdebug.c repo_solv.c repo_write.c evr.c pool.c queue.c repo.c repodata.c repopage.c util.c policy.c solvable.c - transaction.c rules.c problems.c + transaction.c rules.c problems.c linkedpkg.c chksum.c md5.c sha1.c sha2.c solvversion.c selection.c) SET (libsolv_HEADERS diff --git a/src/rules.c b/src/rules.c index b3f9c7ba..818f5d7e 100644 --- a/src/rules.c +++ b/src/rules.c @@ -26,6 +26,7 @@ #include "evr.h" #include "policy.h" #include "solverdebug.h" +#include "linkedpkg.h" #define RULES_BLOCK 63 @@ -456,13 +457,6 @@ addlinks(Solver *solv, Solvable *s, Id req, Queue *qr, Id prv, Queue *qp, Map *m 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++) @@ -517,206 +511,19 @@ addlinks(Solver *solv, Solvable *s, Id req, Queue *qr, Id prv, Queue *qp, Map *m } 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 /*------------------------------------------------------------------- @@ -810,7 +617,8 @@ solver_addrpmrulesforsolvable(Solver *solv, Solvable *s, Map *m) #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 /*----------------------------------------- @@ -2413,7 +2221,8 @@ getrpmruleinfos(Solver *solv, Rule *r, Queue *rq) { 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;