Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Add a place where to store requires
Baptiste Daroussin committed 11 years ago
commit 79a5102d869f840f331830f1368d2f7a9a8263e2
parent b659590
9 files changed +104 -7
modified libpkg/libpkg.ver
@@ -125,6 +125,7 @@ global:
	pkg_repos;
	pkg_repos_activated_count;
	pkg_repos_total_count;
+
	pkg_requires;
	pkg_reset;
	pkg_sbuf_printf;
	pkg_sbuf_vprintf;
modified libpkg/pkg.c
@@ -114,6 +114,7 @@ pkg_reset(struct pkg *pkg, pkg_t type)
	pkg_list_free(pkg, PKG_SHLIBS_REQUIRED);
	pkg_list_free(pkg, PKG_SHLIBS_PROVIDED);
	pkg_list_free(pkg, PKG_PROVIDES);
+
	pkg_list_free(pkg, PKG_REQUIRES);
	if (pkg->rootfd != -1)
		close(pkg->rootfd);
	pkg->rootfd = -1;
@@ -159,6 +160,8 @@ pkg_free(struct pkg *pkg)
	pkg_list_free(pkg, PKG_GROUPS);
	pkg_list_free(pkg, PKG_SHLIBS_REQUIRED);
	pkg_list_free(pkg, PKG_SHLIBS_PROVIDED);
+
	pkg_list_free(pkg, PKG_PROVIDES);
+
	pkg_list_free(pkg, PKG_REQUIRES);

	LL_FREE(pkg->categories, pkg_strel_free);
	LL_FREE(pkg->licenses, pkg_strel_free);
@@ -711,6 +714,14 @@ pkg_provides(const struct pkg *pkg, struct pkg_provide **c)
}

int
+
pkg_requires(const struct pkg *pkg, struct pkg_provide **c)
+
{
+
	assert(pkg != NULL);
+

+
	HASH_NEXT(pkg->requires, (*c));
+
}
+

+
int
pkg_adduid(struct pkg *pkg, const char *name, const char *uidstr)
{
	struct pkg_user *u = NULL;
@@ -1431,6 +1442,8 @@ pkg_list_count(const struct pkg *pkg, pkg_list list)
		return (HASH_COUNT(pkg->conflicts));
	case PKG_PROVIDES:
		return (HASH_COUNT(pkg->provides));
+
	case PKG_REQUIRES:
+
		return (HASH_COUNT(pkg->requires));
	case PKG_CONFIG_FILES:
		return (HASH_COUNT(pkg->config_files));
	}
@@ -1487,6 +1500,10 @@ pkg_list_free(struct pkg *pkg, pkg_list list) {
		HASH_FREE(pkg->provides, pkg_provide_free);
		pkg->flags &= ~PKG_LOAD_PROVIDES;
		break;
+
	case PKG_REQUIRES:
+
		HASH_FREE(pkg->requires, pkg_provide_free);
+
		pkg->flags &= ~PKG_LOAD_REQUIRES;
+
		break;
	}
}

modified libpkg/pkg.h.in
@@ -1,5 +1,5 @@
/*-
-
 * Copyright (c) 2011-2014 Baptiste Daroussin <bapt@FreeBSD.org>
+
 * Copyright (c) 2011-2015 Baptiste Daroussin <bapt@FreeBSD.org>
 * Copyright (c) 2011-2012 Julien Laffaye <jlaffaye@FreeBSD.org>
 * Copyright (c) 2011 Will Andrews <will@FreeBSD.org>
 * Copyright (c) 2011 Philippe Pepiot <phil@philpep.org>
@@ -329,6 +329,7 @@ typedef enum {
	PKG_CONFLICTS,
	PKG_PROVIDES,
	PKG_CONFIG_FILES,
+
	PKG_REQUIRES,
} pkg_list;

typedef enum {
@@ -664,6 +665,7 @@ int pkg_conflicts(const struct pkg *pkg, struct pkg_conflict **conflict);
 * @return An error code
 */
int pkg_provides(const struct pkg *pkg, struct pkg_provide **provide);
+
int pkg_requires(const struct pkg *pkg, struct pkg_provide **require);

/**
 * Iterates over the config files registered in the package.
@@ -953,6 +955,7 @@ int pkgdb_delete_annotation(struct pkgdb *db, struct pkg *pkg,
#define PKG_LOAD_ANNOTATIONS		(1U << 12)
#define PKG_LOAD_CONFLICTS		(1U << 13)
#define PKG_LOAD_PROVIDES		(1U << 14)
+
#define PKG_LOAD_REQUIRES		(1U << 15)
/* Make sure new PKG_LOAD don't conflict with PKG_CONTAINS_* */

