Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Now pkg create has getopt: package search through glob,regex, eregex package format txz, tgz, tbz, tar rootdir default to / outdir default to ./ and manifestdir default to NULL which means installed package
Baptiste Daroussin committed 15 years ago
commit 02f08f5b785cd20f3aafa7b94440e23ea982ee12
parent f02c58a
4 files changed +133 -42
modified libpkg/pkg.c
@@ -1,5 +1,6 @@
#include <assert.h>

+
#include <sys/param.h>
#include "pkgdb.h"
#include "pkgdb_cache.h"
#include "pkg_manifest.h"
@@ -104,3 +105,16 @@ pkg_from_manifest(struct pkg *pkg, struct pkg_manifest *m)
	pkg_reset(pkg);
	pkg->m = m;
}
+

+
void
+
manifest_from_pkg(struct pkg *pkg, struct pkg_manifest **m)
+
{
+
	char mpath[MAXPATHLEN];
+

+
	if (pkg->m != NULL) {
+
		*m = pkg->m;
+
	} else {
+
		snprintf(mpath, sizeof(mpath), "%s/%s-%s/+MANIFEST", pkgdb_get_dir(), pkg_name(pkg), pkg_version(pkg));
+
		*m = pkg_manifest_load_file(mpath);
+
	}
+
}
modified libpkg/pkg.h
@@ -42,6 +42,7 @@ struct pkg {
};

void pkg_from_manifest(struct pkg *, struct pkg_manifest *);
+
void manifest_from_pkg(struct pkg *, struct pkg_manifest **);

void pkg_reset(struct pkg *);
const char *pkg_name(struct pkg *);
@@ -53,6 +54,6 @@ int pkg_dep(struct pkg *, struct pkg *);
int pkg_rdep(struct pkg *, struct pkg *);

typedef enum pkg_formats { TAR, TGZ, TBZ, TXZ } pkg_formats;
-
int pkg_create(char *, pkg_formats, const char *, const char *);
+
int pkg_create(const char *, pkg_formats, const char *, const char *, struct pkg *);

#endif
modified libpkg/pkg_create.c
@@ -16,13 +16,14 @@

#define METADATA_GLOB "+{DEINSTALL,INSTALL,MTREE_DIRS}"

-
static int pkg_create_from_dir(char *, const char *, struct archive *);
+
static int pkg_create_from_dir(const char *, const char *, struct archive *, struct pkg *);
static const char * pkg_create_set_format(struct archive *, pkg_formats);

