Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Check match for provide/require rules.
Vsevolod Stakhov committed 11 years ago
commit 9c11c094bcb3b8f2077f2b96e2a9d576bc4f6154
parent 82c2469
3 files changed +28 -1
modified libpkg/pkg_jobs_universe.c
@@ -426,6 +426,7 @@ pkg_jobs_universe_process_shlibs(struct pkg_jobs_universe *universe,

				pr->un = unit;
				pr->provide = shlib->name;
+
				pr->is_shlib = true;

				if (prhead == NULL) {
					DL_APPEND(prhead, pr);
@@ -538,6 +539,7 @@ pkg_jobs_universe_process_provides_requires(struct pkg_jobs_universe *universe,

				pr->un = unit;
				pr->provide = p->provide;
+
				pr->is_shlib = false;

				if (prhead == NULL) {
					DL_APPEND(prhead, pr);
modified libpkg/pkg_solve.c
@@ -296,6 +296,9 @@ pkg_solve_handle_provide (struct pkg_solve_problem *problem,
	struct pkg_solve_item *it = NULL;
	struct pkg_solve_variable *var, *curvar;
	struct pkg_job_universe_item *un;
+
	struct pkg_shlib *shlp;
+
	struct pkg_provide *np;
+
	struct pkg *pkg;

	/* Find the first package in the universe list */
	un = pr->un;
@@ -307,7 +310,28 @@ pkg_solve_handle_provide (struct pkg_solve_problem *problem,
	HASH_FIND_STR(problem->variables_by_uid, un->pkg->uid, var);

	LL_FOREACH(var, curvar) {
-
		/* For each provide */
+
		/*
+
		 * For each provide we need to check whether this package
+
		 * actually provides this require
+
		 */
+
		shlp = NULL;
+
		np = NULL;
+
		pkg = curvar->unit->pkg;
+

+
		if (pr->is_shlib) {
+
			HASH_FIND_STR(pkg->shlibs_provided, pr->provide, shlp);
+
		}
+
		else {
+
			HASH_FIND_STR(pkg->provides, pr->provide, np);
+
		}
+

+
		if (np == NULL && shlp == NULL) {
+
			pkg_debug(4, "%s provide is not satisfied by %s-%s(%c)", pr->provide,
+
					pkg->name, pkg->version, pkg->type == PKG_INSTALLED ?
+
							'l' : 'r');
+
			continue;
+
		}
+

		it = pkg_solve_item_new(curvar);
		if (it == NULL)
			return (EPKG_FATAL);
modified libpkg/private/pkg_jobs.h
@@ -78,6 +78,7 @@ struct pkg_job_seen {
struct pkg_job_provide {
	struct pkg_job_universe_item *un;
	const char *provide;
+
	bool is_shlib;
	struct pkg_job_provide *next, *prev;
	UT_hash_handle hh;
};