Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Improve package creation from a stagedir
Baptiste Daroussin committed 13 years ago
commit ef6db29fbc13dcd3cc6cfc6d33b5eee8f51a65bd
parent 5566b5e
3 files changed +149 -50
modified libpkg/pkg.h
@@ -807,9 +807,9 @@ typedef enum pkg_formats { TAR, TGZ, TBZ, TXZ } pkg_formats;
int pkg_create_installed(const char *, pkg_formats, const char *, struct pkg *);

/**
-
 * Create package from fakeroot install with a metadata directory
+
 * Create package from stage install with a metadata directory
 */
-
int pkg_create_fakeroot(const char *, pkg_formats, const char *, const char *);
+
int pkg_create_staged(const char *, pkg_formats, const char *, const char *, char *);

/**
 * Download the latest repo db file and checks its signature if any
modified libpkg/pkg_create.c
@@ -30,6 +30,7 @@

#include <assert.h>
#include <errno.h>
+
#include <regex.h>
#include <stdlib.h>
#include <string.h>

@@ -137,29 +138,125 @@ pkg_create_archive(const char *outdir, struct pkg *pkg, pkg_formats format, int
	return pkg_archive;
}

+
static const char * const scripts[] = {
+
	"+INSTALL",
+
	"+PRE_INSTALL",
+
	"+POST_INSTALL",
+
	"+POST_INSTALL",
+
	"+DEINSTALL",
+
	"+PRE_DEINSTALL",
+
	"+POST_DEINSTALL",
+
	"+UPGRADE",
+
	"+PRE_UPGRADE",
+
	"+POST_UPGRADE",
+
	"pkg-install",
+
	"pkg-pre-install",
+
	"pkg-post-install",
+
	"pkg-deinstall",
+
	"pkg-pre-deinstall",
+
	"pkg-post-deinstall",
+
	"pkg-upgrade",
+
	"pkg-pre-upgrade",
+
	"pkg-post-upgrade",
+
	NULL
+
};
+

int
-
pkg_create_fakeroot(const char *outdir, pkg_formats format, const char *rootdir, const char *metadatadir)
+
pkg_create_staged(const char *outdir, pkg_formats format, const char *rootdir, const char *metadatadir, char *plist)
{
	struct pkg *pkg = NULL;
	struct pkg_file *file = NULL;
	struct pkg_dir *dir = NULL;
	struct packing *pkg_archive = NULL;
-
	char *manifest = NULL, *manifest_path = NULL;
+
	char *manifest = NULL;
+
	char path[MAXPATHLEN];
+
	char arch[BUFSIZ];
	int ret = ENOMEM;
+
	char *buf;
+
	int i;
+
	regex_t preg;
+
	regmatch_t pmatch[2];
+
	size_t size;
+
	char *www;

	/* Load the manifest from the metadata directory */
-
	if (asprintf(&manifest_path, "%s/+MANIFEST", metadatadir) == -1)
+
	if (snprintf(path, sizeof(path), "%s/+MANIFEST", metadatadir) == -1)
		goto cleanup;

	pkg_new(&pkg, PKG_FILE);
	if (pkg == NULL)
		goto cleanup;

