- frontport solver_trivial_installable() change
authorMichael Schroeder <mls@suse.de>
Mon, 2 Mar 2009 15:05:09 +0000 (16:05 +0100)
committerMichael Schroeder <mls@suse.de>
Mon, 2 Mar 2009 15:05:09 +0000 (16:05 +0100)
src/pool.c
src/pool.h
src/solver.c
src/solver.h
src/solverdebug.c

index e1d85b0..25dced4 100644 (file)
@@ -1392,7 +1392,23 @@ static inline Id dep2name(Pool *pool, Id dep)
   return dep;
 }
 
-static inline int providedbyinstalled(Pool *pool, unsigned char *map, Id dep, int ispatch)
+static int providedbyinstalled_multiversion(Pool *pool, unsigned char *map, Id n, Id dep) 
+{
+  Id p, pp;
+  Solvable *sn = pool->solvables + n; 
+
+  FOR_PROVIDES(p, pp, sn->name)
+    {    
+      Solvable *s = pool->solvables + p; 
+      if (s->name != sn->name || s->arch != sn->arch)
+        continue;
+      if ((map[p] & 9) == 9)
+        return 1;
+    }    
+  return 0;
+}
+
+static inline int providedbyinstalled(Pool *pool, unsigned char *map, Id dep, int ispatch, Map *noobsoletesmap)
 {
   Id p, pp;
   int r = 0;
@@ -1402,6 +1418,9 @@ static inline int providedbyinstalled(Pool *pool, unsigned char *map, Id dep, in
         return 1;      /* always boring, as never constraining */
       if (ispatch && !pool_match_nevr(pool, pool->solvables + p, dep))
        continue;
+      if (ispatch && noobsoletesmap && noobsoletesmap->size && MAPTST(noobsoletesmap, p) && ISRELDEP(dep))
+       if (providedbyinstalled_multiversion(pool, map, p, dep))
+         continue;
       if ((map[p] & 9) == 9)
        return 9;
       r |= map[p] & 17;
@@ -1421,7 +1440,7 @@ static inline int providedbyinstalled(Pool *pool, unsigned char *map, Id dep, in
  */
 
 void
-pool_trivial_installable(Pool *pool, Map *installedmap, Queue *pkgs, Queue *res)
+pool_trivial_installable_noobsoletesmap(Pool *pool, Map *installedmap, Queue *pkgs, Queue *res, Map *noobsoletesmap)
 {
   int i, r, m, did;
   Id p, *dp, con, *conp, req, *reqp;
@@ -1469,7 +1488,7 @@ pool_trivial_installable(Pool *pool, Map *installedmap, Queue *pkgs, Queue *res)
            {
              if (req == SOLVABLE_PREREQMARKER)
                continue;
-             r = providedbyinstalled(pool, map, req, 0);
+             r = providedbyinstalled(pool, map, req, 0, 0);
              if (!r)
                {
                  /* decided and miss */
@@ -1492,7 +1511,7 @@ pool_trivial_installable(Pool *pool, Map *installedmap, Queue *pkgs, Queue *res)
          conp = s->repo->idarraydata + s->conflicts;
          while ((con = *conp++) != 0)
            {
-             if ((providedbyinstalled(pool, map, con, ispatch) & 1) != 0)
+             if ((providedbyinstalled(pool, map, con, ispatch, noobsoletesmap) & 1) != 0)
                {
                  map[p] = 2;
                  break;
@@ -1500,7 +1519,7 @@ pool_trivial_installable(Pool *pool, Map *installedmap, Queue *pkgs, Queue *res)
              if ((m == 1 || m == 17) && ISRELDEP(con))
                {
                  con = dep2name(pool, con);
-                 if ((providedbyinstalled(pool, map, con, ispatch) & 1) != 0)
+                 if ((providedbyinstalled(pool, map, con, ispatch, noobsoletesmap) & 1) != 0)
                    m = 9;
                }
            }
@@ -1517,7 +1536,7 @@ pool_trivial_installable(Pool *pool, Map *installedmap, Queue *pkgs, Queue *res)
              obsp = s->repo->idarraydata + s->obsoletes;
              while ((obs = *obsp++) != 0)
                {
-                 if ((providedbyinstalled(pool, map, obs, 0) & 1) != 0)
+                 if ((providedbyinstalled(pool, map, obs, 0, 0) & 1) != 0)
                    {
                      map[p] = 2;
                      break;
@@ -1561,4 +1580,10 @@ pool_trivial_installable(Pool *pool, Map *installedmap, Queue *pkgs, Queue *res)
   free(map);
 }
 
+void
+pool_trivial_installable(Pool *pool, Map *installedmap, Queue *pkgs, Queue *res)
+{
+  pool_trivial_installable_noobsoletesmap(pool, installedmap, pkgs, res, 0);
+}
+
 // EOF
index c8f2c0d..8570324 100644 (file)
@@ -293,6 +293,7 @@ typedef struct _duchanges {
 void pool_calc_duchanges(Pool *pool, Map *installedmap, DUChanges *mps, int nmps);
 int pool_calc_installsizechange(Pool *pool, Map *installedmap);
 void pool_trivial_installable(Pool *pool, Map *installedmap, Queue *pkgs, Queue *res);
+void pool_trivial_installable_noobsoletesmap(Pool *pool, Map *installedmap, Queue *pkgs, Queue *res, Map *noobsoletesmap);
 
 
 /* loop over all providers of d */
index 165e39e..7906e54 100644 (file)
@@ -5360,6 +5360,16 @@ solver_calc_installsizechange(Solver *solv)
   return change;
 }
 
+void
+solver_trivial_installable(Solver *solv, Queue *pkgs, Queue *res)
+{
+  Map installedmap;
+  solver_create_state_maps(solv, &installedmap, 0);
+  pool_trivial_installable_noobsoletesmap(solv->pool, &installedmap, pkgs, res, solv->noobsoletes.size ? &solv->noobsoletes : 0);
+  map_free(&installedmap);
+}
+
+
 #define FIND_INVOLVED_DEBUG 0
 void
 solver_find_involved(Solver *solv, Queue *installedq, Solvable *ts, Queue *q)
index 1f4d96e..13ac96c 100644 (file)
@@ -350,6 +350,7 @@ solver_is_enhancing(Solver *solv, Solvable *s)
 
 void solver_calc_duchanges(Solver *solv, DUChanges *mps, int nmps);
 int solver_calc_installsizechange(Solver *solv);
+void solver_trivial_installable(Solver *solv, Queue *pkgs, Queue *res);
 
 void solver_find_involved(Solver *solv, Queue *installedq, Solvable *s, Queue *q);
 
index 6a49729..5b2a73e 100644 (file)
@@ -573,7 +573,6 @@ solver_printtrivial(Solver *solv)
 {
   Pool *pool = solv->pool;
   Queue in, out;
-  Map installedmap;
   Id p;
   const char *n; 
   Solvable *s; 
@@ -592,14 +591,12 @@ solver_printtrivial(Solver *solv)
       queue_free(&in);
       return;
     }
-  solver_create_state_maps(solv, &installedmap, 0); 
   queue_init(&out);
-  pool_trivial_installable(pool, &installedmap, &in, &out);
+  solver_trivial_installable(solv, &in, &out);
   POOL_DEBUG(SAT_DEBUG_RESULT, "trivial installable status:\n");
   for (i = 0; i < in.count; i++)
     POOL_DEBUG(SAT_DEBUG_RESULT, "  %s: %d\n", solvable2str(pool, pool->solvables + in.elements[i]), out.elements[i]);
   POOL_DEBUG(SAT_DEBUG_RESULT, "\n");
-  map_free(&installedmap);
   queue_free(&in);
   queue_free(&out);
 }