]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
Simplify handling of pseudo package updates
authorMichael Schroeder <mls@suse.de>
Thu, 10 Mar 2016 12:03:04 +0000 (13:03 +0100)
committerMichael Schroeder <mls@suse.de>
Thu, 10 Mar 2016 12:03:04 +0000 (13:03 +0100)
We extend the updatemap to the instbuddies instead of doing complex
stuff in the package update code. Lets see if this is sufficient...

src/linkedpkg.c
src/linkedpkg.h
src/rules.c
src/solver.c

index 6387373c71be5cda2385bb67281f6bf59412e661..635e69b82c2b8222c6a79a06c0f8848c59e82f15 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
@@ -377,5 +379,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
index d0f5960d2e520e26342099318824b5711f7dca0b..51b82a5d197a18fab5879cb5e6ef89a113916840 100644 (file)
@@ -35,5 +35,6 @@ extern Id find_autoproduct_name(Pool *pool, Solvable *s);
 /* generic */
 extern void find_package_link(Pool *pool, Solvable *s, Id *reqidp, Queue *qr, Id *prvidp, Queue *qp);
 extern int pool_link_evrcmp(Pool *pool, Solvable *s1, Solvable *s2);
+extern void extend_updatemap_to_buddies(Solver *solv);
 
 #endif
index 0e2c9559fabef208e14c3f12c57b385bed925c3e..f06c03f85285d44206982e096551c27c6d123401 100644 (file)
@@ -1346,18 +1346,20 @@ solver_addupdaterule(Solver *solv, Solvable *s)
   Id qsbuf[64];
   int isorphaned = 0;
   Rule *r;
-  int islinkedpseudo = 0;
 
   p = s - pool->solvables;
-#ifdef ENABLE_LINKED_PKGS
-  islinkedpseudo = is_linked_pseudo_package(solv, s);
-#endif
-
   /* Orphan detection. We cheat by looking at the feature rule, which
    * we already calculated */
   r = solv->rules + solv->featurerules + (p - solv->installed->start);
-  if (!r->p && !islinkedpseudo)
+  if (!r->p)
     {
+#ifdef ENABLE_LINKED_PKGS
+      if (is_linked_pseudo_package(solv, s))
+       {
+         solver_addrule(solv, 0, 0, 0);
+         return;
+       }
+#endif
       p = 0;
       queue_push(&solv->orphaned, s - pool->solvables);                /* an orphaned package */
       if (solv->keep_orphans && !(solv->droporphanedmap_all || (solv->droporphanedmap.size && MAPTST(&solv->droporphanedmap, s - pool->solvables - solv->installed->start))))
@@ -1373,24 +1375,6 @@ solver_addupdaterule(Solver *solv, Solvable *s)
   else
     policy_findupdatepackages(solv, s, &qs, 0);
 
-#ifdef ENABLE_LINKED_PKGS
-  if (islinkedpseudo)
-    {
-      /* a linked pseudo package. As it is linked, we do not need an update/feature rule */
-      /* nevertheless we set specialupdaters so we can update */
-      solver_addrule(solv, 0, 0, 0);
-      if (qs.count)
-       {
-         if (p != -SYSTEMSOLVABLE)
-           queue_unshift(&qs, p);
-         if (qs.count)
-           set_specialupdaters(solv, s, pool_queuetowhatprovides(pool, &qs));
-       }
-      queue_free(&qs);
-      return;
-    }
-#endif
-
   if (qs.count && solv->multiversion.size)
     {
       int i, j;
index c6f59e20651e71543aea38baf63e4c19f5cc9085..c1fcd5826827991728b95bebde8c2e89582092fc 100644 (file)
@@ -2193,8 +2193,8 @@ solver_run_sat(Solver *solv, int disablerules, int doweak)
                    rr -= solv->installed->end - solv->installed->start;
                  if (!rr->p)           /* identical to update rule? */
                    rr = r;
-                 if (!rr->p && !(specialupdaters && specialupdaters[i - installed->start]))
-                   continue;           /* orpaned package */
+                 if (!rr->p)
+                   continue;           /* orpaned package or pseudo package */
 
                  /* check if we should update this package to the latest version
                   * noupdate is set for erase jobs, in that case we want to deinstall
@@ -2203,30 +2203,7 @@ solver_run_sat(Solver *solv, int disablerules, int doweak)
                  queue_empty(&dq);
                  if (!MAPTST(&solv->noupdate, i - installed->start) && (solv->decisionmap[i] < 0 || solv->updatemap_all || (solv->updatemap.size && MAPTST(&solv->updatemap, i - installed->start)) || (rr->p && rr->p != i)))
                    {
-                     if (!rr->p)
-                       {
-                         /* specialupdater with no update/feature rule, i.e. a pseudo package */
-                         /* ignore if we also update the linked package */
-                         /* XXX: better map package in the updatemap? */
-                         if (solv->instbuddy && solv->instbuddy[s - pool->solvables - installed->start] > 1)
-                           {
-                             Id ip = solv->instbuddy[s - pool->solvables - installed->start];
-                             if (ip >= installed->start && ip < installed->end)
-                               if (MAPTST(&solv->noupdate, ip - installed->start) || solv->updatemap_all || (solv->updatemap.size && MAPTST(&solv->updatemap, ip - installed->start)))
-                                 continue;
-                           }
-                         for (d = specialupdaters[i - installed->start]; (p = pool->whatprovidesdata[d++]) != 0; )
-                           {
-                             if (solv->decisionmap[p] > 0)
-                               {
-                                 dq.count = 0;
-                                 break;
-                               }
-                             if (!solv->decisionmap[p])
-                               queue_push(&dq, p);
-                           }
-                       }
-                     else if (specialupdaters && (d = specialupdaters[i - installed->start]) != 0)
+                     if (specialupdaters && (d = specialupdaters[i - installed->start]) != 0)
                        {
                          /* special multiversion handling, make sure best version is chosen */
                          if (rr->p == i && solv->decisionmap[i] >= 0)
@@ -4000,6 +3977,11 @@ solver_solve(Solver *solv, Queue *job)
   else
     solv->duprules = solv->duprules_end = solv->nrules;
 
+#ifdef ENABLE_LINKED_PKGS
+  if (solv->instbuddy && solv->updatemap.size)
+    extend_updatemap_to_buddies(solv);
+#endif
+
   if (solv->bestupdatemap_all || solv->bestupdatemap.size || hasbestinstalljob)
     solver_addbestrules(solv, hasbestinstalljob);
   else