i = 0;
}
matched = 1;
- /* here we assume that repo == vendor */
- job->elements[i] = SOLVER_SOLVABLE_ONE_OF | (job->elements[i] & SOLVER_SETMASK) | SOLVER_SETVENDOR | SOLVER_SETREPO;
- job->elements[i + 1] = pool_queuetowhatprovides(pool, &mq);
+ /* here we assume that repo == vendor, so we also set SOLVER_SETVENDOR */
+ if (mq.count == 1)
+ {
+ job->elements[i] = SOLVER_SOLVABLE | (job->elements[i] & SOLVER_SETMASK) | SOLVER_SETVENDOR | SOLVER_SETREPO | SOLVER_NOAUTOSET;
+ job->elements[i + 1] = mq.elements[0];
+ }
+ else
+ {
+ job->elements[i] = SOLVER_SOLVABLE_ONE_OF | (job->elements[i] & SOLVER_SETMASK) | SOLVER_SETVENDOR | SOLVER_SETREPO;
+ job->elements[i + 1] = pool_queuetowhatprovides(pool, &mq);
+ }
}
else if (matched)
{
{
case SOLVER_INSTALL:
set = how & SOLVER_SETMASK;
- if (select == SOLVER_SOLVABLE)
- set |= SOLVER_SETARCH | SOLVER_SETVENDOR | SOLVER_SETREPO | SOLVER_SETEVR;
- else if ((select == SOLVER_SOLVABLE_NAME || select == SOLVER_SOLVABLE_PROVIDES) && ISRELDEP(what))
+ if (!(set & SOLVER_NOAUTOSET))
{
- Reldep *rd = GETRELDEP(pool, what);
- if (rd->flags == REL_EQ && select == SOLVER_SOLVABLE_NAME)
+ /* automatically add set bits by analysing the job */
+ if (select == SOLVER_SOLVABLE)
+ set |= SOLVER_SETARCH | SOLVER_SETVENDOR | SOLVER_SETREPO | SOLVER_SETEVR;
+ else if ((select == SOLVER_SOLVABLE_NAME || select == SOLVER_SOLVABLE_PROVIDES) && ISRELDEP(what))
{
+ Reldep *rd = GETRELDEP(pool, what);
+ if (rd->flags == REL_EQ && select == SOLVER_SOLVABLE_NAME)
+ {
#if !defined(DEBIAN_SEMANTICS)
- const char *evr = id2str(pool, rd->evr);
- if (strchr(evr, '-'))
- set |= SOLVER_SETEVR;
- else
- set |= SOLVER_SETEV;
+ const char *evr = id2str(pool, rd->evr);
+ if (strchr(evr, '-'))
+ set |= SOLVER_SETEVR;
+ else
+ set |= SOLVER_SETEV;
#else
- set |= SOLVER_SETEVR;
+ set |= SOLVER_SETEVR;
#endif
+ }
+ if (rd->flags <= 7 && ISRELDEP(rd->name))
+ rd = GETRELDEP(pool, rd->name);
+ if (rd->flags == REL_ARCH)
+ set |= SOLVER_SETARCH;
}
- if (rd->flags <= 7 && ISRELDEP(rd->name))
- rd = GETRELDEP(pool, rd->name);
- if (rd->flags == REL_ARCH)
- set |= SOLVER_SETARCH;
}
+ else
+ set &= ~SOLVER_NOAUTOSET;
if (!set)
return;
if ((set & SOLVER_SETARCH) != 0 && solv->infarchrules != solv->infarchrules_end)
}
if (omap.size)
map_free(&omap);
- if (select == SOLVER_SOLVABLE || qstart == q->count)
- return; /* all done already */
+
+ if (qstart == q->count)
+ return; /* nothing to prune */
+ if ((set & (SOLVER_SETEVR | SOLVER_SETARCH | SOLVER_SETVENDOR)) == (SOLVER_SETEVR | SOLVER_SETARCH | SOLVER_SETVENDOR))
+ return; /* all is set */
/* now that we know which installed packages are obsoleted check each of them */
for (i = j = qstart; i < q->count; i += 2)
}
queue_truncate(q, j);
return;
+
case SOLVER_ERASE:
if (!installed)
break;
#define SOLVER_SETARCH 0x04000000
#define SOLVER_SETVENDOR 0x08000000
#define SOLVER_SETREPO 0x10000000
+#define SOLVER_NOAUTOSET 0x20000000
-#define SOLVER_SETMASK 0x1f000000
+#define SOLVER_SETMASK 0x2f000000
/* old API compatibility, do not use in new code */
#if 1