queue_init_buffer(&qs, qsbuf, sizeof(qsbuf)/sizeof(*qsbuf));
p = s - pool->solvables;
policy_findupdatepackages(solv, s, &qs, 1);
- if (solv->dupmap_all || (solv->dupinvolvedmap.size && MAPTST(&solv->dupinvolvedmap, p)))
+ if (solv->dupinvolvedmap_all || (solv->dupinvolvedmap.size && MAPTST(&solv->dupinvolvedmap, p)))
{
if (!dup_maykeepinstalled(solv, s))
{
queue_init_buffer(&qs, qsbuf, sizeof(qsbuf)/sizeof(*qsbuf));
/* find update candidates for 's' */
- if (solv->dupmap_all || (solv->dupinvolvedmap.size && MAPTST(&solv->dupinvolvedmap, p)))
- p = finddistupgradepackages(solv, s, &qs);
+ if (solv->dupinvolvedmap_all || (solv->dupinvolvedmap.size && MAPTST(&solv->dupinvolvedmap, p)))
+ {
+ policy_findupdatepackages(solv, s, &qs, 2);
+ if (!dup_maykeepinstalled(solv, s))
+ p = -SYSTEMSOLVABLE;
+ }
else
policy_findupdatepackages(solv, s, &qs, 0);
}
}
}
+ else if (p == -SYSTEMSOLVABLE && solv->dupmap.size)
+ p = s - pool->solvables; /* let the dup rules sort it out */
+
if (!isorphaned && p == -SYSTEMSOLVABLE && qs.count && solv->dupmap.size)
p = s - pool->solvables; /* let the dup rules sort it out */
if (qs.count && p == -SYSTEMSOLVABLE)
a = (a <= pool->lastarch) ? pool->id2arch[a] : 0;
if (a != 1 && installed && ps->repo == installed)
{
- if (!solv->dupmap_all && !(solv->dupinvolvedmap.size && MAPTST(&solv->dupinvolvedmap, p)))
- queue_pushunique(&allowedarchs, ps->arch); /* also ok to keep this architecture */
- continue; /* ignore installed solvables when calculating the best arch */
+ if (solv->dupinvolvedmap_all || (solv->dupinvolvedmap.size && MAPTST(&solv->dupinvolvedmap, p)))
+ continue;
+ queue_pushunique(&allowedarchs, ps->arch); /* also ok to keep this architecture */
+ continue; /* but ignore installed solvables when calculating the best arch */
}
if (a && a != 1 && (!bestarch || a < bestarch))
{
ps = pool->solvables + p;
if (ps->name != s->name || ps->repo != installed || !MAPTST(addedmap, p))
continue;
- if (solv->dupmap_all || (solv->dupinvolvedmap.size && MAPTST(&solv->dupinvolvedmap, p)))
+ if (solv->dupinvolvedmap_all || (solv->dupinvolvedmap.size && MAPTST(&solv->dupinvolvedmap, p)))
continue;
a = ps->arch;
a = (a <= pool->lastarch) ? pool->id2arch[a] : 0;
Repo *installed = solv->installed;
Id pi, pip, obs, *obsp;
+ if (!solv->dupinvolvedmap.size)
+ map_grow(&solv->dupinvolvedmap, pool->nsolvables);
+
MAPSET(&solv->dupinvolvedmap, p);
if (targeted)
MAPSET(&solv->dupmap, p);
}
}
+/* create the two dupmaps:
+ * - dupmap: packages in that map are good to install/keep
+ * - dupinvolvedmap: packages are subject to dup mode
+ */
void
solver_createdupmaps(Solver *solv)
{
int i, targeted;
map_init(&solv->dupmap, pool->nsolvables);
- map_init(&solv->dupinvolvedmap, pool->nsolvables);
+ solv->dupinvolvedmap_all = 0;
+ map_init(&solv->dupinvolvedmap, 0);
for (i = 0; i < job->count; i += 2)
{
how = job->elements[i];
}
else if (select == SOLVER_SOLVABLE_ALL)
{
+ solv->dupinvolvedmap_all = 1;
FOR_POOL_SOLVABLES(p)
{
- MAPSET(&solv->dupinvolvedmap, p);
if (installed && pool->solvables[p].repo != installed)
MAPSET(&solv->dupmap, p);
}
+ solv->updatemap_all = 1;
+ if (how & SOLVER_FORCEBEST)
+ solv->bestupdatemap_all = 1;
}
else
{
break;
}
}
- MAPCLR(&solv->dupinvolvedmap, SYSTEMSOLVABLE);
+ if (solv->dupinvolvedmap.size)
+ MAPCLR(&solv->dupinvolvedmap, SYSTEMSOLVABLE);
}
void
first = 0;
if (first)
break;
- if (!MAPTST(&solv->dupinvolvedmap, p))
+ if (!solv->dupinvolvedmap_all && !MAPTST(&solv->dupinvolvedmap, p))
continue;
if (installed && ps->repo == installed)
{
}
if (ip)
{
- /* ok, found a good one. we may keep this package. */
+ /* ok, identical to a good one. we may keep this package. */
MAPSET(&solv->dupmap, p); /* for best rules processing */
continue;
}
+ /* check if it's orphaned. If yes, we may keep it */
r = solv->rules + solv->updaterules + (p - installed->start);
if (!r->p)
- r = solv->rules + solv->featurerules + (p - installed->start);
- if (r->p && solv->specialupdaters && solv->specialupdaters[p - installed->start])
+ r = solv->rules + solv->featurerules + (p - installed->start);
+ if (!r->p)
+ {
+ /* no update/feature rule, this is an orphan */
+ MAPSET(&solv->dupmap, p); /* for best rules processing */
+ continue;
+ }
+ if (solv->specialupdaters && solv->specialupdaters[p - installed->start])
{
/* this is a multiversion orphan, we're good if an update is installed */
solver_addrule(solv, -p, 0, solv->specialupdaters[p - installed->start]);
continue;
}
- if (!r->p || (r->p == p && !r->d && !r->w2))
+ if (r->p == p && !r->d && !r->w2)
{
- /* this is an orphan */
- MAPSET(&solv->dupmap, p); /* for best rules processing */
- continue;
+ r = solv->rules + solv->featurerules + (p - installed->start);
+ if (!r->p || (!r->d && !r->w2))
+ {
+ /* this is an orphan */
+ MAPSET(&solv->dupmap, p); /* for best rules processing */
+ continue;
+ }
}
solver_addrule(solv, -p, 0, 0); /* no match, sorry */
}
continue;
}
+ POOL_DEBUG(SOLV_DEBUG_UNSOLVABLE, "ANALYZE UNSOLVABLE ASSERTION ----------------------\n");
+ IF_POOLDEBUG (SOLV_DEBUG_UNSOLVABLE)
+ solver_printruleclass(solv, SOLV_DEBUG_UNSOLVABLE, solv->rules + ri);
+
/*
* find the decision which is the "opposite" of the rule
*/
}
assert(solv->decisionq_why.elements[i] > 0);
+ IF_POOLDEBUG (SOLV_DEBUG_UNSOLVABLE)
+ solver_printruleclass(solv, SOLV_DEBUG_UNSOLVABLE, solv->rules + solv->decisionq_why.elements[i]);
/*
* conflict with a pkg rule ?
}
break;
case SOLVER_DISTUPGRADE:
- if (select == SOLVER_SOLVABLE_ALL)
- {
- solv->dupmap_all = 1;
- solv->updatemap_all = 1;
- if (how & SOLVER_FORCEBEST)
- solv->bestupdatemap_all = 1;
- }
- if ((how & SOLVER_TARGETED) != 0)
- needduprules = 1;
- if (!solv->dupmap_all || solv->allowuninstall || solv->allowuninstall_all || solv->allowuninstallmap.size || solv->keep_orphans)
- needduprules = 1;
+ needduprules = 1;
+ solv->dupmap_all = 1;
break;
default:
break;
else
solv->infarchrules = solv->infarchrules_end = solv->nrules;
- if (needduprules)
+ if (solv->dupinvolvedmap_all || solv->dupinvolvedmap.size)
solver_addduprules(solv, &addedmap);
else
solv->duprules = solv->duprules_end = solv->nrules;