/**
modified libpkg/pkg_manifest.c
@@ -1,5 +1,5 @@
/*-
-
 * Copyright (c) 2011-2014 Baptiste Daroussin <bapt@FreeBSD.org>
+
 * Copyright (c) 2011-2015 Baptiste Daroussin <bapt@FreeBSD.org>
 * Copyright (c) 2011-2012 Julien Laffaye <jlaffaye@FreeBSD.org>
 * Copyright (c) 2013-2014 Vsevolod Stakhov <vsevolod@FreeBSD.org>
 * All rights reserved.
@@ -57,6 +57,7 @@
#define PKG_SHLIBS_PROVIDED	-15
#define PKG_CONFLICTS		-17
#define PKG_PROVIDES		-18
+
#define PKG_REQUIRES		-19

static int pkg_string(struct pkg *, const ucl_object_t *, int);
static int pkg_obj(struct pkg *, const ucl_object_t *, int);
@@ -105,6 +106,7 @@ static struct manifest_key {
	{ "pkgsize",             PKG_PKGSIZE,             UCL_INT,    pkg_int},
	{ "prefix",              PKG_PREFIX,              UCL_STRING, pkg_string},
	{ "provides",            PKG_PROVIDES,            UCL_ARRAY,  pkg_array},
+
	{ "requires",            PKG_PROVIDES,            UCL_ARRAY,  pkg_array},
	{ "scripts",             PKG_SCRIPTS,             UCL_OBJECT, pkg_obj},
	{ "shlibs",              PKG_SHLIBS_REQUIRED,     UCL_ARRAY,  pkg_array}, /* Backwards compat with 1.0.x packages */
	{ "shlibs_provided",     PKG_SHLIBS_PROVIDED,     UCL_ARRAY,  pkg_array},
@@ -919,6 +921,7 @@ pkg_emit_object(struct pkg *pkg, short flags)
	struct pkg_shlib	*shlib    = NULL;
	struct pkg_conflict	*conflict = NULL;
	struct pkg_provide	*provide  = NULL;
+
	struct pkg_provide	*require  = NULL;
	struct pkg_config_file	*cf       = NULL;
	struct sbuf		*tmpsbuf  = NULL;
	int i;
@@ -1080,6 +1083,16 @@ pkg_emit_object(struct pkg *pkg, short flags)
	if (seq)
		ucl_object_insert_key(top, seq, "provides", 8, false);

+
	pkg_debug(4, "Emitting requires");
+
	seq = NULL;
+
	while (pkg_requires(pkg, &require) == EPKG_OK) {
+
		if (seq == NULL)
+
			seq = ucl_object_typed_new(UCL_ARRAY);
+
		ucl_array_append(seq, ucl_object_fromstring(require->provide));
+
	}
+
	if (seq)
+
		ucl_object_insert_key(top, seq, "requires", 8, false);
