Id rid, d;
Id lreqr, lconr, lsysr, ljobr;
Rule *r;
- int reqassert = 0;
+ Id jobassert = 0;
+ int i, reqset = 0; /* 0: unset, 1: installed, 2: jobassert, 3: assert */
+
+ /* find us a jobassert rule */
+ for (i = idx; (rid = solv->learnt_pool.elements[i]) != 0; i++)
+ {
+ if (rid < solv->jobrules || rid >= solv->jobrules_end)
+ continue;
+ r = solv->rules + rid;
+ d = r->d < 0 ? -r->d - 1 : r->d;
+ if (!d && r->w2 == 0 && r->p > 0)
+ {
+ jobassert = r->p;
+ break;
+ }
+ }
lreqr = lconr = lsysr = ljobr = 0;
while ((rid = solv->learnt_pool.elements[idx++]) != 0)
}
else
{
- if (!d && r->w2 == 0 && !reqassert)
+ if (!d && r->w2 == 0 && reqset < 3)
{
if (*reqrp > 0 && r->p < -1)
{
}
/* prefer assertions */
*reqrp = rid;
- reqassert = 1;
+ reqset = 3;
}
- if (!*reqrp)
- *reqrp = rid;
- else if (solv->installed && r->p < 0 && solv->pool->solvables[-r->p].repo == solv->installed && !reqassert)
+ else if (jobassert && r->p == -jobassert)
+ {
+ /* prefer rules of job assertions */
+ *reqrp = rid;
+ reqset = 2;
+ }
+ else if (solv->installed && r->p < 0 && solv->pool->solvables[-r->p].repo == solv->installed && reqset <= 1)
{
- /* prefer rules of installed packages */
+ /* prefer rules of job installed package so that the user doesn't get confused by strange packages */
*reqrp = rid;
+ reqset = 1;
}
+ else if (!*reqrp)
+ *reqrp = rid;
}
}
}
Queue oq, rq;
Id type, q;
int i, j, ref = 0;
+ const char *n;
if (!s->repo)
return SOLVER_TRANSACTION_IGNORE;
+ n = id2str(pool, s->name);
+ if (!strncmp(n, "patch:", 6))
+ return SOLVER_TRANSACTION_IGNORE;
+ if (!strncmp(n, "pattern:", 8))
+ return SOLVER_TRANSACTION_IGNORE;
+
type = transaction_base_type(trans, p);
if (type == SOLVER_TRANSACTION_IGNORE)
MAPSET(&trans->transactsmap, -p);
if ((!installed || s->repo != installed) && p > 0)
{
+#if 0
const char *n = id2str(pool, s->name);
if (!strncmp(n, "patch:", 6))
continue;
if (!strncmp(n, "pattern:", 8))
continue;
+#endif
MAPSET(&trans->transactsmap, p);
if (noobsmap && MAPTST(noobsmap, p))
neednoobs = 1;