#include "evr.h"
#include "solverdebug.h"
-/* turn a problem rule into a problem id by normalizing it */
+/**********************************************************************************/
+
+/* a problem is an item on the solver's problem list. It can either be >0, in that
+ * case it is a update/infarch/dup rule, or it can be <0, which makes it refer to a job
+ * consisting of multiple job rules.
+ */
+
+static void
+solver_disableproblem(Solver *solv, Id v)
+{
+ int i;
+ Id *jp;
+
+ if (v > 0)
+ {
+ if (v >= solv->infarchrules && v < solv->infarchrules_end)
+ {
+ Pool *pool = solv->pool;
+ Id name = pool->solvables[-solv->rules[v].p].name;
+ while (v > solv->infarchrules && pool->solvables[-solv->rules[v - 1].p].name == name)
+ v--;
+ for (; v < solv->infarchrules_end && pool->solvables[-solv->rules[v].p].name == name; v++)
+ solver_disablerule(solv, solv->rules + v);
+ return;
+ }
+ if (v >= solv->duprules && v < solv->duprules_end)
+ {
+ Pool *pool = solv->pool;
+ Id name = pool->solvables[-solv->rules[v].p].name;
+ while (v > solv->duprules && pool->solvables[-solv->rules[v - 1].p].name == name)
+ v--;
+ for (; v < solv->duprules_end && pool->solvables[-solv->rules[v].p].name == name; v++)
+ solver_disablerule(solv, solv->rules + v);
+ return;
+ }
+ solver_disablerule(solv, solv->rules + v);
+ return;
+ }
+ v = -(v + 1);
+ jp = solv->ruletojob.elements;
+ if (solv->bestrules_pkg)
+ {
+ int ni = solv->bestrules_end - solv->bestrules;
+ for (i = 0; i < ni; i++)
+ {
+ int j = solv->bestrules_pkg[i];
+ if (j < 0 && jp[-j - solv->jobrules] == v)
+ solver_disablerule(solv, solv->rules + solv->bestrules + i);
+ }
+ }
+ for (i = solv->jobrules; i < solv->jobrules_end; i++, jp++)
+ if (*jp == v)
+ solver_disablerule(solv, solv->rules + i);
+}
+
+/*-------------------------------------------------------------------
+ * enableproblem
+ */
+
+static void
+solver_enableproblem(Solver *solv, Id v)
+{
+ Rule *r;
+ int i;
+ Id *jp;
+
+ if (v > 0)
+ {
+ if (v >= solv->infarchrules && v < solv->infarchrules_end)
+ {
+ Pool *pool = solv->pool;
+ Id name = pool->solvables[-solv->rules[v].p].name;
+ while (v > solv->infarchrules && pool->solvables[-solv->rules[v - 1].p].name == name)
+ v--;
+ for (; v < solv->infarchrules_end && pool->solvables[-solv->rules[v].p].name == name; v++)
+ solver_enablerule(solv, solv->rules + v);
+ return;
+ }
+ if (v >= solv->duprules && v < solv->duprules_end)
+ {
+ Pool *pool = solv->pool;
+ Id name = pool->solvables[-solv->rules[v].p].name;
+ while (v > solv->duprules && pool->solvables[-solv->rules[v - 1].p].name == name)
+ v--;
+ for (; v < solv->duprules_end && pool->solvables[-solv->rules[v].p].name == name; v++)
+ solver_enablerule(solv, solv->rules + v);
+ return;
+ }
+ if (v >= solv->featurerules && v < solv->featurerules_end)
+ {
+ /* do not enable feature rule if update rule is enabled */
+ r = solv->rules + (v - solv->featurerules + solv->updaterules);
+ if (r->d >= 0)
+ return;
+ }
+ solver_enablerule(solv, solv->rules + v);
+ if (v >= solv->updaterules && v < solv->updaterules_end)
+ {
+ /* disable feature rule when enabling update rule */
+ r = solv->rules + (v - solv->updaterules + solv->featurerules);
+ if (r->p)
+ solver_disablerule(solv, r);
+ }
+ return;
+ }
+ v = -(v + 1);
+ jp = solv->ruletojob.elements;
+ if (solv->bestrules_pkg)
+ {
+ int ni = solv->bestrules_end - solv->bestrules;
+ for (i = 0; i < ni; i++)
+ {
+ int j = solv->bestrules_pkg[i];
+ if (j < 0 && jp[-j - solv->jobrules] == v)
+ solver_enablerule(solv, solv->rules + solv->bestrules + i);
+ }
+ }
+ for (i = solv->jobrules; i < solv->jobrules_end; i++, jp++)
+ if (*jp == v)
+ solver_enablerule(solv, solv->rules + i);
+}
+
+
+/*-------------------------------------------------------------------
+ * turn a problem rule into a problem id by normalizing it
+ */
static Id
solver_ruletoproblem(Solver *solv, Id rid)
{
return rid;
}
-/* when the solver runs into a problem, it needs to disable all
+/*-------------------------------------------------------------------
+ * when the solver runs into a problem, it needs to disable all
* involved non-pkg rules and record the rules for solution
* generation.
*/
queue_push(&solv->problems, v);
}
-/* this is called when a problem is solved by disabling a rule.
- * It calls disableproblem and then re-enables policy rules */
+/*-------------------------------------------------------------------
+ * this is called when a problem is solved by disabling a rule.
+ * It calls disableproblem and then re-enables policy rules
+ */
void
solver_fixproblem(Solver *solv, Id rid)
{
solver_reenablepolicyrules(solv, -v);
}
-/* try to fix a problem by auto-uninstalling packages */
+/*-------------------------------------------------------------------
+ * disable a set of problems
+ */
+void
+solver_disableproblemset(Solver *solv, int start)
+{
+ int i;
+ for (i = start + 1; i < solv->problems.count - 1; i++)
+ solver_disableproblem(solv, solv->problems.elements[i]);
+}
+
+/*-------------------------------------------------------------------
+ * try to fix a problem by auto-uninstalling packages
+ */
Id
-solver_autouninstall(Solver *solv, Id *problem)
+solver_autouninstall(Solver *solv, int start)
{
Pool *pool = solv->pool;
int i;
return 0; /* why did we get called? */
m = &solv->allowuninstallmap;
}
- for (i = 0; (v = problem[i]) != 0; i++)
+ for (i = start + 1; i < solv->problems.count - 1; i++)
{
+ v = solv->problems.elements[i];
if (v < 0)
extraflags &= solv->job.elements[-v - 1];
if (v >= solv->updaterules && v < solv->updaterules_end)
return v;
}
-/**********************************************************************************/
-
-/* a problem is an item on the solver's problem list. It can either be >0, in that
- * case it is a update/infarch/dup rule, or it can be <0, which makes it refer to a job
- * consisting of multiple job rules.
- */
-
-void
-solver_disableproblem(Solver *solv, Id v)
-{
- int i;
- Id *jp;
-
- if (v > 0)
- {
- if (v >= solv->infarchrules && v < solv->infarchrules_end)
- {
- Pool *pool = solv->pool;
- Id name = pool->solvables[-solv->rules[v].p].name;
- while (v > solv->infarchrules && pool->solvables[-solv->rules[v - 1].p].name == name)
- v--;
- for (; v < solv->infarchrules_end && pool->solvables[-solv->rules[v].p].name == name; v++)
- solver_disablerule(solv, solv->rules + v);
- return;
- }
- if (v >= solv->duprules && v < solv->duprules_end)
- {
- Pool *pool = solv->pool;
- Id name = pool->solvables[-solv->rules[v].p].name;
- while (v > solv->duprules && pool->solvables[-solv->rules[v - 1].p].name == name)
- v--;
- for (; v < solv->duprules_end && pool->solvables[-solv->rules[v].p].name == name; v++)
- solver_disablerule(solv, solv->rules + v);
- return;
- }
- solver_disablerule(solv, solv->rules + v);
- return;
- }
- v = -(v + 1);
- jp = solv->ruletojob.elements;
- if (solv->bestrules_pkg)
- {
- int ni = solv->bestrules_end - solv->bestrules;
- for (i = 0; i < ni; i++)
- {
- int j = solv->bestrules_pkg[i];
- if (j < 0 && jp[-j - solv->jobrules] == v)
- solver_disablerule(solv, solv->rules + solv->bestrules + i);
- }
- }
- for (i = solv->jobrules; i < solv->jobrules_end; i++, jp++)
- if (*jp == v)
- solver_disablerule(solv, solv->rules + i);
-}
-
-/*-------------------------------------------------------------------
- * enableproblem
- */
-
-void
-solver_enableproblem(Solver *solv, Id v)
-{
- Rule *r;
- int i;
- Id *jp;
-
- if (v > 0)
- {
- if (v >= solv->infarchrules && v < solv->infarchrules_end)
- {
- Pool *pool = solv->pool;
- Id name = pool->solvables[-solv->rules[v].p].name;
- while (v > solv->infarchrules && pool->solvables[-solv->rules[v - 1].p].name == name)
- v--;
- for (; v < solv->infarchrules_end && pool->solvables[-solv->rules[v].p].name == name; v++)
- solver_enablerule(solv, solv->rules + v);
- return;
- }
- if (v >= solv->duprules && v < solv->duprules_end)
- {
- Pool *pool = solv->pool;
- Id name = pool->solvables[-solv->rules[v].p].name;
- while (v > solv->duprules && pool->solvables[-solv->rules[v - 1].p].name == name)
- v--;
- for (; v < solv->duprules_end && pool->solvables[-solv->rules[v].p].name == name; v++)
- solver_enablerule(solv, solv->rules + v);
- return;
- }
- if (v >= solv->featurerules && v < solv->featurerules_end)
- {
- /* do not enable feature rule if update rule is enabled */
- r = solv->rules + (v - solv->featurerules + solv->updaterules);
- if (r->d >= 0)
- return;
- }
- solver_enablerule(solv, solv->rules + v);
- if (v >= solv->updaterules && v < solv->updaterules_end)
- {
- /* disable feature rule when enabling update rule */
- r = solv->rules + (v - solv->updaterules + solv->featurerules);
- if (r->p)
- solver_disablerule(solv, r);
- }
- return;
- }
- v = -(v + 1);
- jp = solv->ruletojob.elements;
- if (solv->bestrules_pkg)
- {
- int ni = solv->bestrules_end - solv->bestrules;
- for (i = 0; i < ni; i++)
- {
- int j = solv->bestrules_pkg[i];
- if (j < 0 && jp[-j - solv->jobrules] == v)
- solver_enablerule(solv, solv->rules + solv->bestrules + i);
- }
- }
- for (i = solv->jobrules; i < solv->jobrules_end; i++, jp++)
- if (*jp == v)
- solver_enablerule(solv, solv->rules + i);
-}
-
/*-------------------------------------------------------------------
* enable weak rules