Radish alpha
H
HardenedBSD Package Manager
Radicle
Git (anonymous pull)
Log in to clone via SSH
First pass at implementing precious packages
Brad Davis committed 10 years ago
commit 103076ecd187b97712a1454cf0512d92b8f3342d
parent cc25ccd3ab030ee520d7781b4192aa42053d55e2
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)