Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Be more restrictive regarding requires/provides.
Vsevolod Stakhov committed 12 years ago
commit 7a22b5c0055485ba1c223c1dc46f7f5d8a89de51
parent 2d62b3e
2 files changed +43 -30
modified libpkg/pkg_jobs.c
@@ -591,8 +591,9 @@ pkg_jobs_add_universe(struct pkg_jobs *j, struct pkg *pkg,
	struct pkg_shlib *shlib = NULL;
	struct pkgdb_it *it;
	struct pkg_job_provide *pr, *prhead;
+
	struct pkg_job_seen *seen;
	int ret;
-
	const char *origin;
+
	const char *origin, *digest;
	unsigned flags = PKG_LOAD_BASIC|PKG_LOAD_OPTIONS|PKG_LOAD_DEPS|
			PKG_LOAD_SHLIBS_REQUIRED|PKG_LOAD_SHLIBS_PROVIDED|
			PKG_LOAD_ANNOTATIONS|PKG_LOAD_CONFLICTS;
@@ -715,6 +716,12 @@ pkg_jobs_add_universe(struct pkg_jobs *j, struct pkg *pkg,
				npkg = NULL;
				prhead = NULL;
				while (pkgdb_it_next(it, &npkg, flags) == EPKG_OK) {
+
					/* Skip seen packages */
+
					pkg_get(npkg, PKG_DIGEST, &digest);
+
					HASH_FIND_STR(j->seen, digest, seen);
+
					if (seen != NULL)
+
						continue;
+

					if (pkg_jobs_add_universe(j, npkg, recursive, false, &unit) != EPKG_OK)
						return (EPKG_FATAL);
					pr = calloc (1, sizeof (*pr));
@@ -737,9 +744,12 @@ pkg_jobs_add_universe(struct pkg_jobs *j, struct pkg *pkg,
				pkgdb_it_free(it);
				if (prhead == NULL) {
					pkg_get(pkg, PKG_ORIGIN, &origin);
-
					pkg_emit_error("cannot find packages that provide %s required for %s",
+
					pkg_debug(1, "cannot find packages that provide %s required for %s",
							pkg_shlib_name(shlib), origin);
-
					return (EPKG_FATAL);
+
					/*
+
					 * XXX: this is not normal but it is very common for the existing
+
					 * repos, hence we just ignore this stale dependency
+
					 */
				}
			}
		}
modified libpkg/pkg_solve.c
@@ -583,7 +583,7 @@ pkg_solve_add_pkg_rule(struct pkg_jobs *j, struct pkg_solve_problem *problem,
	struct pkg_job_provide *pr, *prhead;
	int cnt;

-
	const char *origin;
+
	const char *origin, *digest;

	/* Go through all deps in all variables*/
	LL_FOREACH(pvar, cur_var) {
@@ -715,42 +715,45 @@ pkg_solve_add_pkg_rule(struct pkg_jobs *j, struct pkg_solve_problem *problem,
					cnt = 1;
					LL_FOREACH(prhead, pr) {
						/* For each provide */
-
						pkg_get(pr->un->pkg, PKG_ORIGIN, &origin);
-
						HASH_FIND(ho, problem->variables_by_origin, origin,
-
								strlen(origin), var);
+
						pkg_get(pr->un->pkg, PKG_DIGEST, &digest);
+
						HASH_FIND(hd, problem->variables_by_digest, digest,
+
								strlen(digest), var);
						if (var == NULL) {
-
							if (pkg_solve_add_universe_variable(j, problem, origin, &var)
-
									!= EPKG_OK)
-
								continue;
+
							continue;
						}
						/* XXX: select all its versions? */
-
						LL_FOREACH(var, tvar) {
-
							if (var->unit->pkg->type == PKG_INSTALLED)
-
								continue;
-
							it = pkg_solve_item_new(tvar);
-
							if (it == NULL)
-
								goto err;
-

-
							it->inverse = false;
-
							RULE_ITEM_PREPEND(rule, it);
-
							cnt ++;
-
						}
+

+
						it = pkg_solve_item_new(var);
+
						if (it == NULL)
+
							goto err;
+

+
						it->inverse = false;
+
						RULE_ITEM_PREPEND(rule, it);
+
						cnt ++;
					}

-
					pkg_solve_add_var_rules (var, rule->items, cnt, true, "provide");
-
					pkg_solve_add_var_rules (cur_var, rule->items, cnt, false, "provide");
+
					if (cnt > 1) {
+
						pkg_solve_add_var_rules (var, rule->items, cnt, true, "provide");
+
						pkg_solve_add_var_rules (cur_var, rule->items, cnt, false, "provide");

-
					LL_PREPEND(problem->rules, rule);
-
					problem->rules_count ++;
+
						LL_PREPEND(problem->rules, rule);
+
						problem->rules_count ++;
+
					}
+
					else {
+
						/* Missing dependencies... */
+
						free(it);
+
						free(rule);
+
					}
				}
-
#if 0
-
				/* XXX: not working */
				else {
-
					pkg_emit_error("solver: cannot find provide for required shlib %s",
+
					/*
+
					 * XXX:
+
					 * This is terribly broken now so ignore till provides/requires
+
					 * are really fixed.
+
					 */
+
					pkg_debug(1, "solver: cannot find provide for required shlib %s",
							pkg_shlib_name(shlib));
-
					goto err;
				}
-
#endif
			}
		}