Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Merge branch 'convert-updates'
Bryan Drewery committed 13 years ago
commit af4273ab9255721813cdc1f32d11904d72be54b3
parent 2290fa3
5 files changed +107 -36
modified libpkg/pkg_old.c
@@ -1,5 +1,6 @@
/*-
 * Copyright (c) 2012-2013 Baptiste Daroussin <bapt@FreeBSD.org>
+
 * Copyright (c) 2013 Bryan Drewery <bdrewery@FreeBSD.org>
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
@@ -119,9 +120,11 @@ pkg_old_emit_content(struct pkg *pkg, char **dest)
	struct pkg_dep *dep = NULL;
	struct pkg_file *file = NULL;
	struct pkg_dir *dir = NULL;
+
	struct pkg_option *option = NULL;

	const char *name;
	const char *pkgorigin, *prefix, *version;
+
	char option_type = 0;

	pkg_get(pkg, PKG_NAME, &name, PKG_ORIGIN, &pkgorigin,
	    PKG_PREFIX, &prefix, PKG_VERSION, &version);
@@ -164,6 +167,22 @@ pkg_old_emit_content(struct pkg *pkg, char **dest)
		}
	}

+
	sbuf_printf(content, "@comment OPTIONS:");
+
	while (pkg_options(pkg, &option) == EPKG_OK) {
+
		/* Add space for previous option, if not the first. */
+
		if (option_type != 0)
+
			sbuf_cat(content, " ");
+

+
		if (strcmp(pkg_option_value(option), "on") == 0)
+
			option_type = '+';
+
		else
+
			option_type = '-';
+
		sbuf_printf(content, "%c%s",
+
		    option_type,
+
		    pkg_option_opt(option));
+
	}
+
	sbuf_printf(content, "\n");
+

	sbuf_finish(content);
	*dest = strdup(sbuf_get(content));
	sbuf_delete(content);
modified libpkg/pkg_ports.c
@@ -1,6 +1,7 @@
/*-
 * Copyright (c) 2011-2013 Baptiste Daroussin <bapt@FreeBSD.org>
 * Copyright (c) 2011-2012 Julien Laffaye <jlaffaye@FreeBSD.org>
+
 * Copyright (c) 2012-2013 Bryan Drewery <bdrewery@FreeBSD.org>
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
@@ -387,7 +388,7 @@ setgroup(struct plist *p, char *line, struct file_attr *a)
static int
comment_key(struct plist *p, char *line, struct file_attr *a)
{
-
	char *name, *version;
+
	char *name, *version, *line_options, *option;
	if (strncmp(line, "DEPORIGIN:", 10) == 0) {
		line += 10;
		name = p->pkgdep;
@@ -399,6 +400,17 @@ comment_key(struct plist *p, char *line, struct file_attr *a)
	} else if (strncmp(line, "ORIGIN:", 7) == 0) {
		line += 7;
		pkg_set(p->pkg, PKG_ORIGIN, line);
+
	} else if (strncmp(line, "OPTIONS:", 8) == 0) {
+
		line += 8;
+
		/* OPTIONS:+OPTION -OPTION */
+
		if (line[0] != '\0') {
+
			line_options = strdup(line);
+
			while ((option = strsep(&line_options, " ")) != NULL) {
+
				pkg_addoption(p->pkg, option + 1,
+
				    option[0] == '+' ? "on" : "off");
+
			}
+
			free(line_options);
+
		}
	}

	/* ignore md5 will be recomputed anyway */
