Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Refactor parts of the pkg create cli to libpkg. Provide the -m argument farther down the line.
Will Andrews committed 14 years ago
commit b748a6d51e6f06416c72d1c277c37caf6e7806fe
parent 550dd9a
5 files changed +90 -60
modified libpkg/packing.c
@@ -142,3 +142,20 @@ packing_set_format(struct archive *a, pkg_formats format)
	}
	return (NULL);
}
+

+
pkg_formats
+
packing_format_from_string(const char *str)
+
{
+
	if (str == NULL)
+
		return TXZ;
+
	if (strcmp(str, "txz") == 0)
+
		return TXZ;
+
	if (strcmp(str, "tbz") == 0)
+
		return TBZ;
+
	if (strcmp(str, "tgz") == 0)
+
		return TGZ;
+
	if (strcmp(str, "tar") == 0)
+
		return TAR;
+
	warnx("unknown format %s, using txz", str);
+
	return TXZ;
+
}
modified libpkg/pkg.h
@@ -496,6 +496,11 @@ typedef enum pkg_formats { TAR, TGZ, TBZ, TXZ } pkg_formats;
int pkg_create(const char *, pkg_formats, const char *, const char *, struct pkg *);

/**
+
 * Create packages that match
+
 */
+
int pkg_create_matches(int, char **, match_t, pkg_formats, const char *, const char *);
+

+
/**
 * Remove and unregister the package.
 * @param force If set to one, the function will not fail if the package is
 * required by other packages.
modified libpkg/pkg_create.c
@@ -13,19 +13,29 @@
#include "pkg_error.h"
#include "pkg_private.h"

-
static int pkg_create_from_dir(struct pkg *, const char *, struct packing *);
+
static int pkg_create_from_dir(struct pkg *, const char *, struct packing *, const char *);

static int
-
pkg_create_from_dir(struct pkg *pkg, const char *root, struct packing *pkg_archive)
+
pkg_create_from_dir(struct pkg *pkg, const char *root, struct packing *pkg_archive, const char *mpath)
{
	char fpath[MAXPATHLEN];
	struct pkg_file **files;
	struct pkg_script **scripts;
	char *m;
-
	int i;
+
	int i, ret;
+
	size_t sz;
	const char *scriptname = NULL;

-
	pkg_emit_manifest(pkg, &m);
+
	/*
+
	 * Read in the manifest file, if specified.  This is required if any
+
	 * of the manifest fields are generated by a libpkg consumer.
+
	 */
+
	if (mpath) {
+
		ret = file_to_buffer(mpath, &m, &sz);
+
		if (ret != EPKG_OK)
+
			return ret;
+
	} else
+
		pkg_emit_manifest(pkg, &m);

	packing_append_buffer(pkg_archive, m, "+MANIFEST", strlen(m));

@@ -94,8 +104,6 @@ pkg_create(const char *mpath, pkg_formats format, const char *outdir, const char
						 PKG_LOAD_EXECS | PKG_LOAD_SCRIPTS | PKG_LOAD_OPTIONS |
						 PKG_LOAD_MTREE;

-
	(void)mpath;
-

	if (pkg->type != PKG_INSTALLED)
		return (ERROR_BAD_ARG("pkg"));

@@ -113,9 +121,56 @@ pkg_create(const char *mpath, pkg_formats format, const char *outdir, const char
		return pkg_error_set(EPKG_FATAL, "unable to create archive");
	}

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

	return (packing_finish(pkg_archive));

	return (EPKG_OK);
}
+

