Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
- Add missing plumbing for pkg_set and pkg_get to enable: - Add support to pkg set to toggle the vital flag - Add a pkg query flag (%V) - Add a testcase for the vital flag using set/query
Brad Davis committed 10 years ago
commit ba6202d142c39373c471671e1ccc35ffd841e045
parent 8ab7285
6 files changed +98 -10
modified libpkg/pkg.h.in
@@ -293,6 +293,7 @@ typedef enum {
	PKG_SET_ORIGIN,
	PKG_SET_DEPNAME,
	PKG_SET_NAME,
+
	PKG_SET_VITAL,
	PKG_SET_MAX
} pkg_set_attr;

modified libpkg/pkgdb.c
@@ -1360,11 +1360,10 @@ static sql_prstmt sql_prepared_statements[PRSTMT_LAST] = {
		"INSERT OR REPLACE INTO packages( "
			"origin, name, version, comment, desc, message, arch, "
			"maintainer, www, prefix, flatsize, automatic, "
-
			"licenselogic, mtree_id, time, manifestdigest, dep_formula, "
-
			"vital) "
+
			"licenselogic, mtree_id, time, manifestdigest, dep_formula)"
		"VALUES( ?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, "
-
		"?13, (SELECT id FROM mtree WHERE content = ?14), NOW(), ?15, ?16, ?17)",
-
		"TTTTTTTTTTIIITTTI",
+
		"?13, (SELECT id FROM mtree WHERE content = ?14), NOW(), ?15, ?16 )",
+
		"TTTTTTTTTTIIITTT",
	},
	[DEPS_UPDATE] = {
		NULL,
@@ -2537,7 +2536,7 @@ pkgdb_vset(struct pkgdb *db, int64_t id, va_list ap)
	int		 attr;
	sqlite3_stmt	*stmt;
	int64_t		 flatsize;
-
	bool automatic, locked;
+
	bool automatic, locked, vital;
	char		*oldval;
	char		*newval;

@@ -2562,6 +2561,8 @@ pkgdb_vset(struct pkgdb *db, int64_t id, va_list ap)
		    "WHERE package_id = ?2 AND name = ?3",
		[PKG_SET_NAME]    =
		    "UPDATE packages SET name=?1 WHERE id=?2",
+
		[PKG_SET_VITAL] =
+
		    "UPDATE packages SET vital = ?1 WHERE id = ?2",
	};

	while ((attr = va_arg(ap, int)) > 0) {
@@ -2608,6 +2609,15 @@ pkgdb_vset(struct pkgdb *db, int64_t id, va_list ap)
			sqlite3_bind_text(stmt, 1, newval, -1, SQLITE_STATIC);
			sqlite3_bind_int64(stmt, 2, id);
			break;
+
		case PKG_SET_VITAL:
+
			vital = (bool)va_arg(ap, int);
+
			if (vital != 0 && vital != 1) {
+
				sqlite3_finalize(stmt);
+
				continue;
+
			}
+
			sqlite3_bind_int64(stmt, 1, vital);
+
			sqlite3_bind_int64(stmt, 2, id);
+
			break;
		}

		if (sqlite3_step(stmt) != SQLITE_DONE) {
modified libpkg/repo/binary/update.c
@@ -150,7 +150,7 @@ try_again:
	    pkg->origin, pkg->name, pkg->version, pkg->comment, pkg->desc,
	    arch, pkg->maintainer, pkg->www, pkg->prefix, pkg->pkgsize,
	    pkg->flatsize, (int64_t)pkg->licenselogic, pkg->sum, pkg->repopath,
-
	    pkg->digest, pkg->old_digest)) != SQLITE_DONE) {
+
	    pkg->digest, pkg->old_digest, pkg->vital)) != SQLITE_DONE) {
		if (ret == SQLITE_CONSTRAINT) {
			ERROR_SQLITE(sqlite, "grmbl");
			switch(pkg_repo_binary_delete_conflicting(pkg->origin,
modified src/query.c
@@ -74,6 +74,7 @@ static struct query_flags accepted_query_flags[] = {
	{ 'M', "",		0, PKG_LOAD_BASIC },
	{ 't', "",		0, PKG_LOAD_BASIC },
	{ 'R', "",              0, PKG_LOAD_ANNOTATIONS },
+
	{ 'V', "",		0, PKG_LOAD_BASIC },
};

static void
@@ -81,6 +82,7 @@ format_str(struct pkg *pkg, struct sbuf *dest, const char *qstr, const void *dat
{
	bool automatic;
	bool locked;
+
	bool vital;

	sbuf_clear(dest);

@@ -289,6 +291,10 @@ format_str(struct pkg *pkg, struct sbuf *dest, const char *qstr, const void *dat
				if (pkg_has_message(pkg))
					pkg_sbuf_printf(dest, "%M", pkg);
				break;
+
			case 'V':
+
				pkg_get(pkg, PKG_VITAL, &vital);
+
				sbuf_printf(dest, "%d", vital);
+
				break;
			case '%':
				sbuf_putc(dest, '%');
				break;
@@ -512,6 +518,12 @@ format_sql_condition(const char *str, struct sbuf *sqlcond, bool for_remote)
					sbuf_cat(sqlcond, "desc");
					state = OPERATOR_STRING;
					break;
+
				case 'V':
+
					if (for_remote)
+
						goto bad_option;
+
					sbuf_cat(sqlcond, "vital");
+
					state = OPERATOR_INT;
+
					break;
				case '#': /* FALLTHROUGH */
				case '?':
					sqlop = (str[0] == '#' ? "COUNT(*)" : "COUNT(*) > 0");
modified src/set.c
@@ -43,11 +43,12 @@
#define AUTOMATIC 1U<<0
#define ORIGIN 1U<<1
#define NAME 1U<<2
+
#define VITAL 1U<<3

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

@@ -94,8 +95,10 @@ exec_set(int argc, char **argv)
	int		 i;
	match_t		 match = MATCH_EXACT;
	int64_t		 newautomatic = -1;
+
	int64_t		 newvital = -1;
	bool		 automatic = false;
	bool		 rc = false;
+
	bool		 vital = false;
	const char	*changed = NULL;
	char		*newvalue = NULL;
	char		*oldvalue = NULL;
@@ -113,11 +116,12 @@ exec_set(int argc, char **argv)
		{ "change-origin",	required_argument,	NULL,	'o' },
		{ "change-name",	required_argument,	NULL,	'n' },
		{ "regex",		no_argument,		NULL,	'x' },
+
		{ "vital",		required_argument,	NULL,	'v' },
		{ "yes",		no_argument,		NULL,	'y' },
		{ NULL,			0,			NULL,	0   },
	};

-
	while ((ch = getopt_long(argc, argv, "+A:aCgio:xyn:", longopts, NULL)) != -1) {
+
	while ((ch = getopt_long(argc, argv, "+A:aCgio:xyn:v:", longopts, NULL)) != -1) {
		switch (ch) {
		case 'A':
			sets |= AUTOMATIC;
@@ -164,6 +168,14 @@ exec_set(int argc, char **argv)
		case 'x':
			match = MATCH_REGEX;
			break;
+
		case 'v':
+
			sets |= VITAL;
+
			newvital = optarg[0] - '0';
+
			if (newvital != 0 && newvital != 1)
+
				errx(EX_USAGE, "Wrong value for -v. "
+
				    "Expecting 0 or 1, got: %s",
+
				    optarg);
+
			break;
		case 'y':
			yes = true;
			break;
@@ -179,7 +191,7 @@ exec_set(int argc, char **argv)
	argv += optind;

	if ((argc < 1 && match != MATCH_ALL) ||
-
		(newautomatic == -1 && newvalue == NULL) ||
+
		(newautomatic == -1 && newvital == -1 && newvalue == NULL) ||
		(sets & (NAME|ORIGIN)) == (NAME|ORIGIN)) {
		usage_set();
		return (EX_USAGE);
@@ -291,6 +303,24 @@ exec_set(int argc, char **argv)
					pkgdb_set(db, pkg, PKG_SET_AUTOMATIC, (int)newautomatic);
				rc = saved_rc;
			}
+
			if ((sets & VITAL) == VITAL) {
+
				pkg_get(pkg, PKG_VITAL, &vital);
+
				if (vital == newvital)
+
					continue;
+
				if (!rc) {
+
					if (newvital)
+
						rc = query_yesno(false,
+
								"Mark %n-%v as vital? ",
+
								pkg, pkg);
+
					else
+
						rc = query_yesno(false,
+
								"Mark %n-%v as not vital? ",
+
								pkg, pkg);
+
				}
+
				if (rc)
+
					pkgdb_set(db, pkg, PKG_SET_VITAL, (int)newvital);
+
				rc = saved_rc;
+
			}
			if (sets & (ORIGIN|NAME)) {
				struct pkg_dep *d = NULL;
				while (pkg_deps(pkg, &d) == EPKG_OK) {
modified tests/frontend/set.sh
@@ -5,7 +5,8 @@
tests_init \
	set_automatic \
	set_change_name \
-
	set_change_origin
+
	set_change_origin \
+
	set_vital

initialize_pkg() {
	cat << EOF > test.ucl
@@ -95,3 +96,37 @@ set_change_origin_body() {
		-s exit:0 \
		pkg info -qo
}
+

+
set_vital_body() {
+
	initialize_pkg
+

+
	atf_check \
+
		-o inline:"0\n" \
+
		-e empty \
+
		-s exit:0 \
+
		pkg query "%V" test
+

+
	atf_check \
+
		-o empty \
+
		-e empty \
+
		-s exit:0 \
+
		pkg set -y -v 1 test
+

+
	atf_check \
+
		-o inline:"1\n" \
+
		-e empty \
+
		-s exit:0 \
+
		pkg query "%V" test
+

+
	atf_check \
+
		-o empty \
+
		-e empty \
+
		-s exit:0 \
+
		pkg set -y -v 0 test
+

+
	atf_check \
+
		-o inline:"0\n" \
+
		-e empty \
+
		-s exit:0 \
+
		pkg query "%V" test
+
}