Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Forced reinstallation/upgrade now possible
Baptiste Daroussin committed 14 years ago
commit c9339f066be80753bad3f02f246b2db17408b9cb
parent 31985da
8 files changed +92 -21
modified libpkg/pkg.h
@@ -579,7 +579,7 @@ struct pkgdb_it * pkgdb_rquery(struct pkgdb *db, const char *pattern,
/**
 * 
 */
-
struct pkgdb_it *pkgdb_query_installs(struct pkgdb *db, match_t type, int nbpkgs, char **pkgs, const char *reponame);
+
struct pkgdb_it *pkgdb_query_installs(struct pkgdb *db, match_t type, int nbpkgs, char **pkgs, const char *reponame, bool force);
struct pkgdb_it *pkgdb_query_upgrades(struct pkgdb *db, const char *reponame, bool all);
struct pkgdb_it *pkgdb_query_downgrades(struct pkgdb *db, const char *reponame);
struct pkgdb_it *pkgdb_query_delete(struct pkgdb *db, match_t type, int nbpkgs, char **pkgs, int recursive);
modified libpkg/pkg_event.c
@@ -175,7 +175,17 @@ pkg_emit_upgrade_finished(struct pkg *p)
	pkg_config_bool(PKG_CONFIG_SYSLOG, &syslog_enabled);
	if (syslog_enabled) {
		pkg_get(p, PKG_NAME, &name, PKG_VERSION, &version, PKG_NEWVERSION, &newversion);
-
		syslog(LOG_NOTICE, "%s upgraded: %s -> %s ", name, version, newversion);
+
		switch (pkg_version_cmp(version, newversion)) {
+
			case 1:
+
				syslog(LOG_NOTICE, "%s downgraded: %s -> %s ", name, version, newversion);
+
				break;
+
			case 0:
+
				syslog(LOG_NOTICE, "%s reinstalled: %s -> %s ", name, version, newversion);
+
				break;
+
			case -1:
+
				syslog(LOG_NOTICE, "%s reinstalled: %s -> %s ", name, version, newversion);
+
				break;
+
		}
	}

	pkg_emit_event(&ev);
modified libpkg/pkgdb.c
@@ -1921,14 +1921,14 @@ create_temporary_pkgjobs(sqlite3 *s)
			"comment TEXT, desc TEXT, message TEXT, "
			"arch TEXT, osversion TEXT, maintainer TEXT, "
			"www TEXT, prefix TEXT, flatsize INTEGER, newversion TEXT, "
-
			"newflatsize INTEGER, pkgsize INTEGER, cksum TEXT, repopath TEXT, automatic INTEGER, "
+
			"newflatsize INTEGER, pkgsize INTEGER, cksum TEXT, repopath TEXT, automatic INTEGER, weight INTEGER"
			"dbname TEXT);");

	return (ret);
}

