- also check obsoletes when disabling update rules
[platform/upstream/libsolv.git] / src / solver.c
index 545ee1d..f3826e4 100644 (file)
@@ -910,9 +910,23 @@ disableupdaterules(Solver *solv, Queue *job, int jobidx)
          s = pool->solvables + what;
          if (solv->noobsoletes.size && MAPTST(&solv->noobsoletes, what))
            break;
+         if (s->obsoletes)
+           {
+             Id obs, *obsp;
+             obsp = s->repo->idarraydata + s->obsoletes;
+             while ((obs = *obsp++) != 0)
+               FOR_PROVIDES(p, pp, obs)
+                 {
+                   if (pool->solvables[p].repo != installed)
+                     continue;
+                   if (!solv->obsoleteusesprovides && !pool_match_nevr(pool, pool->solvables + p, obs))
+                     continue;
+                   MAPSET(&solv->noupdate, p - installed->start);
+                 }
+           }
          FOR_PROVIDES(p, pp, s->name)
            {
-             if (pool->solvables[p].name != s->name)
+             if (!solv->implicitobsoleteusesprovides && pool->solvables[p].name != s->name)
                continue;
              if (pool->solvables[p].repo == installed)
                MAPSET(&solv->noupdate, p - installed->start);
@@ -949,9 +963,33 @@ disableupdaterules(Solver *solv, Queue *job, int jobidx)
        {
        case SOLVER_INSTALL_SOLVABLE:
          s = pool->solvables + what;
+         if (s->obsoletes)
+           {
+             Id obs, *obsp;
+             obsp = s->repo->idarraydata + s->obsoletes;
+             while ((obs = *obsp++) != 0)
+               FOR_PROVIDES(p, pp, obs)
+                 {
+                   if (pool->solvables[p].repo != installed)
+                     continue;
+                   if (!solv->obsoleteusesprovides && !pool_match_nevr(pool, pool->solvables + p, obs))
+                     continue;
+                   if (MAPTST(&solv->noupdate, p - installed->start))
+                     continue;
+                   r = solv->rules + solv->updaterules + (p - installed->start);
+                   if (r->d >= 0)
+                     continue;
+                   enablerule(solv, r);
+                   IF_POOLDEBUG (SAT_DEBUG_SOLUTIONS)
+                     {
+                       POOL_DEBUG(SAT_DEBUG_SOLUTIONS, "@@@ re-enabling ");
+                       solver_printrule(solv, SAT_DEBUG_SOLUTIONS, r);
+                     }
+                 }
+           }
          FOR_PROVIDES(p, pp, s->name)
            {
-             if (pool->solvables[p].name != s->name)
+             if (!solv->implicitobsoleteusesprovides && pool->solvables[p].name != s->name)
                continue;
              if (pool->solvables[p].repo != installed)
                continue;
@@ -2350,6 +2388,60 @@ run_solver(Solver *solv, int disablerules, int doweak)
            }
        }
 
+     if (level < systemlevel)
+       {
+         POOL_DEBUG(SAT_DEBUG_STATS, "resolving job rules\n");
+         for (i = solv->jobrules, r = solv->rules + i; i < solv->jobrules_end; i++, r++)
+           {
+             Id l;
+             if (r->d < 0)             /* ignore disabled rules */
+               continue;
+             queue_empty(&dq);
+             FOR_RULELITERALS(l, dp, r)
+               {
+                 if (l < 0)
+                   {
+                     if (solv->decisionmap[-l] <= 0)
+                       break;
+                   }
+                 else
+                   {
+                     if (solv->decisionmap[l] > 0)
+                       break;
+                     if (solv->decisionmap[l] == 0)
+                       queue_push(&dq, l);
+                   }
+               }
+             if (l || !dq.count)
+               continue;
+             if (!solv->updatesystem && solv->installed && dq.count > 1)
+               {
+                 int j, k;
+                 for (j = k = 0; j < dq.count; j++)
+                   {
+                     Solvable *s = pool->solvables + dq.elements[j];
+                     if (s->repo == solv->installed)
+                       dq.elements[k++] = dq.elements[j];
+                   }
+                 if (k)
+                   dq.count = k;
+               }
+             olevel = level;
+             level = selectandinstall(solv, level, &dq, 0, disablerules);
+             if (level == 0)
+               {
+                 queue_free(&dq);
+                 return;
+               }
+             if (level <= olevel)
+               break;
+           }
+         systemlevel = level + 1;
+         if (i < solv->jobrules_end)
+           continue;
+       }
+
+
       /*
        * installed packages
        */
@@ -2457,11 +2549,14 @@ run_solver(Solver *solv, int disablerules, int doweak)
              if (level <= olevel)
                break;
            }
+         systemlevel = level + 1;
          if (i < solv->installed->end)
            continue;
-         systemlevel = level;
        }
 
+      if (level < systemlevel)
+        systemlevel = level;
+
       /*
        * decide
        */