-
	if ((ret = pkg_load_manifest_file(pkg, manifest_path)) != EPKG_OK) {
+
	if ((ret = pkg_load_manifest_file(pkg, path)) != EPKG_OK) {
+
		ret = EPKG_FATAL;
+
		goto cleanup;
+
	}
+

+
	/* if no descriptions provided then try to get it from a file */
+

+
	pkg_get(pkg, PKG_DESC, &buf);
+
	if (buf == NULL) {
+
		if (snprintf(path, sizeof(path), "%s/+DESC", metadatadir) == -1)
+
			goto cleanup;
+
		if (access(path, F_OK) == 0)
+
			pkg_set_from_file(pkg, PKG_DESC, path);
+
	}
+

+
	/* if no message try to get it from a file */
+
	pkg_get(pkg, PKG_MESSAGE, &buf);
+
	if (buf == NULL) {
+
		if (snprintf(path, sizeof(path), "%s/+DISPLAY", metadatadir) == -1)
+
			goto cleanup;
+
		if (access(path, F_OK) == 0)
+
			pkg_set_from_file(pkg, PKG_MESSAGE, path);
+
	}
+

+
	/* if no arch autodetermine it */
+
	pkg_get(pkg, PKG_ARCH, &buf);
+
	if (buf == NULL) {
+
		pkg_get_myarch(arch, BUFSIZ);
+
		pkg_set(pkg, PKG_ARCH, arch);
+
	}
+

+
	/* if no mtree try to get it from a file */
+
	pkg_get(pkg, PKG_MTREE, &buf);
+
	if (buf == NULL) {
+
		if (snprintf(path, sizeof(path), "%s/+MTREE_DIRS", metadatadir) == -1)
+
			goto cleanup;
+
		if (access(path, F_OK) == 0)
+
			pkg_set_from_file(pkg, PKG_MTREE, path);
+
	}
+

+
	for (i = 0; scripts[i] != NULL; i++) {
+
		snprintf(path, sizeof(path), "%s/%s", metadatadir, scripts[i]);
+
		if (access(path, F_OK) == 0)
+
			pkg_addscript_file(pkg, path);
+
	}
+

+
	if (plist != NULL && ports_parse_plist(pkg, plist, rootdir) != EPKG_OK) {
		ret = EPKG_FATAL;
		goto cleanup;
	}

+
	/* if www is not given then try to determine it from description */
+
	pkg_get(pkg, PKG_WWW, &www);
+
	if (www == NULL) {
+
		pkg_get(pkg, PKG_DESC, &buf);
+
		regcomp(&preg, "^WWW:[[:space:]]*(.*)$", REG_EXTENDED|REG_ICASE|REG_NEWLINE);
+
		if (regexec(&preg, buf, 2, pmatch, 0) == 0) {
+
			size = pmatch[1].rm_eo - pmatch[1].rm_so;
+
			www = strndup(&buf[pmatch[1].rm_so], size);
+
			pkg_set(pkg, PKG_WWW, www);
+
			free(www);
+
		} else {
+
			pkg_set(pkg, PKG_WWW, "UNKNOWN");
+
		}
+
		regfree(&preg);
+
	} else {
+
		pkg_set(pkg, PKG_WWW, www);
+
		free(www);
+
	}
+

	/* Create the archive */
	pkg_archive = pkg_create_archive(outdir, pkg, format, 0);
	if (pkg_archive == NULL) {
@@ -180,8 +277,6 @@ pkg_create_fakeroot(const char *outdir, pkg_formats format, const char *rootdir,
cleanup:
	if (pkg != NULL)
		free(pkg);
-
	if (manifest_path != NULL)
-
		free(manifest_path);
	if (manifest != NULL)
		free(manifest);
	if (ret == EPKG_OK)
modified pkg/create.c
@@ -40,7 +40,7 @@
void
usage_create(void)
{
-
	fprintf(stderr, "usage: pkg create [-gx] [-n] [-r rootdir] [-m manifest] [-f format] [-o outdir] "
+
	fprintf(stderr, "usage: pkg create [-gx] [-n] [-r rootdir] [-m manifest] [-f format] [-o outdir] [-p plist]"
			"<pkg> ...\n");
	fprintf(stderr, "       pkg create -a [-n] [-r rootdir] [-m manifest] [-f format] [-o outdir]\n\n");
	fprintf(stderr, "For more information see 'pkg help create'.\n");
@@ -75,18 +75,18 @@ pkg_create_matches(int argc, char **argv, match_t match, pkg_formats fmt, const
				if (!overwrite) {
					const char *format;
					switch (fmt) {
-
						case TXZ:
-
							format = "txz";
-
							break;
-
						case TBZ:
-
							format = "tbz";
-
							break;
-
						case TGZ:
-
							format = "tgz";
-
							break;
-
						case TAR:
-
							format = "tar";
-
							break;
+
					case TXZ:
+
						format = "txz";
+
						break;
+
					case TBZ:
+
						format = "tbz";
+
						break;
+
					case TGZ:
+
						format = "tgz";
+
						break;
+
					case TAR:
+
						format = "tar";
+
						break;
					}

					snprintf(pkgpath, MAXPATHLEN, "%s/%s-%s.%s", outdir, name, version, format);
@@ -142,39 +142,43 @@ exec_create(int argc, char **argv)
	const char *format = NULL;
	const char *rootdir = NULL;
	const char *manifestdir = NULL;
+
	char *plist = NULL;
	bool overwrite = true;
	pkg_formats fmt;
	int ch;

-
	while ((ch = getopt(argc, argv, "agxXf:r:m:o:n")) != -1) {
+
	while ((ch = getopt(argc, argv, "agxXf:r:m:o:np:")) != -1) {
		switch (ch) {
-
			case 'a':
-
				match = MATCH_ALL;
-
				break;
-
			case 'g':
-
				match = MATCH_GLOB;
-
				break;
-
			case 'x':
-
				match = MATCH_REGEX;
-
				break;
-
			case 'X':
-
				match = MATCH_EREGEX;
-
				break;
-
			case 'f':
-
				format = optarg;
-
				break;
-
			case 'o':
-
				outdir = optarg;
-
				break;
-
			case 'r':
-
				rootdir = optarg;
-
				break;
-
			case 'm':
-
				manifestdir = optarg;
-
				break;
-
			case 'n':
-
				overwrite = false;
-
				break;
+
		case 'a':
+
			match = MATCH_ALL;
+
			break;
+
		case 'g':
+
			match = MATCH_GLOB;
+
			break;
+
		case 'x':
+
			match = MATCH_REGEX;
+
			break;
+
		case 'X':
+
			match = MATCH_EREGEX;
+
			break;
+
		case 'f':
+
			format = optarg;
+
			break;
+
		case 'o':
+
			outdir = optarg;
+
			break;
+
		case 'r':
+
			rootdir = optarg;
+
			break;
+
		case 'm':
+
			manifestdir = optarg;
+
			break;
+
		case 'n':
+
			overwrite = false;
+
			break;
+
		case 'p':
+
			plist = optarg;
+
			break;
		}
	}
	argc -= optind;
@@ -210,6 +214,6 @@ exec_create(int argc, char **argv)
	if (manifestdir == NULL)
		return pkg_create_matches(argc, argv, match, fmt, outdir, rootdir, overwrite) == EPKG_OK ? EXIT_SUCCESS : EXIT_FAILURE;
	else
-
		return pkg_create_fakeroot(outdir, fmt, rootdir, manifestdir) == EPKG_OK ? EXIT_SUCCESS : EXIT_FAILURE;
+
		return pkg_create_staged(outdir, fmt, rootdir, manifestdir, plist) == EPKG_OK ? EXIT_SUCCESS : EXIT_FAILURE;
}