static int
-
pkg_create_from_dir(char *path, const char *root, struct archive *pkg_archive)
+
pkg_create_from_dir(const char *mpath, const char *root, struct archive *pkg_archive, struct pkg *pkg)
{
	struct archive_entry *entry;
+
	char *path;
	char glob_pattern[MAXPATHLEN + sizeof(METADATA_GLOB)];
	glob_t g;
	int fd;
@@ -30,7 +31,6 @@ pkg_create_from_dir(char *path, const char *root, struct archive *pkg_archive)
	char buf[BUFSIZ];
	char *buffer;
	size_t buffer_len;
-
	char mpath[MAXPATHLEN];
	char fpath[MAXPATHLEN];
	const char *filepath;
	struct archive *ar;
@@ -39,14 +39,16 @@ pkg_create_from_dir(char *path, const char *root, struct archive *pkg_archive)
	ar = archive_read_disk_new();
	archive_read_disk_set_standard_lookup(ar);

-
	snprintf(mpath, sizeof(mpath), "%s+MANIFEST", path);
	entry = archive_entry_new();

-
	if ((m = pkg_manifest_load_file(mpath)) == NULL)
-
		errx(EXIT_FAILURE, "Can not continue without manifest");
+
	manifest_from_pkg(pkg, &m);

+
	path = strdup(mpath);
+
	buffer = strrchr(path, '/');
+
	buffer[0] = '\0';
	/* Add the metadatas */
-
	snprintf(glob_pattern, sizeof(glob_pattern), "%s"METADATA_GLOB, path);
+
	snprintf(glob_pattern, sizeof(glob_pattern), "%s/"METADATA_GLOB, path);
+
	free(buffer);
	
	if (glob(glob_pattern, GLOB_NOSORT|GLOB_BRACE, NULL, &g) == 0) {
		for ( i = 0; i < g.gl_pathc; i++) {
@@ -112,38 +114,16 @@ pkg_create_from_dir(char *path, const char *root, struct archive *pkg_archive)
}

int
-
pkg_create(char *pkgname, pkg_formats format, const char *outdir, const char *rootdir)
+
pkg_create(const char *mpath, pkg_formats format, const char *outdir, const char *rootdir, struct pkg *lpkg)
{
-
	struct pkgdb db;
-
	struct pkg pkg;
-
	const char *pkg_dbdir;
	char namever[FILENAME_MAX];
-
	char pkgpath[MAXPATHLEN];
	struct archive *pkg_archive;
	char archive_path[MAXPATHLEN];
+
	struct pkg *pkg;
	const char *ext;
+
	struct pkg_manifest *m;

-
	pkg_dbdir = pkgdb_get_dir();
-

-
	if (pkgdb_open(&db) == -1) {
-
		pkgdb_warn(&db);
-
		return (-1);
-
	}
-

-
	if (pkgdb_query_init(&db, pkgname, MATCH_EXACT) == -1) {
-
		pkgdb_warn(&db);
-
		return (-1);
-
	}
-

-
	if (pkgdb_query(&db, &pkg) != 0) {
-
		if (db.errnum > -1)
-
			pkgdb_warn(&db);
-
		warnx("%s: no such package", pkgname);
-
		pkgdb_query_free(&db);
-
		return (-1);
-
	}
-
	pkgdb_query_free(&db);
-

+
	pkg = lpkg;
	pkg_archive = archive_write_new();

	if ((ext = pkg_create_set_format(pkg_archive, format)) == NULL) {
@@ -152,18 +132,23 @@ pkg_create(char *pkgname, pkg_formats format, const char *outdir, const char *ro
		return (-1);
	}

-
	snprintf(namever, sizeof(namever), "%s-%s", pkg_name(&pkg), pkg_version(&pkg));
+
	if (pkg == NULL) {
+
		m = pkg_manifest_load_file(mpath);
+
		pkg_from_manifest(pkg, m);
+
	}
+

+
	snprintf(namever, sizeof(namever), "%s-%s", pkg_name(pkg), pkg_version(pkg));
	printf("Creating package %s/%s.%s\n", outdir, namever, ext);
-
	snprintf(pkgpath, sizeof(pkgpath), "%s/%s/", pkg_dbdir, namever);
	snprintf(archive_path, sizeof(archive_path), "%s/%s.%s", outdir, namever, ext);

	archive_write_set_format_pax_restricted(pkg_archive);
	archive_write_open_filename(pkg_archive, archive_path);
-
	pkg_create_from_dir(pkgpath, rootdir, pkg_archive);
+

+
	pkg_create_from_dir(mpath, rootdir, pkg_archive, pkg);
+

	archive_write_close(pkg_archive);
	archive_write_finish(pkg_archive);

-
	pkgdb_close(&db);
	return (0);
}

modified pkg/create.c
@@ -2,6 +2,9 @@
#include <stdio.h>
#include <pkg.h>
#include <pkgdb.h>
+
#include <string.h>
+
#include <sys/param.h>
+
#include <unistd.h>

#include "create.h"

@@ -9,7 +12,6 @@
 * options:
 * -x: regex
 * -g: globbing
-
 * -b: backup (create from installed pkg)
 * -r: rootdir for the package
 * -m: path to dir where to find the +MANIFEST
 * -f <format>: format could be txz, tgz, tbz or tar
@@ -19,10 +21,99 @@
int
cmd_create(int argc, char **argv)
{
-
	if (argc < 2) {
-
		warnx("No arguments provided");
+
	struct pkgdb db;
+
	struct pkg pkg;
+

+
	unsigned char opt = 0;
+
	match_t match = MATCH_EXACT;
+
	const char *outdir = NULL;
+
	const char *format = NULL;
+
	const char *rootdir = NULL;
+
	const char *manifestdir = NULL;
+
	pkg_formats fmt;
+
	char mpath[MAXPATHLEN];
+
	char ch;
+

+
	while ((ch = getopt(argc, argv, "agxXf:r:m:o:")) != -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;
+
		}
+
	}
+
	argc -= optind;
+
	argv += optind;
+

+
	if (argc == 0) {
+
		warnx("No package provided");
		return (-1);
	}
-
	pkg_create(argv[1], TXZ, "./", "/");
+

+
	if (rootdir == NULL)
+
		rootdir = "/";
+

+
	if (outdir == NULL)
+
		outdir = "./";
+

+
	if (format == NULL) {
+
		fmt = TXZ;
+
	} else {
+
		if (strcmp(format, "txz") == 0)
+
			fmt = TXZ;
+
		else if (strcmp(format, "tbz") == 0)
+
			fmt = TBZ;
+
		else if (strcmp(format, "tgz") == 0)
+
			fmt = TGZ;
+
		else if (strcmp(format, "tar") == 0)
+
			fmt = TAR;
+
		else {
+
			warnx("Unknown format %s, using txz", format);
+
			fmt = TXZ;
+
		}
+
	}
+

+
	if (manifestdir == NULL) {
+
		/* create package from local db */
+
		if (pkgdb_open(&db) == -1) {
+
			pkgdb_warn(&db);
+
			return (-1);
+
		}
+

+
		if (pkgdb_query_init(&db, argv[0], match) == -1) {
+
			pkgdb_warn(&db);
+
			return (-1);
+
		}
+

+
		while (pkgdb_query(&db, &pkg) == 0) {
+
			snprintf(mpath, sizeof(mpath), "%s/%s-%s/+MANIFEST", pkgdb_get_dir(), pkg_name(&pkg), pkg_version(&pkg));
+
			pkg_create(mpath, fmt, outdir, rootdir, &pkg);
+
		}
+
		pkgdb_query_free(&db);
+
		pkgdb_close(&db);
+
	} else {
+
		snprintf(mpath, sizeof(mpath), "%s/+MANIFEST", manifestdir);
+
		pkg_create(mpath, fmt, outdir, rootdir, NULL);
+
	}
	return (0);
}