Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Use conflict types for solver.
Vsevolod Stakhov committed 12 years ago
commit 8aaa29fede1fc0dabc55983059d8719e877cb2ae
parent 3689fc6
2 files changed +32 -10
modified libpkg/pkg_jobs.c
@@ -1148,10 +1148,11 @@ pkg_conflicts_add_missing(struct pkg_jobs *j, const char *origin)
static void
pkg_conflicts_register_universe(struct pkg_jobs *j,
		struct pkg_job_universe_item *u1,
-
		struct pkg_job_universe_item *u2, bool local_only)
+
		struct pkg_job_universe_item *u2, bool local_only,
+
		enum pkg_conflict_type type)
{

-
	pkg_conflicts_register(u1->pkg, u2->pkg);
+
	pkg_conflicts_register(u1->pkg, u2->pkg, type);
}

static void
@@ -1195,15 +1196,22 @@ pkg_conflicts_add_from_pkgdb_local(const char *o1, const char *o2, void *ud)
	 */
	LL_FOREACH(u1, cur1) {
		LL_FOREACH(u2, cur2) {
-
			if ((cur1->pkg->type == PKG_INSTALLED && cur2->pkg->type != PKG_INSTALLED) ||
-
				(cur2->pkg->type == PKG_INSTALLED && cur1->pkg->type != PKG_INSTALLED)) {
+
			if (cur1->pkg->type == PKG_INSTALLED && cur2->pkg->type != PKG_INSTALLED) {
				pkg_get(cur1->pkg, PKG_DIGEST, &dig1);
				pkg_get(cur2->pkg, PKG_DIGEST, &dig2);
-
				pkg_conflicts_register_universe(j, cur1, cur2, true);
+
				pkg_conflicts_register_universe(j, cur1, cur2, true, PKG_CONFLICT_REMOTE_LOCAL);
				pkg_debug(2, "register conflict between local %s(%s) <-> remote %s(%s)",
						o1, dig1, o2, dig2);
				j->conflicts_registered ++;
			}
+
			else if (cur2->pkg->type == PKG_INSTALLED && cur1->pkg->type != PKG_INSTALLED) {
+
				pkg_get(cur1->pkg, PKG_DIGEST, &dig1);
+
				pkg_get(cur2->pkg, PKG_DIGEST, &dig2);
+
				pkg_conflicts_register_universe(j, cur1, cur2, true, PKG_CONFLICT_REMOTE_LOCAL);
+
				pkg_debug(2, "register conflict between local %s(%s) <-> remote %s(%s)",
+
						o2, dig2, o1, dig1);
+
				j->conflicts_registered ++;
+
			}
		}
	}
}
@@ -1244,7 +1252,7 @@ pkg_conflicts_add_from_pkgdb_remote(const char *o1, const char *o2, void *ud)
					HASH_FIND(hh, cur2->pkg->conflicts, o1, strlen(o1), c);
					if (c == NULL && cur2->pkg->type != PKG_INSTALLED) {
						/* No need to update priorities */
-
						pkg_conflicts_register(cur1->pkg, cur2->pkg);
+
						pkg_conflicts_register(cur1->pkg, cur2->pkg, PKG_CONFLICT_REMOTE_REMOTE);
						j->conflicts_registered ++;
						pkg_get(cur1->pkg, PKG_DIGEST, &dig1);
						pkg_get(cur2->pkg, PKG_DIGEST, &dig2);
modified libpkg/pkg_solve.c
@@ -606,11 +606,25 @@ pkg_solve_add_pkg_rule(struct pkg_jobs *j, struct pkg_solve_problem *problem,
			pkg_get(pkg, PKG_ORIGIN, &origin);
			/* Add conflict rule from each of the alternative */
			LL_FOREACH(var, tvar) {
-
				HASH_FIND_STR(tvar->unit->pkg->conflicts, origin, cfound);
-
				if (cfound == NULL) {
-
					/* Skip non-mutual conflicts */
-
					continue;
+
				if (conflict->type == PKG_CONFLICT_REMOTE_LOCAL) {
+
					/* Skip unappropriate packages */
+
					if (pkg->type == PKG_INSTALLED) {
+
						if (tvar->unit->pkg->type == PKG_INSTALLED)
+
							continue;
+
					}
+
					else {
+
						if (tvar->unit->pkg->type != PKG_INSTALLED)
+
							continue;
+
					}
				}
+
				else if (conflict->type == PKG_CONFLICT_REMOTE_REMOTE) {
+
					if (pkg->type == PKG_INSTALLED)
+
						continue;
+

+
					if (tvar->unit->pkg->type == PKG_INSTALLED)
+
						continue;
+
				}
+

				/* Conflict rule: (!A | !Bx) */
				rule = pkg_solve_rule_new();
				if (rule == NULL)