}
#endif
+static int
+dep_installed(Solver *solv, Id dep)
+{
+ Pool *pool = solv->pool;
+ Id p, *pp;
+
+ if (ISRELDEP(dep))
+ {
+ Reldep *rd = GETRELDEP(pool, dep);
+ if (rd->flags == REL_AND)
+ {
+ if (!dep_installed(solv, rd->name))
+ return 0;
+ return dep_installed(solv, rd->evr);
+ }
+ if (rd->flags == REL_NAMESPACE && rd->name == NAMESPACE_INSTALLED)
+ return dep_installed(solv, rd->evr);
+ }
+ FOR_PROVIDES(p, pp, dep)
+ {
+ if (p >= solv->system->start && p < solv->system->start + solv->system->nsolvables)
+ return 1;
+ }
+ return 0;
+}
+
static inline int
-dep_is_installed(Solver *solv, Id dep)
+dep_fulfilled(Solver *solv, Id dep)
{
Pool *pool = solv->pool;
Id p, *pp;
Reldep *rd = GETRELDEP(pool, dep);
if (rd->flags == REL_AND)
{
- if (!dep_is_installed(solv, rd->name))
+ if (!dep_fulfilled(solv, rd->name))
return 0;
- return dep_is_installed(solv, rd->evr);
+ return dep_fulfilled(solv, rd->evr);
}
+ if (rd->flags == REL_NAMESPACE && rd->name == NAMESPACE_INSTALLED)
+ return dep_installed(solv, rd->evr);
}
FOR_PROVIDES(p, pp, dep)
{
if ((supp = s->supplements) != 0)
{
while ((sup = *supp++) != 0)
- if (dep_is_installed(solv, sup))
+ if (dep_fulfilled(solv, sup))
break;
if (!sup)
continue;
if ((supp = s->freshens) != 0)
{
while ((sup = *supp++) != 0)
- if (dep_is_installed(solv, sup))
+ if (dep_fulfilled(solv, sup))
break;
if (!sup)
continue;
if (a > pool->lastarch)
continue;
a = pool->id2arch[a];
- if ((a & 0xffff0000) > bestscore)
+ if (!bestscore || (a & 0xffff0000) < bestscore)
bestscore = a & 0xffff0000;
}
for (i = j = 0; i < plist->count; i++)
Id n;
queueinit(&q);
- queuepush(&q, s - pool->solvables);/* push solvable Id */
+ queuepush(&q, s - pool->solvables); /* push solvable Id */
while (q.count)
{
if ((supp = s->supplements) != 0)
{
while ((sup = *supp++) != 0)
- if (dep_is_installed(solv, sup))
+ if (dep_fulfilled(solv, sup))
break;
if (!sup)
continue;
if ((supp = s->freshens) != 0)
{
while ((sup = *supp++) != 0)
- if (dep_is_installed(solv, sup))
+ if (dep_fulfilled(solv, sup))
break;
if (!sup)
continue;
if (obsoletesmap[i])
continue;
s = pool->solvables + i;
- if (solv->rc_output)
- {
- printf(">!> ");
- if (solv->rc_output == 2)
- {
- printf("remove ");
- printf(" %s-%s%s", id2str(pool, s->name), id2rc(solv, s->evr), id2str(pool, s->evr));
- }
- else
- {
- printf("remove %s-%s.%s", id2str(pool, s->name), id2str(pool, s->evr), id2str(pool, s->arch));
- }
- }
+ if (solv->rc_output == 2)
+ printf(">!> remove %s-%s%s\n", id2str(pool, s->name), id2rc(solv, s->evr), id2str(pool, s->evr));
+ else if (solv->rc_output)
+ printf(">!> remove %s-%s.%s\n", id2str(pool, s->name), id2str(pool, s->evr), id2str(pool, s->arch));
else
- {
- printf("erase %s-%s.%s", id2str(pool, s->name), id2str(pool, s->evr), id2str(pool, s->arch));
- }
- printf("\n");
+ printf("erase %s-%s.%s\n", id2str(pool, s->name), id2str(pool, s->evr), id2str(pool, s->arch));
uninstalls++;
}
for (i = 0; i < solv->decisionq.count; i++)
{
+ int j;
p = solv->decisionq.elements[i];
if (p < 0)
continue;
continue;
s = pool->solvables + p;
- if (solv->rc_output)
- printf(">!> ");
-
if (!obsoletesmap[p])
{
+ if (solv->rc_output)
+ printf(">!> ");
printf("install %s-%s%s", id2str(pool, s->name), id2rc(solv, s->evr), id2str(pool, s->evr));
if (solv->rc_output != 2)
printf(".%s", id2str(pool, s->arch));
installs++;
}
- else
+ else if (!solv->rc_output)
{
- int j;
- Solvable *from = NULL, *to = NULL;
- if (solv->rc_output)
- to = s;
- else
- printf("update %s-%s.%s (obsoletes", id2str(pool, s->name), id2str(pool, s->evr), id2str(pool, s->arch));
+ printf("update %s-%s.%s (obsoletes", id2str(pool, s->name), id2str(pool, s->evr), id2str(pool, s->arch));
+ for (j = solv->system->start; j < solv->system->start + solv->system->nsolvables; j++)
+ {
+ if (obsoletesmap[j] != p)
+ continue;
+ s = pool->solvables + j;
+ printf(" %s-%s.%s", id2str(pool, s->name), id2str(pool, s->evr), id2str(pool, s->arch));
+ }
+ printf(")");
upgrades++;
+ }
+ else
+ {
+ Solvable *f, *fn = 0;
for (j = solv->system->start; j < solv->system->start + solv->system->nsolvables; j++)
{
- if (obsoletesmap[j] == p)
+ if (obsoletesmap[j] != p)
+ continue;
+ f = pool->solvables + j;
+ if (fn || f->name != s->name)
{
- s = pool->solvables + j;
- if (solv->rc_output)
- from = s;
- else
- printf(" %s-%s.%s", id2str(pool, s->name), id2str(pool, s->evr), id2str(pool, s->arch));
+ if (solv->rc_output == 2)
+ printf(">!> remove %s-%s%s\n", id2str(pool, s->name), id2rc(solv, s->evr), id2str(pool, s->evr));
+ else if (solv->rc_output)
+ printf(">!> remove %s-%s.%s\n", id2str(pool, s->name), id2str(pool, s->evr), id2str(pool, s->arch));
+ uninstalls++;
}
+ else
+ fn = f;
}
- if (solv->rc_output)
+ if (!fn)
+ {
+ printf(">!> install %s-%s%s", id2str(pool, s->name), id2rc(solv, s->evr), id2str(pool, s->evr));
+ if (solv->rc_output != 2)
+ printf(".%s", id2str(pool, s->arch));
+ installs++;
+ }
+ else
{
if (solv->rc_output == 2)
- printf("upgrade %s-%s => %s-%s%s", id2str(pool, from->name), id2str(pool, from->evr), id2str(pool, to->name), id2rc(solv, to->evr), id2str(pool, to->evr));
+ printf(">!> upgrade %s-%s => %s-%s%s", id2str(pool, fn->name), id2str(pool, fn->evr), id2str(pool, s->name), id2rc(solv, s->evr), id2str(pool, s->evr));
else
- printf("upgrade %s-%s.%s => %s-%s.%s", id2str(pool, from->name), id2str(pool, from->evr), id2str(pool, from->arch), id2str(pool, to->name), id2str(pool, to->evr), id2str(pool, to->arch));
- s = to; /* for final source name */
+ printf(">!> upgrade %s-%s.%s => %s-%s.%s", id2str(pool, fn->name), id2str(pool, fn->evr), id2str(pool, fn->arch), id2str(pool, s->name), id2str(pool, s->evr), id2str(pool, s->arch));
+ upgrades++;
}
- else
- printf(")");
}
if (solv->rc_output)
{