|
@@ -483,174 +483,6 @@ class Solver
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- protected function addChoiceRules()
|
|
|
- {
|
|
|
-
|
|
|
-// void
|
|
|
-// solver_addchoicerules(Solver *solv)
|
|
|
-// {
|
|
|
-// Pool *pool = solv->pool;
|
|
|
-// Map m, mneg;
|
|
|
-// Rule *r;
|
|
|
-// Queue q, qi;
|
|
|
-// int i, j, rid, havechoice;
|
|
|
-// Id p, d, *pp;
|
|
|
-// Id p2, pp2;
|
|
|
-// Solvable *s, *s2;
|
|
|
-//
|
|
|
-// solv->choicerules = solv->nrules;
|
|
|
-// if (!pool->installed)
|
|
|
-// {
|
|
|
-// solv->choicerules_end = solv->nrules;
|
|
|
-// return;
|
|
|
-// }
|
|
|
-// solv->choicerules_ref = sat_calloc(solv->rpmrules_end, sizeof(Id));
|
|
|
-// queue_init(&q);
|
|
|
-// queue_init(&qi);
|
|
|
-// map_init(&m, pool->nsolvables);
|
|
|
-// map_init(&mneg, pool->nsolvables);
|
|
|
-// /* set up negative assertion map from infarch and dup rules */
|
|
|
-// for (rid = solv->infarchrules, r = solv->rules + rid; rid < solv->infarchrules_end; rid++, r++)
|
|
|
-// if (r->p < 0 && !r->w2 && (r->d == 0 || r->d == -1))
|
|
|
-// MAPSET(&mneg, -r->p);
|
|
|
-// for (rid = solv->duprules, r = solv->rules + rid; rid < solv->duprules_end; rid++, r++)
|
|
|
-// if (r->p < 0 && !r->w2 && (r->d == 0 || r->d == -1))
|
|
|
-// MAPSET(&mneg, -r->p);
|
|
|
-// for (rid = 1; rid < solv->rpmrules_end ; rid++)
|
|
|
-// {
|
|
|
-// r = solv->rules + rid;
|
|
|
-// if (r->p >= 0 || ((r->d == 0 || r->d == -1) && r->w2 < 0))
|
|
|
-// continue; /* only look at requires rules */
|
|
|
-// // solver_printrule(solv, SAT_DEBUG_RESULT, r);
|
|
|
-// queue_empty(&q);
|
|
|
-// queue_empty(&qi);
|
|
|
-// havechoice = 0;
|
|
|
-// FOR_RULELITERALS(p, pp, r)
|
|
|
-// {
|
|
|
-// if (p < 0)
|
|
|
-// continue;
|
|
|
-// s = pool->solvables + p;
|
|
|
-// if (!s->repo)
|
|
|
-// continue;
|
|
|
-// if (s->repo == pool->installed)
|
|
|
-// {
|
|
|
-// queue_push(&q, p);
|
|
|
-// continue;
|
|
|
-// }
|
|
|
-// /* check if this package is "blocked" by a installed package */
|
|
|
-// s2 = 0;
|
|
|
-// FOR_PROVIDES(p2, pp2, s->name)
|
|
|
-// {
|
|
|
-// s2 = pool->solvables + p2;
|
|
|
-// if (s2->repo != pool->installed)
|
|
|
-// continue;
|
|
|
-// if (!pool->implicitobsoleteusesprovides && s->name != s2->name)
|
|
|
-// continue;
|
|
|
-// if (pool->obsoleteusescolors && !pool_colormatch(pool, s, s2))
|
|
|
-// continue;
|
|
|
-// break;
|
|
|
-// }
|
|
|
-// if (p2)
|
|
|
-// {
|
|
|
-// /* found installed package p2 that we can update to p */
|
|
|
-// if (MAPTST(&mneg, p))
|
|
|
-// continue;
|
|
|
-// if (policy_is_illegal(solv, s2, s, 0))
|
|
|
-// continue;
|
|
|
-// queue_push(&qi, p2);
|
|
|
-// queue_push(&q, p);
|
|
|
-// continue;
|
|
|
-// }
|
|
|
-// if (s->obsoletes)
|
|
|
-// {
|
|
|
-// Id obs, *obsp = s->repo->idarraydata + s->obsoletes;
|
|
|
-// s2 = 0;
|
|
|
-// while ((obs = *obsp++) != 0)
|
|
|
-// {
|
|
|
-// FOR_PROVIDES(p2, pp2, obs)
|
|
|
-// {
|
|
|
-// s2 = pool->solvables + p2;
|
|
|
-// if (s2->repo != pool->installed)
|
|
|
-// continue;
|
|
|
-// if (!pool->obsoleteusesprovides && !pool_match_nevr(pool, pool->solvables + p2, obs))
|
|
|
-// continue;
|
|
|
-// if (pool->obsoleteusescolors && !pool_colormatch(pool, s, s2))
|
|
|
-// continue;
|
|
|
-// break;
|
|
|
-// }
|
|
|
-// if (p2)
|
|
|
-// break;
|
|
|
-// }
|
|
|
-// if (obs)
|
|
|
-// {
|
|
|
-// /* found installed package p2 that we can update to p */
|
|
|
-// if (MAPTST(&mneg, p))
|
|
|
-// continue;
|
|
|
-// if (policy_is_illegal(solv, s2, s, 0))
|
|
|
-// continue;
|
|
|
-// queue_push(&qi, p2);
|
|
|
-// queue_push(&q, p);
|
|
|
-// continue;
|
|
|
-// }
|
|
|
-// }
|
|
|
-// /* package p is independent of the installed ones */
|
|
|
-// havechoice = 1;
|
|
|
-// }
|
|
|
-// if (!havechoice || !q.count)
|
|
|
-// continue; /* no choice */
|
|
|
-//
|
|
|
-// /* now check the update rules of the installed package.
|
|
|
-// * if all packages of the update rules are contained in
|
|
|
-// * the dependency rules, there's no need to set up the choice rule */
|
|
|
-// map_empty(&m);
|
|
|
-// FOR_RULELITERALS(p, pp, r)
|
|
|
-// if (p > 0)
|
|
|
-// MAPSET(&m, p);
|
|
|
-// for (i = 0; i < qi.count; i++)
|
|
|
-// {
|
|
|
-// if (!qi.elements[i])
|
|
|
-// continue;
|
|
|
-// Rule *ur = solv->rules + solv->updaterules + (qi.elements[i] - pool->installed->start);
|
|
|
-// if (!ur->p)
|
|
|
-// ur = solv->rules + solv->featurerules + (qi.elements[i] - pool->installed->start);
|
|
|
-// if (!ur->p)
|
|
|
-// continue;
|
|
|
-// FOR_RULELITERALS(p, pp, ur)
|
|
|
-// if (!MAPTST(&m, p))
|
|
|
-// break;
|
|
|
-// if (p)
|
|
|
-// break;
|
|
|
-// for (j = i + 1; j < qi.count; j++)
|
|
|
-// if (qi.elements[i] == qi.elements[j])
|
|
|
-// qi.elements[j] = 0;
|
|
|
-// }
|
|
|
-// if (i == qi.count)
|
|
|
-// {
|
|
|
-// #if 0
|
|
|
-// printf("skipping choice ");
|
|
|
-// solver_printrule(solv, SAT_DEBUG_RESULT, solv->rules + rid);
|
|
|
-// #endif
|
|
|
-// continue;
|
|
|
-// }
|
|
|
-// d = q.count ? pool_queuetowhatprovides(pool, &q) : 0;
|
|
|
-// solver_addrule(solv, r->p, d);
|
|
|
-// queue_push(&solv->weakruleq, solv->nrules - 1);
|
|
|
-// solv->choicerules_ref[solv->nrules - 1 - solv->choicerules] = rid;
|
|
|
-// #if 0
|
|
|
-// printf("OLD ");
|
|
|
-// solver_printrule(solv, SAT_DEBUG_RESULT, solv->rules + rid);
|
|
|
-// printf("WEAK CHOICE ");
|
|
|
-// solver_printrule(solv, SAT_DEBUG_RESULT, solv->rules + solv->nrules - 1);
|
|
|
-// #endif
|
|
|
-// }
|
|
|
-// queue_free(&q);
|
|
|
-// queue_free(&qi);
|
|
|
-// map_free(&m);
|
|
|
-// map_free(&mneg);
|
|
|
-// solv->choicerules_end = solv->nrules;
|
|
|
-// }
|
|
|
- }
|
|
|
-
|
|
|
/***********************************************************************
|
|
|
***
|
|
|
*** Policy rule disabling/reenabling
|
|
@@ -939,8 +771,6 @@ class Solver
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- $this->addChoiceRules();
|
|
|
-
|
|
|
foreach ($this->rules as $rule) {
|
|
|
$this->addWatchesToRule($rule);
|
|
|
}
|
|
@@ -1523,10 +1353,6 @@ class Solver
|
|
|
$why = $lastWeakWhy;
|
|
|
}
|
|
|
|
|
|
- if ($lastWeakWhy->getType() == RuleSet::TYPE_CHOICE) {
|
|
|
- $this->disableChoiceRules($lastWeakWhy);
|
|
|
- }
|
|
|
-
|
|
|
$this->disableProblem($why);
|
|
|
|
|
|
/**
|