Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Try to implement reponame pinning in the solver
Vsevolod Stakhov committed 9 years ago
commit 9c2a5df16a3394edeada56fad49d8f3f96b720c2
parent 1f44c60
3 files changed +83 -35
modified libpkg/pkg_jobs_universe.c
@@ -947,18 +947,26 @@ pkg_jobs_universe_select_max_prio(struct pkg_job_universe_item *chain)

static struct pkg_job_universe_item *
pkg_jobs_universe_select_same_repo(struct pkg_job_universe_item *chain,
-
	struct pkg_job_universe_item *local)
+
	struct pkg_job_universe_item *local, const char *assumed_reponame)
{
	struct pkg_repo *local_repo = NULL, *repo;
	struct pkg_job_universe_item *cur, *res = NULL;

-
	if (local->pkg->reponame) {
-
		local_repo = pkg_repo_find(local->pkg->reponame);
+
	if (!local) {
+

+
		if (assumed_reponame) {
+
			local_repo = pkg_repo_find(assumed_reponame);
+
		}
	}
	else {
-
		const char *lrepo = pkg_kv_get(&local->pkg->annotations, "repository");
-
		if (lrepo) {
-
			local_repo = pkg_repo_find(lrepo);
+
		if (local->pkg->reponame) {
+
			local_repo = pkg_repo_find(local->pkg->reponame);
+
		}
+
		else {
+
			const char *lrepo = pkg_kv_get(&local->pkg->annotations, "repository");
+
			if (lrepo) {
+
				local_repo = pkg_repo_find(lrepo);
+
			}
		}
	}

@@ -991,31 +999,44 @@ pkg_jobs_universe_select_same_repo(struct pkg_job_universe_item *chain,

struct pkg_job_universe_item *
pkg_jobs_universe_select_candidate(struct pkg_job_universe_item *chain,
-
	struct pkg_job_universe_item *local, bool conservative)
+
	struct pkg_job_universe_item *local, bool conservative, const char *reponame)
{
-
	struct pkg_job_universe_item *res;
+
	struct pkg_job_universe_item *res = NULL;

	if (local == NULL) {
		/* New package selection */
		if (conservative) {
-
			/* Priority -> version */
-
			res = pkg_jobs_universe_select_max_prio(chain);
+
			/* Check same repo */
+
			if (reponame) {
+
				res =  pkg_jobs_universe_select_same_repo(chain, NULL, reponame);
+
			}
+

			if (res == NULL) {
-
				res = pkg_jobs_universe_select_max_ver(chain);
+
				/* Priority -> version */
+
				res = pkg_jobs_universe_select_max_prio(chain);
+
				if (res == NULL) {
+
					res = pkg_jobs_universe_select_max_ver(chain);
+
				}
			}
		}
		else {
-
			/* Version -> priority */
-
			res = pkg_jobs_universe_select_max_ver(chain);
+
			if (reponame) {
+
				res =  pkg_jobs_universe_select_same_repo(chain, NULL, reponame);
+
			}
+

			if (res == NULL) {
-
				res = pkg_jobs_universe_select_max_prio(chain);
+
				/* Version -> priority */
+
				res = pkg_jobs_universe_select_max_ver(chain);
+
				if (res == NULL) {
+
					res = pkg_jobs_universe_select_max_prio(chain);
+
				}
			}
		}
	}
	else {
		if (conservative) {
			/* same -> prio -> version */
-
			res = pkg_jobs_universe_select_same_repo(chain, local);
+
			res = pkg_jobs_universe_select_same_repo(chain, local, reponame);
			if (res == NULL) {
				res = pkg_jobs_universe_select_max_prio(chain);
			}
@@ -1025,7 +1046,7 @@ pkg_jobs_universe_select_candidate(struct pkg_job_universe_item *chain,
		}
		else {
			/* same -> version -> prio */
-
			res = pkg_jobs_universe_select_same_repo(chain, local);
+
			res = pkg_jobs_universe_select_same_repo(chain, local, reponame);
			if (res == NULL) {
				res = pkg_jobs_universe_select_max_ver(chain);
			}
@@ -1084,7 +1105,7 @@ pkg_jobs_universe_process_upgrade_chains(struct pkg_jobs *j)
			struct pkg_job_universe_item *selected;

			selected = pkg_jobs_universe_select_candidate(unit, local,
-
				j->conservative);
+
				j->conservative, NULL);
			/*
			 * Now remove all requests but selected from the requested
			 * candidates
modified libpkg/pkg_solve.c
@@ -79,6 +79,7 @@ struct pkg_solve_variable {
	int order;
	const char *digest;
	const char *uid;
+
	const char *assumed_reponame;
	UT_hash_handle hh;
	struct pkg_solve_variable *next, *prev;
};
@@ -296,7 +297,7 @@ pkg_debug_print_rule(struct pkg_solve_rule *rule)
static int
pkg_solve_handle_provide (struct pkg_solve_problem *problem,
		struct pkg_job_provide *pr, struct pkg_solve_rule *rule,
-
		struct pkg *orig, int *cnt)
+
		struct pkg *orig, const char *reponame, int *cnt)
{
	struct pkg_solve_item *it = NULL;
	struct pkg_solve_variable *var, *curvar;
@@ -341,6 +342,11 @@ pkg_solve_handle_provide (struct pkg_solve_problem *problem,
							'l' : 'r');
			continue;
		}
+

+
		if (curvar->assumed_reponame == NULL) {
+
			curvar->assumed_reponame = reponame;
+
		}
+

		pkg_debug(4, "solver: %s provide is satisfied by %s-%s(%c)", pr->provide,
				pkg->name, pkg->version, pkg->type == PKG_INSTALLED ?
				'l' : 'r');
@@ -360,7 +366,8 @@ pkg_solve_handle_provide (struct pkg_solve_problem *problem,
static int
pkg_solve_add_depend_rule(struct pkg_solve_problem *problem,
		struct pkg_solve_variable *var,
-
		struct pkg_dep *dep)
+
		struct pkg_dep *dep,
+
		const char *reponame)
{
	const char *uid;
	struct pkg_solve_variable *depvar, *curvar;
@@ -390,6 +397,11 @@ pkg_solve_add_depend_rule(struct pkg_solve_problem *problem,
	/* B1 | B2 | ... */
	cnt = 1;
	LL_FOREACH(depvar, curvar) {
+
		/* Propagate reponame */
+
		if (curvar->assumed_reponame == NULL) {
+
			curvar->assumed_reponame = reponame;
+
		}
+

		it = pkg_solve_item_new(curvar);
		if (it == NULL) {
			pkg_solve_rule_free(rule);
@@ -487,7 +499,8 @@ pkg_solve_add_conflict_rule(struct pkg_solve_problem *problem,
static int
pkg_solve_add_require_rule(struct pkg_solve_problem *problem,
		struct pkg_solve_variable *var,
-
		const char *requirement)
+
		const char *requirement,
+
		const char *reponame)
{
	struct pkg_solve_rule *rule;
	struct pkg_solve_item *it = NULL;
@@ -518,7 +531,8 @@ pkg_solve_add_require_rule(struct pkg_solve_problem *problem,
		/* B1 | B2 | ... */
		cnt = 1;
		LL_FOREACH(prhead, pr) {
-
			if (pkg_solve_handle_provide(problem, pr, rule, pkg, &cnt) != EPKG_OK) {
+
			if (pkg_solve_handle_provide(problem, pr, rule, pkg, reponame, &cnt)
+
					!= EPKG_OK) {
				free(it);
				free(rule);
				return (EPKG_FATAL);
@@ -732,10 +746,26 @@ pkg_solve_process_universe_variable(struct pkg_solve_problem *problem,
	LL_FOREACH(var, cur_var) {
		pkg = cur_var->unit->pkg;

+
		/* Request */
+
		if (!(cur_var->flags & PKG_VAR_TOP)) {
+
			HASH_FIND_STR(j->request_add, cur_var->uid, jreq);
+
			if (jreq != NULL)
+
				pkg_solve_add_request_rule(problem, cur_var, jreq, 1);
+
			HASH_FIND_STR(j->request_delete, cur_var->uid, jreq);
+
			if (jreq != NULL)
+
				pkg_solve_add_request_rule(problem, cur_var, jreq, -1);
+
		}
+

+
		if (jreq) {
+
			cur_var->assumed_reponame = pkg->reponame;
+
		}
+

		/* Depends */
		kh_each_value(pkg->deps, dep, {
-
			if (pkg_solve_add_depend_rule(problem, cur_var, dep) != EPKG_OK)
+
			if (pkg_solve_add_depend_rule(problem, cur_var, dep,
+
					cur_var->assumed_reponame) != EPKG_OK) {
				continue;
+
			}
		});

		/* Conflicts */
@@ -749,25 +779,18 @@ pkg_solve_process_universe_variable(struct pkg_solve_problem *problem,
		buf = NULL;
		while (pkg_shlibs_required(pkg, &buf) == EPKG_OK) {
			if (pkg_solve_add_require_rule(problem, cur_var,
-
					buf) != EPKG_OK)
+
					buf, cur_var->assumed_reponame) != EPKG_OK) {
				continue;
+
			}
		}
		buf = NULL;
		while (pkg_requires(pkg, &buf) == EPKG_OK) {
			if (pkg_solve_add_require_rule(problem, cur_var,
-
					buf) != EPKG_OK)
+
					buf, cur_var->assumed_reponame) != EPKG_OK) {
				continue;
+
			}
		}

-
		/* Request */
-
		if (!(cur_var->flags & PKG_VAR_TOP)) {
-
			HASH_FIND_STR(j->request_add, cur_var->uid, jreq);
-
			if (jreq != NULL)
-
				pkg_solve_add_request_rule(problem, cur_var, jreq, 1);
-
			HASH_FIND_STR(j->request_delete, cur_var->uid, jreq);
-
			if (jreq != NULL)
-
				pkg_solve_add_request_rule(problem, cur_var, jreq, -1);
-
		}

		/*
		 * If this var chain contains mutually conflicting vars
@@ -943,6 +966,7 @@ pkg_solve_set_initial_assumption(struct pkg_solve_problem *problem,
	struct pkg_solve_item *item;
	struct pkg_solve_variable *var, *cvar;
	bool conservative = false, prefer_local = false;
+
	const char *assumed_reponame = NULL;

	if (problem->j->type == PKG_JOBS_INSTALL) {
		/* Avoid upgrades on INSTALL job */
@@ -963,6 +987,7 @@ pkg_solve_set_initial_assumption(struct pkg_solve_problem *problem,
		assert (rule->items != NULL);
		item = rule->items;
		var = item->var;
+
		assumed_reponame = var->assumed_reponame;

		/* Check what we are depending on */
		if (!(var->flags & (PKG_VAR_TOP|PKG_VAR_ASSUMED_TRUE))) {
@@ -992,6 +1017,7 @@ pkg_solve_set_initial_assumption(struct pkg_solve_problem *problem,
		while (var->prev->next != NULL) {
			var = var->prev;
		}
+

		LL_FOREACH(var, cvar) {
			if (cvar->flags & PKG_VAR_ASSUMED) {
				/* Do not reassume packages */
@@ -1013,7 +1039,7 @@ pkg_solve_set_initial_assumption(struct pkg_solve_problem *problem,
		}
		else {
			selected = pkg_jobs_universe_select_candidate(first, local,
-
					conservative);
+
					conservative, assumed_reponame);
		}

		/* Now we can find the according var */
modified libpkg/private/pkg_jobs.h
@@ -246,7 +246,8 @@ pkg_jobs_universe_get_upgrade_candidates(struct pkg_jobs_universe *universe,
 */
struct pkg_job_universe_item *
pkg_jobs_universe_select_candidate(struct pkg_job_universe_item *chain,
-
	struct pkg_job_universe_item *local, bool conservative);
+
	struct pkg_job_universe_item *local, bool conservative,
+
	const char *reponame);

/*
 * Free job request (with all candidates)