Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
First pass at implementing precious packages
Brad Davis committed 10 years ago
commit 103076ecd187b97712a1454cf0512d92b8f3342d
parent cc25ccd
10 files changed +84 -7
modified libpkg/pkg.c
@@ -279,6 +279,9 @@ pkg_vget(const struct pkg * restrict pkg, va_list ap)
		case PKG_DEP_FORMULA:
			*va_arg(ap, const char **) = pkg->dep_formula;
			break;
+
		case PKG_PRECIOUS:
+
			*va_arg(ap, bool *) = pkg->precious;
+
			break;
		}
	}

@@ -430,6 +433,9 @@ pkg_vset(struct pkg *pkg, va_list ap)
			free(pkg->dep_formula);
			pkg->dep_formula = strdup(va_arg(ap, const char *));
			break;
+
		case PKG_PRECIOUS:
+
			pkg->precious = (bool)va_arg(ap, int);
+
			break;
		}
	}

modified libpkg/pkg.h.in
@@ -281,6 +281,7 @@ typedef enum {
	PKG_UNIQUEID,
	PKG_OLD_DIGEST,
	PKG_DEP_FORMULA,
+
	PKG_PRECIOUS,
	PKG_NUM_FIELDS,		/* end of fields */
} pkg_attr;

@@ -490,7 +491,11 @@ typedef enum {
	/**
	 * Not installed
	 */
-
	EPKG_NOTINSTALLED
+
	EPKG_NOTINSTALLED,
+
	/**
+
	 * Can not delete the package because it is precious
+
	 */
+
	EPKG_PRECIOUS
} pkg_error_t;

/**
modified libpkg/pkg_jobs.c
@@ -1995,6 +1995,10 @@ pkg_jobs_execute(struct pkg_jobs *j)
		case PKG_SOLVED_DELETE:
		case PKG_SOLVED_UPGRADE_REMOVE:
			p = ps->items[0]->pkg;
+
			if (ps->type == PKG_SOLVED_DELETE && p->precious == 1) {
+
				pkg_emit_error("Cannot delete precious pkgs!");
+
				continue;
+
			}
			if (ps->type == PKG_SOLVED_DELETE &&
			    (strcmp(p->name, "pkg") == 0 ||
			    strcmp(p->name, "pkg-devel") == 0) &&
modified libpkg/pkg_manifest.c
@@ -165,6 +165,9 @@ static struct pkg_manifest_key {
	{ "path",                offsetof(struct pkg, repopath),
			TYPE_SHIFT(UCL_STRING), pkg_string},

+
	{ "precious",            offsetof(struct pkg, precious),
+
			TYPE_SHIFT(UCL_INT),    pkg_int},
+

	{ "repopath",            offsetof(struct pkg, repopath),
			TYPE_SHIFT(UCL_STRING), pkg_string},

modified libpkg/pkgdb.c
@@ -89,7 +89,7 @@
*/

#define DB_SCHEMA_MAJOR	0
-
#define DB_SCHEMA_MINOR	32
+
#define DB_SCHEMA_MINOR	33

#define DBVERSION (DB_SCHEMA_MAJOR * 1000 + DB_SCHEMA_MINOR)

@@ -397,6 +397,7 @@ pkgdb_init(sqlite3 *sdb)
		"manifestdigest TEXT NULL, "
		"pkg_format_version INTEGER,"
		"dep_formula TEXT NULL"
+
		",precious INTEGER NOT NULL DEFAULT 0"
	");"
	"CREATE UNIQUE INDEX packages_unique ON packages(name);"
	"CREATE TABLE mtree ("
@@ -1359,10 +1360,11 @@ 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) "
+
			"licenselogic, mtree_id, time, manifestdigest, dep_formula, "
+
			"precious) "
		"VALUES( ?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, "
-
		"?13, (SELECT id FROM mtree WHERE content = ?14), NOW(), ?15, ?16)",
-
		"TTTTTTTTTTIIITTT",
+
		"?13, (SELECT id FROM mtree WHERE content = ?14), NOW(), ?15, ?16, ?17)",
