rr = solv->rules + solv->featurerules + (why - solv->updaterules);
if (!rr->p)
rr = solv->rules + why;
- if (solv->distupgrade && solv->rules[why].p != p && solv->decisionmap[p] > 0)
+ if (solv->dupmap_all && solv->rules[why].p != p && solv->decisionmap[p] > 0)
{
/* distupgrade case, allow to keep old package */
queue_push(solutionq, SOLVER_SOLUTION_DISTUPGRADE);
dontfix = 0;
if (installed /* Installed system available */
- && !solv->fixsystem /* NOT repair errors in rpm dependency graph */
&& s->repo == installed /* solvable is installed */
- && (!solv->fixmap.size || !MAPTST(&solv->fixmap, n - installed->start)))
+ && !solv->fixmap_all /* NOT repair errors in rpm dependency graph */
+ && !(solv->fixmap.size && MAPTST(&solv->fixmap, n - installed->start)))
{
dontfix = 1; /* dont care about broken rpm deps */
}
queue_init_buffer(&qs, qsbuf, sizeof(qsbuf)/sizeof(*qsbuf));
p = s - pool->solvables;
/* find update candidates for 's' */
- if (solv->distupgrade)
+ if (solv->dupmap_all)
p = finddistupgradepackages(solv, s, &qs, allow_all);
else
policy_findupdatepackages(solv, s, &qs, allow_all);
- if (!allow_all && !solv->distupgrade && solv->dupinvolvedmap.size && MAPTST(&solv->dupinvolvedmap, p))
+ if (!allow_all && !solv->dupmap_all && solv->dupinvolvedmap.size && MAPTST(&solv->dupinvolvedmap, p))
addduppackages(solv, s, &qs);
if (!allow_all && qs.count && solv->noobsoletes.size)
}
if (j < qs.count)
{
- if (d && solv->updatesystem && solv->installed && s->repo == solv->installed)
+ if (d && solv->installed && s->repo == solv->installed &&
+ (solv->updatemap_all || (solv->updatemap.size && MAPTST(&solv->updatemap, s - pool->solvables - solv->installed->start))))
{
if (!solv->multiversionupdaters)
solv->multiversionupdaters = sat_calloc(solv->installed->end - solv->installed->start, sizeof(Id));
solv->multiversionupdaters[s - pool->solvables - solv->installed->start] = d;
}
- if (j == 0 && p == -SYSTEMSOLVABLE && solv->distupgrade)
+ if (j == 0 && p == -SYSTEMSOLVABLE && solv->dupmap_all)
{
queue_push(&solv->orphaned, s - pool->solvables); /* treat as orphaned */
j = qs.count;
a = (a <= pool->lastarch) ? pool->id2arch[a] : 0;
if (a != 1 && pool->installed && ps->repo == pool->installed)
{
- if (!solv->distupgrade)
+ 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->noobsoletes.size && MAPTST(&solv->noobsoletes, what))
{
/* XXX: remove if we always do distupgrade with DUP rules */
- if (solv->distupgrade && s->repo == installed)
+ if (solv->dupmap_all && s->repo == installed)
queue_push2(q, DISABLE_UPDATE, what);
return;
}
if (l || !dq.count)
continue;
/* prune to installed if not updating */
- if (!solv->updatesystem && solv->installed && dq.count > 1)
+ if (dq.count > 1 && solv->installed && !solv->updatemap_all)
{
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];
+ {
+ dq.elements[k++] = dq.elements[j];
+ if (solv->updatemap.size && MAPTST(&solv->updatemap, dq.elements[j] - solv->installed->start))
+ {
+ k = 0; /* package wants to be updated, do not prune */
+ break;
+ }
+ }
}
if (k)
dq.count = k;
/* Actually we currently still need it because of erase jobs */
/* if noupdate is set we do not look at update candidates */
queue_empty(&dq);
- if (!MAPTST(&solv->noupdate, i - installed->start) && (solv->decisionmap[i] < 0 || solv->updatesystem || (solv->updatemap.size && MAPTST(&solv->updatemap, i - installed->start)) || rr->p != i))
+ if (!MAPTST(&solv->noupdate, i - installed->start) && (solv->decisionmap[i] < 0 || solv->updatemap_all || (solv->updatemap.size && MAPTST(&solv->updatemap, i - installed->start)) || rr->p != i))
{
if (solv->noobsoletes.size && solv->multiversionupdaters
&& (d = solv->multiversionupdaters[i - installed->start]) != 0)
}
}
- if (solv->distupgrade && solv->installed)
+ if (solv->dupmap_all && solv->installed)
{
int installedone = 0;
if (solv->decisionmap[p])
continue; /* already decided */
olevel = level;
- if (solv->distupgrade_removeunsupported)
+ if (solv->droporphanedmap_all)
continue;
if (solv->droporphanedmap.size && MAPTST(&solv->droporphanedmap, p - solv->installed->start))
continue;
queue_free(&solv->job);
queue_init_clone(&solv->job, job);
+ /* initialize with legacy values */
+ solv->fixmap_all = solv->fixsystem;
+ solv->updatemap_all = solv->updatesystem;
+ solv->droporphanedmap_all = solv->distupgrade_removeunsupported;
+ solv->dupmap_all = solv->distupgrade;
+
/*
* create basic rule set of all involved packages
* use addedmap bitmap to make sure we don't create rules twice
*/
if (installed)
{
- /* check for verify jobs */
+ /* check for update/verify jobs as they need to be known early */
for (i = 0; i < job->count; i += 2)
{
how = job->elements[i];
switch (how & SOLVER_JOBMASK)
{
case SOLVER_VERIFY:
+ if (select == SOLVER_SOLVABLE_ALL)
+ solv->fixmap_all = 1;
FOR_JOB_SELECT(p, pp, select, what)
{
s = pool->solvables + p;
MAPSET(&solv->fixmap, p - solv->installed->start);
}
break;
+ case SOLVER_UPDATE:
+ if (select == SOLVER_SOLVABLE_ALL)
+ solv->updatemap_all = 1;
+ FOR_JOB_SELECT(p, pp, select, what)
+ {
+ s = pool->solvables + p;
+ if (!solv->installed || s->repo != solv->installed)
+ continue;
+ if (!solv->updatemap.size)
+ map_grow(&solv->updatemap, solv->installed->end - solv->installed->start);
+ MAPSET(&solv->updatemap, p - solv->installed->start);
+ }
+ break;
default:
break;
}
}
break;
case SOLVER_DISTUPGRADE:
- if (!solv->distupgrade)
+ if (select == SOLVER_SOLVABLE_ALL)
+ solv->dupmap_all = 1;
+ if (!solv->dupmap_all)
hasdupjob = 1;
break;
default:
queue_push(&solv->orphaned, i);
if (!r->p)
{
- assert(solv->distupgrade && !sr->p);
+ assert(solv->dupmap_all && !sr->p);
continue;
}
if (!solver_samerule(solv, r, sr))
case SOLVER_UPDATE:
POOL_DEBUG(SAT_DEBUG_JOB, "job: %supdate %s\n", weak ? "weak " : "", solver_select2str(solv, select, what));
- FOR_JOB_SELECT(p, pp, select, what)
- {
- s = pool->solvables + p;
- if (!solv->installed || s->repo != solv->installed)
- continue;
- if (!solv->updatemap.size)
- map_grow(&solv->updatemap, solv->installed->end - solv->installed->start);
- MAPSET(&solv->updatemap, p - solv->installed->start);
- }
break;
case SOLVER_VERIFY:
POOL_DEBUG(SAT_DEBUG_JOB, "job: %sverify %s\n", weak ? "weak " : "", solver_select2str(solv, select, what));
break;
case SOLVER_DROP_ORPHANED:
POOL_DEBUG(SAT_DEBUG_JOB, "job: drop orphaned %s\n", solver_select2str(solv, select, what));
+ if (select == SOLVER_SOLVABLE_ALL)
+ solv->droporphanedmap_all = 1;
FOR_JOB_SELECT(p, pp, select, what)
{
s = pool->solvables + p;
Map noupdate; /* don't try to update these
installed solvables */
- Map noobsoletes; /* ignore obsoletes for these
- (multiinstall) */
+ Map noobsoletes; /* ignore obsoletes for these (multiinstall) */
- Map updatemap; /* bring those installed packages to the newest version */
- Map fixmap; /* fix those packages */
+ Map updatemap; /* bring these installed packages to the newest version */
+ int updatemap_all; /* bring all packages to the newest version */
+
+ Map fixmap; /* fix these packages */
+ int fixmap_all; /* fix all packages */
Queue weakruleq; /* index into 'rules' for weak ones */
Map weakrulemap; /* map rule# to '1' for weak rules, 1..learntrules */
Queue covenantq; /* Covenants honored by this solver (generic locks) */
- Map dupmap; /* packages from dup repos */
+ Map dupmap; /* dup these packages*/
+ int dupmap_all; /* dup all packages */
Map dupinvolvedmap; /* packages involved in dup process */
+
Map droporphanedmap; /* packages to drop in dup mode */
- Map cleandepsmap; /* try to drop those packages as of cleandeps erases */
+ int droporphanedmap_all;
+
+ Map cleandepsmap; /* try to drop these packages as of cleandeps erases */
Queue *ruleinfoq; /* tmp space for solver_ruleinfo() */
} Solver;
#define SOLVER_SOLVABLE_PROVIDES 0x03
#define SOLVER_SOLVABLE_ONE_OF 0x04
#define SOLVER_SOLVABLE_REPO 0x05
+#define SOLVER_SOLVABLE_ALL 0x06
#define SOLVER_SELECTMASK 0xff
l = r->p; l; l = (dp != &r->w2 + 1 ? *dp++ : 0))
/* iterate over all packages selected by a job */
-#define FOR_JOB_SELECT(p, pp, select, what) \
- if (select == SOLVER_SOLVABLE_REPO) \
- p = pp = 0; \
- else for (pp = (select == SOLVER_SOLVABLE ? 0 : \
- select == SOLVER_SOLVABLE_ONE_OF ? what : \
- pool_whatprovides(pool, what)), \
+#define FOR_JOB_SELECT(p, pp, select, what) \
+ if (select == SOLVER_SOLVABLE_REPO || select == SOLVER_SOLVABLE_ALL) \
+ p = pp = 0; \
+ else for (pp = (select == SOLVER_SOLVABLE ? 0 : \
+ select == SOLVER_SOLVABLE_ONE_OF ? what : \
+ pool_whatprovides(pool, what)), \
p = (select == SOLVER_SOLVABLE ? what : pool->whatprovidesdata[pp++]) ; p ; p = pool->whatprovidesdata[pp++]) \
if (select != SOLVER_SOLVABLE_NAME || pool_match_nevr(pool, pool->solvables + p, what))
/* policy, replace p with rp */
s = pool->solvables + p;
sd = rp ? pool->solvables + rp : 0;
- if (s == sd && solv->distupgrade)
+ if (s == sd && solv->dupmap_all)
{
POOL_DEBUG(SAT_DEBUG_RESULT, " - keep obsolete %s\n", solvable2str(pool, s));
}
sprintf(b, "repo #%d", what);
return b;
}
+ if (select == SOLVER_SOLVABLE_ALL)
+ return "all packages";
return "unknown job select";
}