Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
install: accept http:// https:// file:// url to install pkg
Baptiste Daroussin committed 1 month ago
commit 44e68ad916db9a6439580a7185ef65edff87a503
parent daaede3
2 files changed +70 -1
modified libpkg/pkg_jobs.c
@@ -208,6 +208,45 @@ pkg_jobs_free(struct pkg_jobs *j)
}

static bool
+
pkg_jobs_maybe_match_url(struct job_pattern *jp, const char *pattern)
+
{
+
	char path[MAXPATHLEN];
+
	const char *name;
+

+
	if (strncmp(pattern, "http://", 7) != 0 &&
+
	    strncmp(pattern, "https://", 8) != 0 &&
+
	    strncmp(pattern, "file://", 7) != 0)
+
		return (false);
+

+
	if (!str_ends_with(pattern, ".pkg"))
+
		return (false);
+

+
	name = strrchr(pattern, '/');
+
	if (name == NULL)
+
		name = pattern;
+
	else
+
		name++;
+

+
	snprintf(path, sizeof(path), "%s/%s.XXXXX",
+
	    getenv("TMPDIR") ? getenv("TMPDIR") : "/tmp", name);
+

+
	if (pkg_fetch_file(NULL, pattern, path, 0, 0, 0) != EPKG_OK) {
+
		pkg_emit_error("Failed to fetch package from '%s'", pattern);
+
		return (false);
+
	}
+

+
	dbg(2, "Fetched URL to file: %s", path);
+
	jp->flags |= PKG_PATTERN_FLAG_FILE;
+
	jp->path = xstrdup(path);
+
	/* Use just the filename (without .pkg extension) as the pattern */
+
	int len = strlen(name) - 3; /* strip ".pkg" */
+
	jp->pattern = xmalloc(len);
+
	strlcpy(jp->pattern, name, len);
+

+
	return (true);
+
}
+

+
static bool
pkg_jobs_maybe_match_file(struct job_pattern *jp, const char *pattern)
{
	const char *dot_pos;
@@ -216,6 +255,9 @@ pkg_jobs_maybe_match_file(struct job_pattern *jp, const char *pattern)
	assert(jp != NULL);
	assert(pattern != NULL);

+
	if (pkg_jobs_maybe_match_url(jp, pattern))
+
		return (true);
+

	dot_pos = strrchr(pattern, '.');
	if (dot_pos != NULL) {
		/*
modified tests/frontend/install.sh
@@ -13,7 +13,8 @@ tests_init \
	install_autoremove_flag \
	install_suggest_clear_automatic \
	install_suggest_set_automatic \
-
	install_no_suggest_when_flag_matches
+
	install_no_suggest_when_flag_matches \
+
	install_from_url

test_setup()
{
@@ -464,3 +465,29 @@ EOF
		-o inline:"0\n" \
		pkg query "%a" test
}
+

+
install_from_url_body() {
+
	# pkg install should accept file:// URLs
+
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "test" "test" "1"
+

+
	atf_check pkg create -M test.ucl -o ./repo
+

+
	cat << EOF > pkg.conf
+
PKG_DBDIR=${TMPDIR}
+
REPOS_DIR=[]
+
repositories: {
+
	local: { url : file://${TMPDIR}/repo }
+
}
+
EOF
+

+
	atf_check -o ignore pkg -C ./pkg.conf repo ./repo
+
	atf_check -o ignore pkg -C ./pkg.conf update -f
+

+
	# Install from a file:// URL
+
	atf_check \
+
		-o match:"Installing test" \
+
		-s exit:0 \
+
		pkg -C ./pkg.conf install -y file://${TMPDIR}/repo/test-1.pkg
+

+
	atf_check -s exit:0 pkg info -e test
+
}