Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Allow to set names.
Vsevolod Stakhov committed 11 years ago
commit 3d86455e4ff3518968282eb6f931d565248623e0
parent dbb3bdc
1 file changed +45 -29
modified src/set.c
@@ -39,11 +39,12 @@

#define AUTOMATIC 1U<<0
#define ORIGIN 1U<<1
+
#define NAME 1U<<2

void
usage_set(void)
{
-
	fprintf(stderr, "Usage: pkg set [-a] [-A [01]] [-o <oldorigin>:<neworigin>] [-y] [-Cgix] <pkg-name>\n\n");
+
	fprintf(stderr, "Usage: pkg set [-a] [-A [01]] [-o <oldorigin>:<neworigin>] [-n <oldname>:<newname>] [-y] [-Cgix] <pkg-name>\n\n");
	fprintf(stderr, "For more information see 'pkg help set'. \n");
}

@@ -93,10 +94,12 @@ exec_set(int argc, char **argv)
	bool		 automatic = false;
	bool		 rc = false;
	const char	*errstr;
-
	char		*neworigin = NULL;
-
	char		*oldorigin = NULL;
+
	const char	*changed = NULL;
+
	char		*newvalue = NULL;
+
	char		*oldvalue = NULL;
	unsigned int	 loads = PKG_LOAD_BASIC;
	unsigned int	 sets = 0;
+
	unsigned int	 field, depfield;
	int		 retcode;

	struct option longopts[] = {
@@ -106,12 +109,13 @@ exec_set(int argc, char **argv)
		{ "glob",		no_argument,		NULL,	'g' },
		{ "case-insensitive",	no_argument,		NULL,	'i' },
		{ "change-origin",	required_argument,	NULL,	'o' },
+
		{ "change-name",	required_argument,	NULL,	'n' },
		{ "regex",		no_argument,		NULL,	'x' },
		{ "yes",		no_argument,		NULL,	'y' },
		{ NULL,			0,			NULL,	0   },
	};

-
	while ((ch = getopt_long(argc, argv, "+A:aCgio:xy", longopts, NULL)) != -1) {
+
	while ((ch = getopt_long(argc, argv, "+A:aCgio:xyn:", longopts, NULL)) != -1) {
		switch (ch) {
		case 'A':
			sets |= AUTOMATIC;
@@ -137,21 +141,22 @@ exec_set(int argc, char **argv)
			sets |= ORIGIN;
			loads |= PKG_LOAD_DEPS;
			match = MATCH_ALL;
-
			oldorigin = strdup(optarg);
-
			neworigin = strrchr(oldorigin, ':');
-
			if (neworigin == NULL) {
-
				free(oldorigin);
-
				errx(EX_USAGE, "Wrong format for -o. "
-
				    "Expecting oldorigin:neworigin, got: %s",
-
				    optarg);
+
			changed = "origin";
+
			if (!check_change_values(optarg, &oldvalue, &newvalue, '/')) {
+
				 errx(EX_USAGE, "Wrong format for -o. "
+
					 "Expecting oldorigin:neworigin, got: %s",
+
					 optarg);
			}
-
			*neworigin = '\0';
-
			neworigin++;
-
			if (strrchr(oldorigin, '/') == NULL ||
-
			    strrchr(neworigin, '/') == NULL) {
-
				free(oldorigin);
-
				errx(EX_USAGE,
-
				    "Bad origin format, got: %s", optarg);
+
			break;
+
		case 'n':
+
			sets |= NAME;
+
			loads |= PKG_LOAD_DEPS;
+
			match = MATCH_ALL;
+
			changed = "name";
+
			if (!check_change_values(optarg, &oldvalue, &newvalue, '\0')) {
+
				 errx(EX_USAGE, "Wrong format for -n. "
+
					 "Expecting oldname:newname, got: %s",
+
					 optarg);
			}
			break;
		case 'x':
@@ -161,7 +166,7 @@ exec_set(int argc, char **argv)
			yes = true;
			break;
		default:
-
			free(oldorigin);
+
			free(oldvalue);
			
			usage_set();
			return (EX_USAGE);
@@ -171,11 +176,22 @@ exec_set(int argc, char **argv)
	argc -= optind;
	argv += optind;

-
	if ((argc < 1 && match != MATCH_ALL) || (newautomatic == -1 && neworigin == NULL)) {
+
	if ((argc < 1 && match != MATCH_ALL) ||
+
		(newautomatic == -1 && newvalue == NULL) ||
+
		(sets & (NAME|ORIGIN)) == (NAME|ORIGIN)) {
		usage_set();
		return (EX_USAGE);
	}

+
	if (sets & NAME) {
+
		field = PKG_SET_NAME;
+
		depfield = PKG_SET_DEPNAME;
+
	}
+
	else if (sets & ORIGIN) {
+
		field = PKG_SET_ORIGIN;
+
		depfield = PKG_SET_DEPORIGIN;
+
	}
+

	retcode = pkgdb_access(PKGDB_MODE_READ|PKGDB_MODE_WRITE,
			       PKGDB_DB_LOCAL);
	if (retcode == EPKG_ENODB) {
@@ -202,9 +218,9 @@ exec_set(int argc, char **argv)
	}

 
-
	if (oldorigin != NULL) {
+
	if (oldvalue != NULL) {
		match = MATCH_ALL;
-
		if ((it = pkgdb_query(db, oldorigin, MATCH_EXACT)) == NULL) {
+
		if ((it = pkgdb_query(db, oldvalue, MATCH_EXACT)) == NULL) {
			retcode = EX_IOERR;
			goto cleanup;
		}
@@ -221,14 +237,14 @@ exec_set(int argc, char **argv)
		rc = yes;
		if (!yes) {
			if (pkg != NULL)
-
				rc = query_yesno(false, "Change origin from %S to %S for %n-%v? [y/N]: ",
-
						oldorigin, neworigin, pkg, pkg);
+
				rc = query_yesno(false, "Change %s from %S to %S for %n-%v? [y/N]: ",
+
						changed, oldvalue, newvalue, pkg, pkg);
			else
-
				rc = query_yesno(false, "Change origin from %S to %S for all dependencies? "
-
						"[y/N]: ", oldorigin, neworigin);
+
				rc = query_yesno(false, "Change %s from %S to %S for all dependencies? "
+
						"[y/N]: ", changed, oldvalue, newvalue);
		}
		if (pkg != NULL && rc) {
-
			if (pkgdb_set(db, pkg, PKG_SET_ORIGIN, neworigin) != EPKG_OK) {
+
			if (pkgdb_set(db, pkg, field, newvalue) != EPKG_OK) {
				retcode = EX_IOERR;
				goto cleanup;
			}
@@ -270,7 +286,7 @@ exec_set(int argc, char **argv)
					 * Do not query user when he has already
					 * been queried.
					 */
-
					if (pkgdb_set(db, pkg, PKG_SET_DEPORIGIN, oldorigin, neworigin) != EPKG_OK) {
+
					if (pkgdb_set(db, pkg, depfield, oldvalue, newvalue) != EPKG_OK) {
						retcode = EX_IOERR;
						goto cleanup;
					}
@@ -282,7 +298,7 @@ exec_set(int argc, char **argv)
	} while (i < argc);

cleanup:
-
	free(oldorigin);
+
	free(oldvalue);
	pkg_free(pkg);

	pkgdb_release_lock(db, PKGDB_LOCK_EXCLUSIVE);