queue_init(&iq);
queue_init(&xsuppq);
+ /* setup userinstalled map and search for special namespace cleandeps erases */
for (i = 0; i < job->count; i += 2)
{
how = job->elements[i];
continue;
if (strncmp(pool_id2str(pool, s->name), "pattern:", 8) != 0)
continue;
- dp = s->repo->idarraydata + s->requires;
for (dp = s->repo->idarraydata + s->requires; *dp; dp++)
FOR_PROVIDES(p, pp, *dp)
if (pool->solvables[p].repo == installed)
if (MAPTST(&solv->multiversion, p))
break;
if (p)
- continue;
+ continue; /* found a multiversion package that will not obsolate anything */
}
om.size = 0;
}
queue_init_clone(&iqcopy, &iq);
- if (!unneeded)
- {
- if (solv->cleandeps_updatepkgs)
- for (i = 0; i < solv->cleandeps_updatepkgs->count; i++)
- queue_push(&iq, solv->cleandeps_updatepkgs->elements[i]);
- }
-
if (unneeded)
queue_empty(&iq); /* just in case... */
- /* clear userinstalled bit for the packages we really want to delete/update */
+ /* clear userinstalled bits for the packages we really want to delete */
for (i = 0; i < iq.count; i++)
{
p = iq.elements[i];
- if (pool->solvables[p].repo != installed)
- continue;
- MAPCLR(&userinstalled, p - installed->start);
+ if (pool->solvables[p].repo == installed)
+ MAPCLR(&userinstalled, p - installed->start);
+ }
+ /* set userinstalled bits for all packages not in the considered map */
+ if (pool->considered)
+ {
+ for (p = installed->start; p < installed->end; p++)
+ if (!MAPTST(pool->considered, p))
+ MAPSET(&userinstalled, p - installed->start); /* we may not remove those */
+ }
+ if (!unneeded && solv->cleandeps_updatepkgs)
+ {
+ /* find update seeds */
+ queue_init(&updatepkgs_filtered);
+ find_update_seeds(solv, &updatepkgs_filtered, &userinstalled);
+ /* clear userinstalled bit for the packages we want to update */
+ /* also add them to the erase list */
+ for (i = 0; i < solv->cleandeps_updatepkgs->count; i++)
+ {
+ p = solv->cleandeps_updatepkgs->elements[i];
+ if (pool->considered && !MAPTST(pool->considered, p))
+ continue;
+ queue_push(&iq, p);
+ MAPCLR(&userinstalled, p - installed->start);
+ }
}
for (p = installed->start; p < installed->end; p++)
if (pool->solvables[p].repo != installed)
continue;
MAPSET(&installedm, p);
- if (pool->considered && !MAPTST(pool->considered, p))
- MAPSET(&userinstalled, p - installed->start); /* we may not remove those */
if (unneeded && !MAPTST(&userinstalled, p - installed->start))
continue;
MAPSET(&im, p);
MAPSET(&installedm, SYSTEMSOLVABLE);
MAPSET(&im, SYSTEMSOLVABLE);
- if (!unneeded && solv->cleandeps_updatepkgs)
- {
- /* find update "seeds" */
- queue_init(&updatepkgs_filtered);
- find_update_seeds(solv, &updatepkgs_filtered, &userinstalled);
- }
-
#ifdef CLEANDEPSDEBUG
printf("REMOVE PASS\n");
#endif
if (!r->p || r == fr || cleandeps_rule_is_true(solv, r))
{
/* update rule is true, check best rules */
- if (!solv->bestrules_pkg)
+ if (!solv->bestrules_info)
continue;
nj = solv->bestrules_end - solv->bestrules;
- for (j = 0; j < nj; j++)
- if (solv->bestrules_pkg[j] == i)
+ for (j = solv->bestrules_up - solv->bestrules; j < nj; j++)
+ if (solv->bestrules_info[j] == i)
{
r = solv->rules + solv->bestrules + j;
if (!cleandeps_rule_is_true(solv, r))