Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Properly add chain conflicts rule.
Vsevolod Stakhov committed 11 years ago
commit 222fbfe0507c85786828109768f5bcca4b6c9229
parent 8eb1bd5
1 file changed +18 -11
modified libpkg/pkg_solve.c
@@ -645,7 +645,7 @@ static int
pkg_solve_add_chain_rule(struct pkg_solve_problem *problem,
	struct pkg_solve_variable *var)
{
-
	struct pkg_solve_variable *curvar;
+
	struct pkg_solve_variable *curvar, *confvar;
	struct pkg_solve_rule *rule;
	struct pkg_solve_item *it = NULL;

@@ -654,13 +654,17 @@ pkg_solve_add_chain_rule(struct pkg_solve_problem *problem,
		var = var->prev;
	}

-
	LL_FOREACH(var->next, curvar) {
+
	LL_FOREACH(var, curvar) {
		/* Conflict rule: (!Ax | !Ay) */
+
		if (curvar->next == NULL) {
+
			break;
+
		}
+

		rule = pkg_solve_rule_new(PKG_RULE_UPGRADE_CONFLICT);
		if (rule == NULL)
			return (EPKG_FATAL);
		/* !Ax */
-
		it = pkg_solve_item_new(var);
+
		it = pkg_solve_item_new(curvar);
		if (it == NULL) {
			pkg_solve_rule_free(rule);
			return (EPKG_FATAL);
@@ -669,15 +673,18 @@ pkg_solve_add_chain_rule(struct pkg_solve_problem *problem,
		it->inverse = -1;
		RULE_ITEM_PREPEND(rule, it);

-
		/* !Ay */
-
		it = pkg_solve_item_new(curvar);
-
		if (it == NULL)
-
			return (EPKG_FATAL);
+
		LL_FOREACH(curvar->next, confvar) {

-
		it->inverse = -1;
-
		RULE_ITEM_PREPEND(rule, it);
+
			/* !Ay */
+
			it = pkg_solve_item_new(confvar);
+
			if (it == NULL)
+
				return (EPKG_FATAL);

-
		kv_prepend(typeof(rule), problem->rules, rule);
+
			it->inverse = -1;
+
			RULE_ITEM_PREPEND(rule, it);
+

+
			kv_prepend(typeof(rule), problem->rules, rule);
+
		}
	}

	return (EPKG_OK);
@@ -742,7 +749,7 @@ pkg_solve_process_universe_variable(struct pkg_solve_problem *problem,
		 * we need to register conflicts with all following
		 * vars
		 */
-
		if (!chain_added && cur_var->next != NULL) {
+
		if (!chain_added && (cur_var->next != NULL || cur_var->prev != var)) {
			if (pkg_solve_add_chain_rule(problem, cur_var) != EPKG_OK)
				continue;