+

	pkg_debug(4, "Emitting options");
	map = NULL;
	while (pkg_options(pkg, &option) == EPKG_OK) {
modified libpkg/pkgdb.c
@@ -87,7 +87,7 @@
*/

#define DB_SCHEMA_MAJOR	0
-
#define DB_SCHEMA_MINOR	30
+
#define DB_SCHEMA_MINOR	31

#define DBVERSION (DB_SCHEMA_MAJOR * 1000 + DB_SCHEMA_MINOR)

@@ -646,6 +646,17 @@ pkgdb_init(sqlite3 *sdb)
		"WHERE option_id NOT IN "
			"( SELECT DISTINCT option_id FROM pkg_option );"
	"END;"
+
	"CREATE TABLE requires("
+
	"    id INTEGER PRIMARY KEY,"
+
	"    require TEXT NOT NULL"
+
	");"
+
	"CREATE TABLE pkg_requires ("
+
	    "package_id INTEGER NOT NULL REFERENCES packages(id)"
+
	    "  ON DELETE CASCADE ON UPDATE CASCADE,"
+
	    "require_id INTEGER NOT NULL REFERENCES requires(id)"
+
	    "  ON DELETE RESTRICT ON UPDATE RESTRICT,"
+
	    "UNIQUE(package_id, require_id)"
+
	");"

	"PRAGMA user_version = %d;"
	"COMMIT;"
@@ -1276,6 +1287,8 @@ typedef enum _sql_prstmt_index {
	UPDATE_DIGEST,
	CONFIG_FILES,
	UPDATE_CONFIG_FILE,
+
	PKG_REQUIRE,
+
	REQUIRE,
	PRSTMT_LAST,
} sql_prstmt_index;

@@ -1494,6 +1507,17 @@ static sql_prstmt sql_prepared_statements[PRSTMT_LAST] = {
		NULL,
		"UPDATE config_files SET content=?1 WHERE path=?2;",
		"TT"
+
	},
+
	[PKG_REQUIRE] = {
+
		NULL,
+
		"INSERT INTO pkg_requires(package_id, require_id) "
+
		"VALUES (?1, (SELECT id FROM requires WHERE require = ?2))",
+
		"IT",
+
	},
+
	[REQUIRE] = {
+
		NULL,
+
		"INSERT OR IGNORE INTO requires(require) VALUES(?1)",
+
		"T"
	}
	/* PRSTMT_LAST */
};
modified libpkg/pkgdb_iterator.c
@@ -1,5 +1,5 @@
/*-
-
 * Copyright (c) 2011-2012 Baptiste Daroussin <bapt@FreeBSD.org>
+
 * Copyright (c) 2011-2015 Baptiste Daroussin <bapt@FreeBSD.org>
 * Copyright (c) 2011-2012 Julien Laffaye <jlaffaye@FreeBSD.org>
 * Copyright (c) 2011 Will Andrews <will@FreeBSD.org>
 * Copyright (c) 2011 Philippe Pepiot <phil@philpep.org>
@@ -673,6 +673,20 @@ pkgdb_load_provides(sqlite3 *sqlite, struct pkg *pkg)
			pkg_addconflict, PKG_PROVIDES));
}

+
static int
+
pkgdb_load_requires(sqlite3 *sqlite, struct pkg *pkg)
+
{
+
	const char	sql[] = ""
+
		"SELECT require"
+
		" FROM requires"
+
		" WHERE package_id = ?1";
+

+
	assert(pkg != NULL);
+

+
	return (load_val(sqlite, pkg, sql, PKG_LOAD_REQUIRES,
+
	    pkg_addconflict, PKG_REQUIRES));
+
}
+

static void
populate_pkg(sqlite3_stmt *stmt, struct pkg *pkg) {
	int		 icol = 0;
modified libpkg/private/db_upgrades.h
@@ -1,5 +1,5 @@
/*-
-
 * Copyright (c) 2011-2012 Baptiste Daroussin <bapt@FreeBSD.org>
+
 * Copyright (c) 2011-2015 Baptiste Daroussin <bapt@FreeBSD.org>
 * Copyright (c) 2011-2012 Julien Laffaye <jlaffaye@FreeBSD.org>
 * Copyright (c) 2013 Matthew Seaman <matthew@FreeBSD.org>
 * Copyright (c) 2013-2014 Vsevolod Stakhov <vsevolod@FreeBSD.org>
@@ -655,6 +655,19 @@ static struct db_upgrades {
	"DROP INDEX deps_unique;"
	"CREATE UNIQUE INDEX deps_unique ON deps(name, version, package_id);"
	},
+
	{31,
+
	"CREATE TABLE requires("
+
	"    id INTEGER PRIMARY KEY,"
+
	"    require TEXT NOT NULL"
+
	");"
+
	"CREATE TABLE pkg_requires ("
+
		"package_id INTEGER NOT NULL REFERENCES packages(id)"
+
		"  ON DELETE CASCADE ON UPDATE CASCADE,"
+
		"require_id INTEGER NOT NULL REFERENCES requires(id)"
+
		"  ON DELETE RESTRICT ON UPDATE RESTRICT,"
+
		"UNIQUE(package_id, require_id)"
+
	");"
+
	},
	/* Mark the end of the array */
	{ -1, NULL }

modified libpkg/private/pkg.h
@@ -1,5 +1,5 @@
/*-
-
 * Copyright (c) 2011-2014 Baptiste Daroussin <bapt@FreeBSD.org>
+
 * Copyright (c) 2011-2015 Baptiste Daroussin <bapt@FreeBSD.org>
 * Copyright (c) 2011-2012 Julien Laffaye <jlaffaye@FreeBSD.org>
 * Copyright (c) 2013 Matthew Seaman <matthew@FreeBSD.org>
 * Copyright (c) 2013 Vsevolod Stakhov <vsevolod@FreeBSD.org>
@@ -173,6 +173,7 @@ struct pkg {
	struct pkg_shlib	*shlibs_provided;
	struct pkg_conflict *conflicts;
	struct pkg_provide	*provides;
+
	struct pkg_provide	*requires;
	struct pkg_config_file	*config_files;
	struct pkg_kv		*annotations;
	unsigned			flags;
modified libpkg/repo/binary/binary_private.h
@@ -163,6 +163,17 @@ static const char binary_repo_initsql[] = ""
	    "  ON DELETE RESTRICT ON UPDATE RESTRICT,"
	    "UNIQUE(package_id, provide_id)"
	");"
+
	"CREATE TABLE requires("
+
	"    id INTEGER PRIMARY KEY,"
+
	"    require TEXT NOT NULL"
+
	");"
+
	"CREATE TABLE pkg_requires ("
+
		"package_id INTEGER NOT NULL REFERENCES packages(id)"
+
		"  ON DELETE CASCADE ON UPDATE CASCADE,"
+
		"require_id INTEGER NOT NULL REFERENCES requires(id)"
+
		"  ON DELETE RESTRICT ON UPDATE RESTRICT,"
+
		"UNIQUE(package_id, require_id)"
+
	");"
/*	"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);"
@@ -517,7 +528,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 10
+
#define REPO_SCHEMA_MINOR 11

/* REPO_SCHEMA_VERSION=2007 */
#define REPO_SCHEMA_VERSION (REPO_SCHEMA_MAJOR * 1000 + REPO_SCHEMA_MINOR)