+
		"TTTTTTTTTTIIITTTI",
	},
	[DEPS_UPDATE] = {
		NULL,
modified libpkg/pkgdb_iterator.c
@@ -92,6 +92,7 @@ static struct column_mapping {
	{ "oldversion",	PKG_OLD_VERSION, PKG_SQLITE_STRING },
	{ "origin",	PKG_ORIGIN, PKG_SQLITE_STRING },
	{ "pkgsize",	PKG_PKGSIZE, PKG_SQLITE_INT64 },
+
	{ "precious",	PKG_PRECIOUS, PKG_SQLITE_BOOL },
	{ "prefix",	PKG_PREFIX, PKG_SQLITE_STRING },
	{ "repopath",	PKG_REPOPATH, PKG_SQLITE_STRING },
	{ "repourl",	PKG_REPOURL, PKG_SQLITE_STRING },
@@ -896,6 +897,9 @@ populate_pkg(sqlite3_stmt *stmt, struct pkg *pkg) {
			case PKG_PKGSIZE:
				pkg->pkgsize = sqlite3_column_int64(stmt, icol);
				break;
+
			case PKG_PRECIOUS:
+
				pkg->precious = (bool)sqlite3_column_int64(stmt, icol);
+
				break;
			case PKG_TIME:
				pkg->timestamp = sqlite3_column_int64(stmt, icol);
				break;
modified libpkg/pkgdb_query.c
@@ -155,7 +155,7 @@ pkgdb_query(struct pkgdb *db, const char *pattern, match_t match)
				"version, comment, desc, "
				"message, arch, maintainer, www, "
				"prefix, flatsize, licenselogic, automatic, "
-
				"locked, time, manifestdigest "
+
				"locked, time, manifestdigest, precious "
			"FROM packages AS p%s "
			"ORDER BY p.name;", comp);

modified libpkg/private/db_upgrades.h
@@ -671,6 +671,9 @@ static struct db_upgrades {
	{32,
	"ALTER TABLE packages ADD COLUMN dep_formula TEXT NULL;"
	},
+
	{33,
+
	"ALTER TABLE packages ADD COLUMN precious INTEGER NOT NULL DEFAULT 0;"
+
	},
	/* Mark the end of the array */
	{ -1, NULL }

modified libpkg/private/pkg.h
@@ -213,6 +213,7 @@ struct pkg {
	bool		 direct;
	bool		 locked;
	bool		 automatic;
+
	bool		 precious;
	int64_t		 id;
	struct sbuf	*scripts[PKG_NUM_SCRIPTS];
	char			*name;
modified libpkg/repo/binary/binary_private.h
@@ -369,6 +369,12 @@ static const struct repo_changes repo_upgrades[] = {

	 "ALTER TABLE packages ADD COLUMN dep_formula TEXT NULL;"
	},
+
	{2012,
+
	 2013,
+
	 "Add precious field",
+

+
	 "ALTER TABLE packages ADD COLUMN precious INTEGER NOT NULL DEFAULT 0;"
+
	},
	/* Mark the end of the array */
	{ -1, -1, NULL, NULL, }

@@ -377,6 +383,49 @@ static const struct repo_changes repo_upgrades[] = {
/* How to downgrade a newer repo to match what the current system
   expects */
static const struct repo_changes repo_downgrades[] = {
+
	{2013,
+
	 2012,
+
	 "Drop precious column",
+

+
	 "ALTER TABLE packages RENAME TO packages_old;"
+
	 "CREATE TABLE packages ("
+
		"id INTEGER PRIMARY KEY,"
+
		"origin TEXT UNIQUE,"
+
		"name TEXT NOT NULL,"
+
		"version TEXT NOT NULL,"
+
		"comment TEXT NOT NULL,"
+
		"desc TEXT NOT NULL,"
+
		"osversion TEXT,"
+
		"arch TEXT NOT NULL,"
+
		"maintainer TEXT NOT NULL,"
+
		"www TEXT,"
+
		"prefix TEXT NOT NULL,"
+
		"pkgsize INTEGER NOT NULL,"
+
		"flatsize INTEGER NOT NULL,"
+
		"licenselogic INTEGER NOT NULL,"
+
		"cksum TEXT NOT NULL,"
+
		"path TEXT NOT NULL,"
+
		"pkg_format_version INTEGER,"
+
		"manifestdigest TEXT NULL,"
+
		"olddigest TEXT NULL,"
+
		"dep_formula TEXT NULL,"
+
	");"
+
	"INSERT INTO packages (id, origin, name, version, comment, desc,"
+
	"osversion, arch, maintainer, www, prefix, pkgsize, flatsize,"
+
	"licenselogic, cksum, path, pkg_format_version, manifestdigest, olddigest) "
+
	"SELECT id, origin, name, version, comment, desc,"
+
	"osversion, arch, maintainer, www, prefix, pkgsize, flatsize,"
+
	"licenselogic, cksum, path, pkg_format_version, manifestdigest, olddigest FROM "
+
	"packages_old;"
+
	"DROP TABLE packages_old;"
+
	"CREATE INDEX packages_origin ON packages(origin COLLATE NOCASE);"
+
	"CREATE INDEX packages_name ON packages(name COLLATE NOCASE);"
+
	"CREATE INDEX packages_uid_nocase ON packages(name COLLATE NOCASE, origin COLLATE NOCASE);"
+
	"CREATE INDEX packages_version_nocase ON packages(name COLLATE NOCASE, version);"
+
	"CREATE INDEX packages_uid ON packages(name, origin);"
+
	"CREATE INDEX packages_version ON packages(name, version);"
+
	"CREATE UNIQUE INDEX packages_digest ON packages(manifestdigest);"
+
	},
	{2012,
	 2011,
	 "Drop dep_formula field",
@@ -579,7 +628,7 @@ static const struct repo_changes repo_downgrades[] = {
/* The package repo schema minor revision.
   Minor schema changes don't prevent older pkgng
   versions accessing the repo. */
-
#define REPO_SCHEMA_MINOR 12
+
#define REPO_SCHEMA_MINOR 13

#define REPO_SCHEMA_VERSION (REPO_SCHEMA_MAJOR * 1000 + REPO_SCHEMA_MINOR)