Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
create: implement override_prefix
Baptiste Daroussin committed 2 years ago
commit bc1137cb29d7f73f4b4ad145c808e3d8ee762d20
parent 0f16921
6 files changed +95 -5
modified libpkg/pkg.c
@@ -80,6 +80,7 @@ pkg_free(struct pkg *pkg)
	free(pkg->digest);
	free(pkg->old_digest);
	free(pkg->prefix);
+
	free(pkg->oprefix);
	free(pkg->comment);
	free(pkg->desc);
	free(pkg->sum);
modified libpkg/pkg_create.c
@@ -151,11 +151,23 @@ pkg_create_from_dir(struct pkg *pkg, const char *root,
	counter_init("packing files", nfiles);

	while (pkg_files(pkg, &file) == EPKG_OK) {
+
		char dpath[MAXPATHLEN];
+
		const char *dp = file->path;
+

+
		if (pkg->oprefix != NULL) {
+
			size_t l = strlen(pkg->prefix);
+
			if (strncmp(file->path, pkg->prefix, l) == 0 &&
+
			    (file->path[l] == '/' || l == 1)) {
+
				snprintf(dpath, sizeof(dpath), "%s%s%s",
+
				    pkg->oprefix, l == 1 ? "/" : "", file->path + l);
+
				dp = dpath;
+
			}
+
		}

		snprintf(fpath, sizeof(fpath), "%s%s%s", root ? root : "",
		    relocation, file->path);

-
		ret = packing_append_file_attr(pkg_archive, fpath, file->path,
+
		ret = packing_append_file_attr(pkg_archive, fpath, dp,
		    file->uname, file->gname, file->perm, file->fflags);
		if (ctx.developer_mode && ret != EPKG_OK)
			return (ret);
modified libpkg/pkg_manifest.c
@@ -900,7 +900,19 @@ pkg_emit_filelist(struct pkg *pkg, FILE *f)

	seq = NULL;
	while (pkg_files(pkg, &file) == EPKG_OK) {
-
		urlencode(file->path, &b);
+
		char dpath[MAXPATHLEN];
+
		const char *dp = file->path;
+

+
		if (pkg->oprefix != NULL) {
+
			size_t l = strlen(pkg->prefix);
+
			if (strncmp(file->path, pkg->prefix, l) == 0 &&
+
			    (file->path[l] == '/' || l == 1)) {
+
				snprintf(dpath, sizeof(dpath), "%s%s%s",
+
				    pkg->oprefix, l == 1 ? "/" : "", file->path + l);
+
				dp = dpath;
+
			}
+
		}
+
		urlencode(dp, &b);
		if (seq == NULL)
			seq = ucl_object_typed_new(UCL_ARRAY);
		ucl_array_append(seq, ucl_object_fromlstring(b->buf, strlen(b->buf)));
@@ -1126,10 +1138,22 @@ pkg_emit_object(struct pkg *pkg, short flags)
			pkg_debug(4, "Emitting files");
			map = NULL;
			while (pkg_files(pkg, &file) == EPKG_OK) {
+
				char dpath[MAXPATHLEN];
+
				const char *dp = file->path;
+

+
				if (pkg->oprefix != NULL) {
+
					size_t l = strlen(pkg->prefix);
+
					if (strncmp(file->path, pkg->prefix, l) == 0 &&
+
							(file->path[l] == '/' || l == 1)) {
+
						snprintf(dpath, sizeof(dpath), "%s%s%s",
+
								pkg->oprefix, l == 1 ? "/" : "", file->path + l);
+
						dp = dpath;
+
					}
+
				}
				if (file->sum == NULL)
					file->sum = xstrdup("-");

-
				urlencode(file->path, &tmpsbuf);
+
				urlencode(dp, &tmpsbuf);
				if (map == NULL)
					map = ucl_object_typed_new(UCL_OBJECT);
				ucl_object_insert_key(map,
modified libpkg/pkg_ports.c
@@ -56,6 +56,7 @@

static ucl_object_t *keyword_schema = NULL;

+
static int override_prefix(struct plist *, char *, struct file_attr *);
static int setprefix(struct plist *, char *, struct file_attr *);
static int dir(struct plist *, char *, struct file_attr *);
static int file(struct plist *, char *, struct file_attr *);
@@ -81,6 +82,7 @@ static struct action_cmd {
	{ "setgroup", setgroup, 8 },
	{ "comment", comment_key, 7 },
	{ "config", config, 6 },
+
	{ "override_prefix", override_prefix, 15 },
	/* compat with old packages */
	{ "name", name_key, 4 },
	{ NULL, NULL, 0 }
@@ -178,6 +180,18 @@ free_file_attr(struct file_attr *a)
}

static int
+
override_prefix(struct plist *p, char *line, struct file_attr *a __unused)
+
{
+
	char *np = NULL;
+

+
	if (line[0] != '\0')
+
		np = xstrdup(line);
+
	free(p->pkg->oprefix);
+
	p->pkg->oprefix = np;
+
	return (EPKG_OK);
+
}
+

+
static int
setprefix(struct plist *p, char *line, struct file_attr *a __unused)
{
	/* if no arguments then set default prefix */
@@ -462,6 +476,7 @@ static struct keyact {
	{ "mode", setmod },
	{ "owner", setowner },
	{ "group", setgroup },
+
	{ "override_prefix", override_prefix },
	/* old pkg compat */
	{ "name", name_key },
	{ NULL, NULL },
modified libpkg/private/pkg.h
@@ -1,5 +1,5 @@
/*-
-
 * Copyright (c) 2011-2022 Baptiste Daroussin <bapt@FreeBSD.org>
+
 * Copyright (c) 2011-2023 Baptiste Daroussin <bapt@FreeBSD.org>
 * Copyright (c) 2011-2012 Julien Laffaye <jlaffaye@FreeBSD.org>
 * Copyright (c) 2013 Matthew Seaman <matthew@FreeBSD.org>
 * Copyright (c) 2013-2017 Vsevolod Stakhov <vsevolod@FreeBSD.org>
@@ -217,6 +217,7 @@ struct pkg {
	char			*old_digest;
	messages_t		 message;
	char			*prefix;
+
	char			*oprefix;
	char			*comment;
	char			*desc;
	char			*sum;
modified tests/frontend/create.sh
@@ -25,7 +25,8 @@ tests_init \
	create_from_plist_keyword_validation \
	create_from_plist_keyword_real_args \
	create_from_plist_keyword_lua_actions \
-
	create_from_plist_keyword_deprecated
+
	create_from_plist_keyword_deprecated \
+
	create_from_plist_keyword_override_prefix

genmanifest() {
	cat << EOF >> +MANIFEST
@@ -44,6 +45,23 @@ EOD
EOF
}

+
genprefixmanifest() {
+
	cat << EOF >> +MANIFEST
+
name: test
+
origin: test
+
version: 1
+
maintainer: test
+
categories: [test]
+
comment: a test
+
www: http://test
+
prefix: /prefix
+
abi = "*";
+
desc: <<EOD
+
Yet another test
+
EOD
+
EOF
+
}
+

genplist() {
	cat << EOF >> test.plist
$@
@@ -781,3 +799,22 @@ EOF
		pkg -o PLIST_KEYWORDS_DIR=. create -o ${TMPDIR} -m . -p test.plist -r .

}
+

+
create_from_plist_keyword_override_prefix_body()
+
{
+
	genmanifest
+
	genplist "@override_prefix /plop
+
	file"
+
	touch file
+
	atf_check pkg create -o ${TMPDIR} -m . -p test.plist -r .
+
	atf_check -o match:".*/plop/file$" tar tf test-1.pkg
+
	atf_check -o inline:"/plop/file\n" pkg info -F test-1.pkg -ql
+

+
	genprefixmanifest
+

+
	mkdir "prefix"
+
	touch prefix/file
+
	atf_check pkg create -o ${TMPDIR} -m . -p test.plist -r .
+
	atf_check -o match:".*/plop/file$" tar tf test-1.pkg
+
	atf_check -o inline:"/plop/file\n" pkg info -F test-1.pkg -ql
+
}