struct pkgdb_it *
-
pkgdb_query_installs(struct pkgdb *db, match_t match, int nbpkgs, char **pkgs, const char *repo)
+
pkgdb_query_installs(struct pkgdb *db, match_t match, int nbpkgs, char **pkgs, const char *repo, bool force)
{
	sqlite3_stmt *stmt = NULL;
	int i = 0;
@@ -1940,7 +1940,7 @@ pkgdb_query_installs(struct pkgdb *db, match_t match, int nbpkgs, char **pkgs, c
	const char finalsql[] = "SELECT pkgid AS id, origin, name, version, "
		"comment, desc, message, arch, osversion, maintainer, "
		"www, prefix, flatsize, newversion, newflatsize, pkgsize, "
-
		"cksum, repopath, automatic, (select count(*) FROM '%s'.deps as d WHERE d.origin = pkgjobs.origin) as weight, "
+
		"cksum, repopath, automatic, weight, "
		"'%s' AS dbname FROM pkgjobs ORDER BY weight DESC;";
       
	const char main_sql[] = "INSERT OR IGNORE INTO pkgjobs (pkgid, origin, name, version, comment, desc, arch, "
@@ -1960,6 +1960,8 @@ pkgdb_query_installs(struct pkgdb *db, match_t match, int nbpkgs, char **pkgs, c
				"(SELECT d.origin FROM '%s'.deps AS d, pkgjobs AS j WHERE d.package_id = j.pkgid) "
				"AND (SELECT origin FROM main.packages WHERE origin=r.origin AND version=r.version) IS NULL;";

+
	const char weight_sql[] = "UPDATE pkgjobs set weight=(select count(*) from '%s'.deps as d where d.origin=pkgjobs.origin)";
+

	assert(db != NULL);

	if (db->type != PKGDB_REMOTE) {
@@ -2029,11 +2031,13 @@ pkgdb_query_installs(struct pkgdb *db, match_t match, int nbpkgs, char **pkgs, c
	sbuf_clear(sql);

	/* Remove packages already installed and in the latest version */
-
	sql_exec(db->sqlite, "DELETE from pkgjobs where (select p.origin from main.packages as p where p.origin=pkgjobs.origin and version=pkgjobs.version) IS NOT NULL;");
+
	if (!force)
+
		sql_exec(db->sqlite, "DELETE from pkgjobs where (select p.origin from main.packages as p where p.origin=pkgjobs.origin and version=pkgjobs.version) IS NOT NULL;");

	/* Append dependencies */
	sbuf_reset(sql);
	sbuf_printf(sql, deps_sql, reponame, reponame);
+
	sbuf_finish(sql);

	do {
		sql_exec(db->sqlite, sbuf_get(sql));
@@ -2047,11 +2051,19 @@ pkgdb_query_installs(struct pkgdb *db, match_t match, int nbpkgs, char **pkgs, c
			"SELECT l.id, l.origin, l.name, l.version, l.comment, l.desc, l.message, l.arch, "
			"l.osversion, l.maintainer, l.www, l.prefix, l.flatsize, r.version AS newversion, "
			"r.flatsize AS newflatsize, r.pkgsize, r.cksum, r.repopath, r.automatic "
-
			"FROM main.packages AS l, pkgjobs AS r WHERE l.origin = r.origin "
-
			"AND (PKGLT(l.version, r.version) OR (l.name != r.name))");
+
			"FROM main.packages AS l, pkgjobs AS r WHERE l.origin = r.origin ");

	sbuf_reset(sql);
-
	sbuf_printf(sql, finalsql, reponame, reponame);
+
	sbuf_printf(sql, weight_sql, reponame);
+
	sbuf_finish(sql);
+

+
	sql_exec(db->sqlite, sbuf_get(sql));
+

+
	sql_exec(db->sqlite, "UPDATE pkgjobs set weight=100000 where origin=\"ports-mgmt/pkg\"");
+

+
	sbuf_reset(sql);
+
	sbuf_printf(sql, finalsql, reponame);
+
	sbuf_finish(sql);

	if (sqlite3_prepare_v2(db->sqlite, sbuf_get(sql), -1, &stmt, NULL) != SQLITE_OK) {
		ERROR_SQLITE(db->sqlite);
@@ -2082,7 +2094,7 @@ pkgdb_query_upgrades(struct pkgdb *db, const char *repo, bool all)
	const char finalsql[] = "select pkgid as id, origin, name, version, "
		"comment, desc, message, arch, osversion, maintainer, "
		"www, prefix, flatsize, newversion, newflatsize, pkgsize, "
-
		"cksum, repopath, automatic, (select count(*) from '%s'.deps as d where d.origin = pkgjobs.origin) as weight, "
+
		"cksum, repopath, automatic, weight, "
		"'%s' AS dbname FROM pkgjobs order by weight DESC;";
		
	const char pkgjobs_sql_1[] = "INSERT OR IGNORE INTO pkgjobs (pkgid, origin, name, version, comment, desc, arch, "
@@ -2122,6 +2134,8 @@ pkgdb_query_upgrades(struct pkgdb *db, const char *repo, bool all)
			"FROM main.packages AS l, pkgjobs AS r WHERE l.origin = r.origin";
	}

+
	const char weight_sql[] = "UPDATE pkgjobs set weight=(select count(*) from '%s'.deps as d where d.origin=pkgjobs.origin)";
+

	/* Working on multiple repositories */
	pkg_config_bool(PKG_CONFIG_MULTIREPOS, &multirepos_enabled);

@@ -2149,7 +2163,8 @@ pkgdb_query_upgrades(struct pkgdb *db, const char *repo, bool all)
	sql_exec(db->sqlite, sbuf_get(sql));

	/* Remove packages already installed and in the latest version */
-
	sql_exec(db->sqlite, "DELETE from pkgjobs where (select p.origin from main.packages as p where p.origin=pkgjobs.origin and version=pkgjobs.version) IS NOT NULL;");
+
	if (!all)
+
		sql_exec(db->sqlite, "DELETE from pkgjobs where (select p.origin from main.packages as p where p.origin=pkgjobs.origin and version=pkgjobs.version) IS NOT NULL;");

	sbuf_reset(sql);
	sbuf_printf(sql, pkgjobs_sql_2, reponame, reponame);
@@ -2163,7 +2178,15 @@ pkgdb_query_upgrades(struct pkgdb *db, const char *repo, bool all)
	sql_exec(db->sqlite, pkgjobs_sql_3);

	sbuf_reset(sql);
-
	sbuf_printf(sql, finalsql, reponame, reponame);
+
	sbuf_printf(sql, weight_sql, reponame);
+
	sbuf_finish(sql);
+

+
	sql_exec(db->sqlite, sbuf_get(sql));
+

+
	sql_exec(db->sqlite, "UPDATE pkgjobs set weight=100000 where origin=\"ports-mgmt/pkg\"");
+

+
	sbuf_reset(sql);
+
	sbuf_printf(sql, finalsql, reponame);
	sbuf_finish(sql);

	if (sqlite3_prepare_v2(db->sqlite, sbuf_get(sql), -1, &stmt, NULL) != SQLITE_OK) {
modified pkg/event.c
@@ -73,7 +73,17 @@ event_callback(void *data, struct pkg_event *ev)
	case PKG_EVENT_UPGRADE_BEGIN:
		pkg_get(ev->e_upgrade_finished.pkg, PKG_NAME, &name, PKG_VERSION, &version,
		    PKG_NEWVERSION, &newversion);
-
		printf("Upgrading %s from %s to %s...", name, version, newversion);
+
		switch (pkg_version_cmp(version, newversion)) {
+
			case 1:
+
				printf("Downgrading %s from %s to %s...", name, version, newversion);
+
				break;
+
			case 0:
+
				printf("Reinstalling %s-%s", name, version);
+
				break;
+
			case -1:
+
				printf("Upgrading %s from %s to %s...", name, version, newversion);
+
				break;
+
		}
		fflush(stdout);
		break;
	case PKG_EVENT_UPGRADE_FINISHED:
modified pkg/install.c
@@ -16,7 +16,7 @@
void
usage_install(void)
{
-
	fprintf(stderr, "usage: pkg install [-r reponame] [-ygxX] <pkg-name> <...>\n\n");
+
	fprintf(stderr, "usage: pkg install [-r reponame] [-yfgxX] <pkg-name> <...>\n\n");
	fprintf(stderr, "For more information see 'pkg help install'.\n");
}

@@ -35,8 +35,9 @@ exec_install(int argc, char **argv)
	int64_t oldsize = 0, newsize = 0;
	char size[7];
	match_t match = MATCH_EXACT;
+
	bool force = false;

-
	while ((ch = getopt(argc, argv, "ygxXr:")) != -1) {
+
	while ((ch = getopt(argc, argv, "yfgxXr:")) != -1) {
		switch (ch) {
			case 'y':
				yes = true;
@@ -53,6 +54,9 @@ exec_install(int argc, char **argv)
			case 'r':
				reponame = optarg;
				break;
+
			case 'f':
+
				force = true;
+
				break;
			default:
				usage_install();
				return (EX_USAGE);
@@ -79,7 +83,7 @@ exec_install(int argc, char **argv)
		goto cleanup;
	}

-
	if ((it = pkgdb_query_installs(db, match, argc, argv, reponame)) == NULL)
+
	if ((it = pkgdb_query_installs(db, match, argc, argv, reponame, force)) == NULL)
		goto cleanup;

	while (pkgdb_it_next(it, &pkg, PKG_LOAD_BASIC|PKG_LOAD_DEPS) == EPKG_OK) {
@@ -106,9 +110,19 @@ exec_install(int argc, char **argv)
		    PKG_NEW_FLATSIZE, &newflatsize, PKG_NEW_PKGSIZE, &pkgsize);
		dlsize += pkgsize;
		if (newversion != NULL) {
-
			printf("\tUpgrading %s: %s -> %s\n", name, version, newversion);
+
			switch (pkg_version_cmp(version, newversion)) {
+
				case 1:
+
					printf("\tDowngrading %s: %s -> %s\n", name, version, newversion);
+
					break;
+
				case 0:
+
					printf("\tReinstalling %s-%s\n", name, version);
+
					break;
+
				case -1:
+
					printf("\tUpgrading %s: %s -> %s\n", name, version, newversion);
+
					break;
+
			}
			oldsize += flatsize;
-
			newsize += flatsize;
+
			newsize += newflatsize;
		} else {
			newsize += flatsize;
			printf("\tInstalling %s: %s\n", name, version);
modified pkg/pkg-install.8
@@ -23,7 +23,7 @@
.Nd installs packages from remote package repositories
.Sh SYNOPSIS
.Nm
-
.Op Fl ygxX
+
.Op Fl yfgxX
.Ar <pkg-origin> <...>
.Sh DESCRIPTION
.Nm
@@ -68,6 +68,8 @@ Treat the package names as shell glob patterns.
Treat the package names as regular expressions.
.It Fl X
Treat the package names as extended regular expressions.
+
.It Fl f
+
Force the reinstallation of the package if already installed.
.El
.Sh ENVIRONMENT
The following environment variables affect the execution of
modified pkg/pkg-upgrade.8
@@ -23,7 +23,7 @@
.Nd performs upgrades of package software distributions
.Sh SYNOPSIS
.Nm
-
.Op Fl y
+
.Op Fl yf
.Sh DESCRIPTION
.Nm
is used for upgrading of package software distributions.
@@ -41,6 +41,8 @@ The following options are supported by
.Bl -tag -width F1
.It Fl y
Assume yes when asked for confirmation before package installation.
+
.It Fl f
+
Force reinstalling/upgrading the whole set of packages
.El
.Sh ENVIRONMENT
The following environment variables affect the execution of
modified pkg/upgrade.c
@@ -102,7 +102,17 @@ exec_upgrade(int argc, char **argv)
		    PKG_FLATSIZE, &flatsize);
		dlsize += newpkgsize;
		if (newversion != NULL) {
-
			printf("\tUpgrading %s: %s -> %s\n", name, version, newversion);
+
			switch (pkg_version_cmp(version, newversion)) {
+
				case 1:
+
					printf("\tDowngrading %s: %s -> %s\n", name, version, newversion);
+
					break;
+
				case 0:
+
					printf("\tReinstalling %s-%s\n", name, version);
+
					break;
+
				case -1:
+
					printf("\tUpgrading %s: %s -> %s\n", name, version, newversion);
+
					break;
+
			}
			oldsize += flatsize;
			newsize += newflatsize;
		} else {