/*
* add all installed packages that package p obsoletes to Queue q.
- * Package p is not installed and not in oobs map.
+ * Package p is not installed. Also, we know that if
+ * solv->keepexplicitobsoletes is not set, p is not in the noobs map.
* Entries may get added multiple times.
*/
static void
Id obs, *obsp;
Id lastp2 = 0;
- /* we already know: p is not installed, p is not noobs */
- FOR_PROVIDES(p2, pp2, s->name)
+ if (!solv->keepexplicitobsoletes || !(solv->noobsoletes.size && MAPTST(&solv->noobsoletes, p)))
{
- Solvable *ps = pool->solvables + p2;
- if (ps->repo != installed)
- continue;
- if (!pool->implicitobsoleteusesprovides && ps->name != s->name)
- continue;
- if (pool->obsoleteusescolors && !pool_colormatch(pool, s, ps))
- continue;
- queue_push(q, p2);
- lastp2 = p2;
+ FOR_PROVIDES(p2, pp2, s->name)
+ {
+ Solvable *ps = pool->solvables + p2;
+ if (ps->repo != installed)
+ continue;
+ if (!pool->implicitobsoleteusesprovides && ps->name != s->name)
+ continue;
+ if (pool->obsoleteusescolors && !pool_colormatch(pool, s, ps))
+ continue;
+ queue_push(q, p2);
+ lastp2 = p2;
+ }
}
if (!s->obsoletes)
return;
{
if (pool->solvables[p].repo == installed)
j = p;
- else if (solv->noobsoletes.size && MAPTST(&solv->noobsoletes, p))
+ else if (solv->noobsoletes.size && MAPTST(&solv->noobsoletes, p) && !solv->keepexplicitobsoletes)
return;
i++;
}
if (r->d == 0 && r->w2 == 0 && pool->solvables[r->p].repo == installed)
continue;
/* noobs is bad */
- if (solv->noobsoletes.size)
+ if (solv->noobsoletes.size && !solv->keepexplicitobsoletes)
{
FOR_RULELITERALS(p, jp, r)
if (MAPTST(&solv->noobsoletes, p))