refactor most of the linked pkg code into a seperate source file
authorMichael Schroeder <mls@suse.de>
Wed, 16 Oct 2013 09:57:50 +0000 (11:57 +0200)
committerMichael Schroeder <mls@suse.de>
Wed, 16 Oct 2013 09:57:50 +0000 (11:57 +0200)
src/CMakeLists.txt
src/rules.c

index 16567d9..c917c7e 100644 (file)
@@ -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
index b3f9c7b..818f5d7 100644 (file)
@@ -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;