Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
solver: fix extra reinstallations
Baptiste Daroussin committed 2 months ago
commit 84f31da52d699a8b4aec6e92d6eb7f9f655d84ca
parent 17cf63c
1 file changed +27 -1
modified libpkg/pkg_jobs_universe.c
@@ -398,7 +398,20 @@ pkg_jobs_universe_handle_provide(struct pkg_jobs_universe *universe,
		/* Check for local packages */
		if ((unit = pkghash_get_value(universe->items, rpkg->uid)) != NULL) {
			dbg(4, "handle_provide: package %s already in universe", rpkg->uid);
-
			/* Remote provide is newer, so we can add it */
+
			/*
+
			 * Skip adding the remote package if a local version
+
			 * with the same digest already exists in the universe:
+
			 * there is nothing to upgrade.
+
			 */
+
			if (unit->pkg->type == PKG_INSTALLED &&
+
			    unit->pkg->digest != NULL &&
+
			    rpkg->digest != NULL &&
+
			    STREQ(unit->pkg->digest, rpkg->digest)) {
+
				dbg(4, "handle_provide: %s remote identical to local, skipping", rpkg->uid);
+
				pkg_free(rpkg);
+
				rpkg = NULL;
+
				goto provide;
+
			}
			if (pkg_jobs_universe_process_item(universe, rpkg,
			    &unit) != EPKG_OK) {
				continue;
@@ -415,6 +428,18 @@ pkg_jobs_universe_handle_provide(struct pkg_jobs_universe *universe,
						&unit) != EPKG_OK) {
					return (EPKG_FATAL);
				}
+
				/*
+
				 * Skip adding the remote package if the local
+
				 * version has the same digest.
+
				 */
+
				if (npkg->digest != NULL &&
+
				    rpkg->digest != NULL &&
+
				    STREQ(npkg->digest, rpkg->digest)) {
+
					dbg(4, "handle_provide: %s remote identical to local, skipping", rpkg->uid);
+
					pkg_free(rpkg);
+
					rpkg = NULL;
+
					goto provide;
+
				}
				if (pkg_jobs_universe_process_item(universe, rpkg,
						&unit) != EPKG_OK) {
					continue;
@@ -444,6 +469,7 @@ pkg_jobs_universe_handle_provide(struct pkg_jobs_universe *universe,
			rpkg = NULL;
		}

+
provide:
		pr = xcalloc (1, sizeof (*pr));
		pr->un = unit;
		pr->provide = name;