Imported Upstream version 0.6.35
[platform/upstream/libsolv.git] / src / linkedpkg.c
index 6387373..5912f98 100644 (file)
@@ -37,7 +37,9 @@
 
 #include "pool.h"
 #include "repo.h"
+#include "solver.h"
 #include "evr.h"
+#include "bitmap.h"
 #include "linkedpkg.h"
 
 #ifdef ENABLE_LINKED_PKGS
@@ -190,16 +192,25 @@ find_product_link(Pool *pool, Solvable *s, Id *reqidp, Queue *qr, Id *prvidp, Qu
       /* 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);
-      if (qp)
+      if (refbasename)
        {
-         dataiterator_init(&di, pool, s->repo, 0, PRODUCT_REFERENCEFILE, refbasename, SEARCH_STRING);
+         dataiterator_init(&di, pool, s->repo, 0, SOLVABLE_FILELIST, refbasename, SEARCH_STRING);
          while (dataiterator_step(&di))
-           queue_push(qp, di.solvid);
+           {
+             if (di.key->type != REPOKEY_TYPE_DIRSTRARRAY)
+               continue;
+             if (strcmp(repodata_dir2str(di.data, di.kv.id, 0), "/etc/products.d") != 0)
+               continue;
+             queue_push(qr, di.solvid);
+           }
          dataiterator_free(&di);
+         if (qp)
+           {
+             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 if (qp)
@@ -377,5 +388,30 @@ pool_link_evrcmp(Pool *pool, Solvable *s1, Solvable *s2)
   return 0;
 }
 
+void
+extend_updatemap_to_buddies(Solver *solv)
+{
+  Pool *pool = solv->pool;
+  Repo *installed = solv->installed;
+  Solvable *s;
+  int p, ip;
+
+  if (!installed)
+    return;
+  if (!solv->updatemap.size || !solv->instbuddy)
+    return;
+  FOR_REPO_SOLVABLES(installed, p, s)
+    {
+      if (!MAPTST(&solv->updatemap, p - installed->start))
+       continue;
+      if ((ip = solv->instbuddy[p - installed->start]) <= 1)
+       continue;
+      if (!has_package_link(pool, s))  /* only look at pseudo -> real relations */
+       continue;
+      if (ip < installed->start || ip >= installed->end || pool->solvables[ip].repo != installed)
+       continue;                       /* just in case... */
+      MAPSET(&solv->updatemap, ip - installed->start);
+    }
+}
 
 #endif