+
int
+
pkg_create_matches(int argc, char **argv, match_t match, pkg_formats fmt, const char *outdir, const char *rootdir)
+
{
+
	int i, ret = 0, retcode = 0;
+
	struct pkgdb *db = NULL;
+
	struct pkgdb_it *it = NULL;
+
	struct pkg *pkg = NULL;
+
	int query_flags = PKG_LOAD_DEPS | PKG_LOAD_CONFLICTS | PKG_LOAD_FILES |
+
					  PKG_LOAD_EXECS | PKG_LOAD_SCRIPTS | PKG_LOAD_OPTIONS |
+
					  PKG_LOAD_MTREE;
+

+
	if (pkgdb_open(&db, PKGDB_DEFAULT) != EPKG_OK) {
+
		pkg_error_warn("can not open database");
+
		pkgdb_close(db);
+
		return (-1);
+
	}
+
	pkg_new(&pkg);
+
	for (i = 0;i < argc; i++) {
+
		if ((it = pkgdb_query(db, argv[i], match)) == NULL) {
+
			pkg_error_warn("can not query database");
+
			goto cleanup;
+
		}
+
		while ((ret = pkgdb_it_next(it, &pkg, query_flags)) == EPKG_OK) {
+
			printf("Creating package for %s-%s\n", pkg_get(pkg, PKG_NAME),
+
			    pkg_get(pkg, PKG_VERSION));
+
			if (pkg_create(NULL, fmt, outdir, rootdir, pkg) != EPKG_OK) {
+
				pkg_error_warn("can not create package");
+
				retcode++;
+
			}
+
		}
+
	}
+

+
cleanup:
+
	if (ret != EPKG_END) {
+
		pkg_error_warn("can not iterate over results");
+
		retcode++;
+
	}
+

+
	if (pkg != NULL)
+
		pkg_free(pkg);
+
	if (it != NULL)
+
		pkgdb_it_free(it);
+
	if (db != NULL)
+
		pkgdb_close(db);
+
	return retcode;
+
}
modified libpkg/pkg_private.h
@@ -73,6 +73,7 @@ int packing_init(struct packing **pack, const char *path, pkg_formats format);
int packing_append_file(struct packing *pack, const char *filepath, const char *newpath);
int packing_append_buffer(struct packing *pack, const char *buffer, const char *path, int size);
int packing_finish(struct packing *pack);
+
pkg_formats packing_format_from_string(const char *str);

void pkg_free_void(void *);
#endif
modified pkg/create.c
@@ -23,7 +23,7 @@ usage_create(void)
 * -x: regex
 * -g: globbing
 * -r: rootdir for the package
-
 * -m: path to dir where to find the +MANIFEST
+
 * -m: path to dir where to find the metadata
 * -f <format>: format could be txz, tgz, tbz or tar
 * -o: output directory where to create packages by default ./ is used
 */
@@ -31,23 +31,13 @@ usage_create(void)
int
exec_create(int argc, char **argv)
{
-
	struct pkgdb *db;
-
	struct pkgdb_it *it;
-
	struct pkg *pkg;
-

	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];
	int ch;
-
	int retcode = 0;
-
	int ret;
-
	int query_flags = PKG_LOAD_DEPS | PKG_LOAD_CONFLICTS | PKG_LOAD_FILES |
-
					  PKG_LOAD_EXECS | PKG_LOAD_SCRIPTS | PKG_LOAD_OPTIONS |
-
					  PKG_LOAD_MTREE;

	while ((ch = getopt(argc, argv, "agxXf:r:m:o:")) != -1) {
		switch (ch) {
@@ -105,47 +95,9 @@ exec_create(int argc, char **argv)
		}
	}

-
	if (manifestdir == NULL) {
-
		/* create package from local db */
-
		if (pkgdb_open(&db, PKGDB_DEFAULT) != EPKG_OK) {
-
			pkg_error_warn("can not open database");
-
			pkgdb_close(db);
-
			return (-1);
-
		}
-

-
		if ((it = pkgdb_query(db, argv[0], match)) == NULL) {
-
			pkg_error_warn("can not query database");
-
			return (-1);
-
		}
-

-
		pkg_new(&pkg);
-
		while ((ret = pkgdb_it_next(it, &pkg, query_flags)) == EPKG_OK) {
-
			printf("Creating package for %s-%s\n", pkg_get(pkg, PKG_NAME),
-
				   pkg_get(pkg, PKG_VERSION));
-

-
			if (pkg_create(NULL, fmt, outdir, rootdir, pkg) != EPKG_OK) {
-
				pkg_error_warn("can not create package");
-
				retcode++;
-
			}
-
		}
-

-
		pkg_free(pkg);
-
		pkgdb_it_free(it);
-
		pkgdb_close(db);
-

-
		if (ret != EPKG_END) {
-
			pkg_error_warn("can not iterate over results");
-
			retcode++;
-
		}
-

-
	} else {
-
		snprintf(mpath, sizeof(mpath), "%s/+MANIFEST", manifestdir);
-
		if (pkg_create(mpath, fmt, outdir, rootdir, NULL) != EPKG_OK) {
-
			pkg_error_warn("can not create package");
-
			retcode++;
-
		}
-
	}
-

-
	return (retcode);
+
	if (manifestdir == NULL)
+
		return pkg_create_matches(argc, argv, match, fmt, outdir, rootdir);
+
	else
+
		return pkg_create(manifestdir, fmt, outdir, rootdir, NULL);
}