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);
{
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;
}
}
+ 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
*/
if (level <= olevel)
break;
}
+ systemlevel = level + 1;
if (i < solv->installed->end)
continue;
- systemlevel = level;
}
+ if (level < systemlevel)
+ systemlevel = level;
+
/*
* decide
*/