modified pkg/convert.c
@@ -1,5 +1,6 @@
/*-
 * Copyright (c) 2012-2013 Baptiste Daroussin <bapt@FreeBSD.org>
+
 * Copyright (c) 2013 Bryan Drewery <bdrewery@FreeBSD.org>
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
@@ -28,9 +29,12 @@
#include <sys/stat.h>
#include <sys/sbuf.h>

+
#include <err.h>
+
#include <errno.h>
#include <string.h>
#include <sysexits.h>
#include <dirent.h>
+
#include <unistd.h>

#include <pkg.h>

@@ -39,12 +43,12 @@
void
usage_convert(void)
{
-
	fprintf(stderr, "usage: pkg convert [-r]\n\n");
+
	fprintf(stderr, "usage: pkg convert [-d dir] [-nr]\n\n");
	fprintf(stderr, "For more information see 'pkg help convert'.\n");
}

static int
-
convert_to_old(void)
+
convert_to_old(const char *pkg_add_dbdir, bool dry_run)
{
	struct pkgdb *db = NULL;
	struct pkg *pkg = NULL;
@@ -62,6 +66,9 @@ convert_to_old(void)
	struct sbuf *install_script = sbuf_new_auto();
	struct sbuf *deinstall_script = sbuf_new_auto();

+
	if (mkdir(pkg_add_dbdir, 0755) != 0 && errno != EEXIST)
+
		err(EX_CANTCREAT, pkg_add_dbdir);
+

	if (pkgdb_open(&db, PKGDB_DEFAULT) != EPKG_OK) {
		pkgdb_close(db);
		return (EX_IOERR);
@@ -74,33 +81,38 @@ convert_to_old(void)

	while (pkgdb_it_next(it, &pkg, query_flags) == EPKG_OK) {
		rq = NULL;
-
		pkg_to_old(pkg);
-
		pkg_old_emit_content(pkg, &content);
		pkg_get(pkg, PKG_NAME, &name, PKG_VERSION, &version);
		printf("Converting %s-%s...", name, version);
-
		snprintf(path, MAXPATHLEN, "/var/db/pkg/%s-%s", name, version);
+
		if (dry_run) {
+
			printf("\n");
+
			continue;
+
		}
+
		pkg_to_old(pkg);
+
		pkg_old_emit_content(pkg, &content);
+

+
		snprintf(path, MAXPATHLEN, "%s/%s-%s", pkg_add_dbdir, name, version);
		mkdir(path, 0755);

-
		snprintf(path, MAXPATHLEN, "/var/db/pkg/%s-%s/+CONTENTS", name, version);
+
		snprintf(path, MAXPATHLEN, "%s/%s-%s/+CONTENTS", pkg_add_dbdir, name, version);
		fp = fopen(path, "w");
		fputs(content, fp);
		fclose(fp);

		pkg_get(pkg, PKG_DESC, &buf);
-
		snprintf(path, MAXPATHLEN, "/var/db/pkg/%s-%s/+DESC", name, version);
+
		snprintf(path, MAXPATHLEN, "%s/%s-%s/+DESC", pkg_add_dbdir, name, version);
		fp = fopen(path, "w");
		fputs(buf, fp);
		fclose(fp);

		pkg_get(pkg, PKG_COMMENT, &buf);
-
		snprintf(path, MAXPATHLEN, "/var/db/pkg/%s-%s/+COMMENT", name, version);
+
		snprintf(path, MAXPATHLEN, "%s/%s-%s/+COMMENT", pkg_add_dbdir, name, version);
		fp = fopen(path, "w");
		fprintf(fp, "%s\n", buf);
		fclose(fp);

		pkg_get(pkg, PKG_MESSAGE, &buf);
		if (buf != NULL && buf[0] != '\0') {
-
			snprintf(path, MAXPATHLEN, "/var/db/pkg/%s-%s/+DISPLAY", name, version);
+
			snprintf(path, MAXPATHLEN, "%s/%s-%s/+DISPLAY", pkg_add_dbdir, name, version);
			fp = fopen(path, "w");
			fputs(buf, fp);
			fclose(fp);
@@ -108,7 +120,7 @@ convert_to_old(void)

		pkg_get(pkg, PKG_MTREE, &buf);
		if (buf != NULL && buf[0] != '\0') {
-
			snprintf(path, MAXPATHLEN, "/var/db/pkg/%s-%s/+MTREE_DIRS", name, version);
+
			snprintf(path, MAXPATHLEN, "%s/%s-%s/+MTREE_DIRS", pkg_add_dbdir, name, version);
			fp = fopen(path, "w");
			fputs(buf, fp);
			fclose(fp);
@@ -145,7 +157,7 @@ convert_to_old(void)
		}
		if (sbuf_len(install_script) > 0) {
			sbuf_finish(install_script);
-
			snprintf(path, MAXPATHLEN, "/var/db/pkg/%s-%s/+INSTALL", name, version);
+
			snprintf(path, MAXPATHLEN, "%s/%s-%s/+INSTALL", pkg_add_dbdir, name, version);
			fp = fopen(path, "w");
			fputs(sbuf_data(install_script), fp);
			fclose(fp);
@@ -182,13 +194,13 @@ convert_to_old(void)
		}
		if (sbuf_len(deinstall_script) > 0) {
			sbuf_finish(deinstall_script);
-
			snprintf(path, MAXPATHLEN, "/var/db/pkg/%s-%s/+DEINSTALL", name, version);
+
			snprintf(path, MAXPATHLEN, "%s/%s-%s/+DEINSTALL", pkg_add_dbdir, name, version);
			fp = fopen(path, "w");
			fputs(sbuf_data(deinstall_script), fp);
			fclose(fp);
		}

-
		snprintf(path, MAXPATHLEN, "/var/db/pkg/%s-%s/+REQUIRED_BY", name, version);
+
		snprintf(path, MAXPATHLEN, "%s/%s-%s/+REQUIRED_BY", pkg_add_dbdir, name, version);
		while (pkg_rdeps(pkg, &dep) == EPKG_OK) {
			if (rq == NULL)
				rq = fopen(path, "w");
@@ -212,17 +224,16 @@ cleanup:
}

static int
-
convert_from_old(void)
+
convert_from_old(const char *pkg_add_dbdir, bool dry_run)
{
	DIR *d;
	struct dirent *dp;
	struct pkg *p = NULL;
	char path[MAXPATHLEN];
-
	char *name, *version;
	struct pkgdb *db = NULL;

-
	if ((d = opendir("/var/db/pkg")) == NULL)
-
		return (EX_NOINPUT);
+
	if ((d = opendir(pkg_add_dbdir)) == NULL)
+
		err(EX_NOINPUT, pkg_add_dbdir);

	if (pkgdb_open(&db, PKGDB_DEFAULT) != EPKG_OK) {
		return (EX_IOERR);
@@ -236,12 +247,15 @@ convert_from_old(void)
				pkg_new(&p, PKG_OLD_FILE);
			else
				pkg_reset(p, PKG_OLD_FILE);
-
			snprintf(path, MAXPATHLEN, "/var/db/pkg/%s/", dp->d_name);
-
			pkg_old_load_from_path(p, path);
+
			printf("Converting %s...\n", dp->d_name);
+
			snprintf(path, MAXPATHLEN, "%s/%s", pkg_add_dbdir, dp->d_name);
+
			if (pkg_old_load_from_path(p, path) != EPKG_OK) {
+
				fprintf(stderr, "Skipping invalid package: %s\n", path);
+
				continue;
+
			}
			pkg_from_old(p);
-
			pkg_get(p, PKG_NAME, &name, PKG_VERSION, &version);
-
			printf("Converting %s-%s...\n", name, version);
-
			pkgdb_register_ports(db, p);
+
			if (!dry_run)
+
				pkgdb_register_ports(db, p);
		}
	}

@@ -253,24 +267,39 @@ convert_from_old(void)
int
exec_convert(int argc, char **argv)
{
+
	int ch;
	bool revert = false;
-

-
	if (argc > 2) {
-
		usage_convert();
-
		return (EX_USAGE);
-
	}
-

-
	if (argc == 2) {
-
		if (strcmp(argv[1], "-r") == 0)
+
	bool dry_run = false;
+
	const char *pkg_add_dbdir = "/var/db/pkg";
+

+
	while ((ch = getopt(argc, argv, "d:nr")) != -1) {
+
		switch (ch) {
+
		case 'd':
+
			pkg_add_dbdir = optarg;
+
			break;
+
		case 'n':
+
			dry_run = true;
+
			break;
+
		case 'r':
			revert = true;
-
		else {
+
			break;
+
		default:
			usage_convert();
			return (EX_USAGE);
		}
	}
+
	argc -= optind;
+
	argv += optind;
+

+
	if (argc > 1) {
+
		usage_convert();
+
		return (EX_USAGE);
+
	}
+

+
	printf("Converting packages %s %s\n", revert ? "to" : "from", pkg_add_dbdir);

	if (revert)
-
		return (convert_to_old());
+
		return (convert_to_old(pkg_add_dbdir, dry_run));
	else
-
		return (convert_from_old());
+
		return (convert_from_old(pkg_add_dbdir, dry_run));
}
modified pkg/pkg-convert.8
@@ -23,7 +23,8 @@
.Nd convert from/to pkgng database format
.Sh SYNOPSIS
.Nm
-
.Op Fl r
+
.Op Fl d Ar pkg_dbdir
+
.Op Fl nr
.Sh DESCRIPTION
.Nm
is used to convert from/to pkgng local database to legacy pkg_install tools
@@ -32,6 +33,16 @@ format.
The following options are supported by
.Nm :
.Bl -tag -width F1
+
.It Fl d
+
The location of the
+
.Xr pkg_add 1
+
dbdir.
+
Defaults to
+
.Fa /var/db/pkg .
+
.It Fl n
+
Dry-run mode.
+
Do not actually convert anything.
+
Just show what would be done.
.It Fl r
Revert conversion
.El
modified ports/pkg2ng
@@ -1,3 +1,3 @@
#!/bin/sh

-
pkg convert
+
exec pkg convert