make sure that the selection only contains installed packages if SELECTION_INSTALLED_...
[platform/upstream/libsolv.git] / src / rules.c
index 9b41ccd..677807c 100644 (file)
@@ -719,7 +719,7 @@ solver_addrpmrulesforsolvable(Solver *solv, Solvable *s, Map *m)
                    continue;
                  if (!pool->implicitobsoleteusesprovides && s->name != ps->name)
                    continue;
-                 if (pool->obsoleteusescolors && !pool_colormatch(pool, s, ps))
+                 if (pool->implicitobsoleteusescolors && !pool_colormatch(pool, s, ps))
                    continue;
                  if (s->name == ps->name)
                    addrpmrule(solv, -n, -p, SOLVER_RULE_RPM_SAME_NAME, 0);
@@ -945,8 +945,15 @@ solver_addupdaterule(Solver *solv, Solvable *s, int allow_all)
        {
          if (MAPTST(&solv->multiversion, qs.elements[i]))
            {
-             /* it's ok if they have same nevra */
              Solvable *ps = pool->solvables + qs.elements[i];
+             /* if keepexplicitobsoletes is set and the name is different,
+              * we assume that there is an obsoletes. XXX: not 100% correct */
+             if (solv->keepexplicitobsoletes && ps->name != s->name)
+               {
+                 qs.elements[j++] = qs.elements[i];
+                 continue;
+               }
+             /* it's ok if they have same nevra */
              if (ps->name != s->name || ps->evr != s->evr || ps->arch != s->arch)
                continue;
            }
@@ -1489,7 +1496,7 @@ add_obsoletes(Solver *solv, Id p, Queue *q)
            continue;
          if (!pool->implicitobsoleteusesprovides && ps->name != s->name)
            continue;
-         if (pool->obsoleteusescolors && !pool_colormatch(pool, s, ps)) 
+         if (pool->implicitobsoleteusescolors && !pool_colormatch(pool, s, ps)) 
            continue;
          queue_push(q, p2);
          lastp2 = p2;
@@ -1608,11 +1615,8 @@ jobtodisablelist(Solver *solv, Id how, Id what, Queue *q)
                {
                  if (pool->disttype != DISTTYPE_DEB)
                    {
-                     const char *evr = pool_id2str(pool, rd->evr);
-                     if (strchr(evr, '-'))
-                       set |= SOLVER_SETEVR;
-                     else
-                       set |= SOLVER_SETEV;
+                     const char *rel = strrchr(pool_id2str(pool, rd->evr), '-');
+                     set |= rel ? SOLVER_SETEVR : SOLVER_SETEV;
                    }
                  else
                    set |= SOLVER_SETEVR;
@@ -2181,14 +2185,16 @@ solver_ruleinfo(Solver *solv, Id rid, Id *fromp, Id *top, Id *depp)
        *depp = solv->job.elements[jidx + 1];
       if ((r->d == 0 || r->d == -1) && r->w2 == 0 && r->p == -SYSTEMSOLVABLE)
        {
-         if ((solv->job.elements[jidx] & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) == (SOLVER_INSTALL|SOLVER_SOLVABLE_NAME))
-           return SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP;
-         if ((solv->job.elements[jidx] & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) == (SOLVER_INSTALL|SOLVER_SOLVABLE_PROVIDES))
+         Id how = solv->job.elements[jidx];
+         if ((how & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) == (SOLVER_INSTALL|SOLVER_SOLVABLE_NAME))
+           return SOLVER_RULE_JOB_UNKNOWN_PACKAGE;
+         if ((how & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) == (SOLVER_INSTALL|SOLVER_SOLVABLE_PROVIDES))
            return SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP;
-         if ((solv->job.elements[jidx] & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) == (SOLVER_ERASE|SOLVER_SOLVABLE_NAME))
+         if ((how & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) == (SOLVER_ERASE|SOLVER_SOLVABLE_NAME))
            return SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM;
-         if ((solv->job.elements[jidx] & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) == (SOLVER_ERASE|SOLVER_SOLVABLE_PROVIDES))
+         if ((how & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) == (SOLVER_ERASE|SOLVER_SOLVABLE_PROVIDES))
            return SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM;
+         return SOLVER_RULE_JOB_UNSUPPORTED;
        }
       return SOLVER_RULE_JOB;
     }
@@ -2301,6 +2307,16 @@ solver_rule2job(Solver *solv, Id rid, Id *whatp)
   return solv->job.elements[idx];
 }
 
+Id
+solver_rule2solvable(Solver *solv, Id rid)
+{
+  if (rid >= solv->updaterules && rid < solv->updaterules_end)
+    return rid - solv->updaterules;
+  if (rid >= solv->featurerules && rid < solv->featurerules_end)
+    return rid - solv->featurerules;
+  return 0;
+}
+
 /* check if the newest versions of pi still provides the dependency we're looking for */
 static int
 solver_choicerulecheck(Solver *solv, Id pi, Rule *r, Map *m)
@@ -2414,7 +2430,7 @@ solver_addchoicerules(Solver *solv)
                continue;
              if (!pool->implicitobsoleteusesprovides && s->name != s2->name)
                continue;
-             if (pool->obsoleteusescolors && !pool_colormatch(pool, s, s2))
+             if (pool->implicitobsoleteusescolors && !pool_colormatch(pool, s, s2))
                continue;
              break;
            }
@@ -3538,7 +3554,7 @@ solver_get_unneeded(Solver *solv, Queue *unneededq, int filtered)
        */
       /* leave first element zero to make things easier */
       /* also add trailing zero */
-      queue_insertn(&edges, 0, 1 + count + 1);
+      queue_insertn(&edges, 0, 1 + count + 1, 0);
 
       /* first requires and recommends */
       for (i = 0; i < count; i++)