Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Better implementation of "for pkg installation/upgrade"
Baptiste Daroussin committed 14 years ago
commit a1a28f18236b0965474f9280b6fb09ea76b66f02
parent 2a0be1c
7 files changed +107 -60
modified libpkg/pkg.h
@@ -807,6 +807,7 @@ typedef enum {
	PKG_EVENT_FETCHING,
	PKG_EVENT_INTEGRITYCHECK_BEGIN,
	PKG_EVENT_INTEGRITYCHECK_FINISHED,
+
	PKG_EVENT_NEWPKGVERSION,
	/* errors */
	PKG_EVENT_ERROR,
	PKG_EVENT_ERRNO,
modified libpkg/pkg_event.c
@@ -263,6 +263,15 @@ pkg_emit_noremotedb(const char *repo)
}

void
+
pkg_emit_newpkgversion(void)
+
{
+
	struct pkg_event ev;
+
	ev.type = PKG_EVENT_NEWPKGVERSION;
+

+
	pkg_emit_event(&ev);
+
}
+

+
void
pkg_emit_file_mismatch(struct pkg *pkg, struct pkg_file *f, const char *newsum) {
	struct pkg_event ev;
	ev.type = PKG_EVENT_FILE_MISMATCH;
modified libpkg/pkgdb.c
@@ -2154,22 +2154,105 @@ create_temporary_pkgjobs(sqlite3 *s)
	return (ret);
}

+
static struct pkgdb_it *
+
pkgdb_query_newpkgversion(struct pkgdb *db, const char *repo)
+
{
+
	struct sbuf *sql = sbuf_new_auto();
+
	const char *reponame = NULL;
+
	bool multirepos_enabled;
+
	sqlite3_stmt *stmt = NULL;
+

+
	const char finalsql[] = "SELECT pkgid AS id, origin, name, version, "
+
		"comment, desc, message, arch, maintainer, "
+
		"www, prefix, flatsize, newversion, newflatsize, pkgsize, "
+
		"cksum, repopath, automatic, weight, "
+
		"'%s' AS dbname FROM pkgjobs;";
+

+
	const char main_sql[] = "INSERT OR IGNORE INTO pkgjobs (pkgid, origin, name, version, comment, desc, arch, "
+
			"maintainer, www, prefix, flatsize, pkgsize, "
+
			"cksum, repopath, automatic) "
+
			"SELECT id, origin, name, version, comment, desc, "
+
			"arch, maintainer, www, prefix, flatsize, pkgsize, "
+
			"cksum, path, 0 FROM '%s'.packages WHERE origin='ports-mgmt/pkg';";
+

+
	assert(db != NULL);
+

+
	if (db->type != PKGDB_REMOTE) {
+
		pkg_emit_error("remote database not attached (misuse)");
+
		return (NULL);
+
	}
+

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

+
	if (multirepos_enabled) {
+
		if (repo != NULL) {
+
			if (!is_attached(db->sqlite, repo)) {
+
				pkg_emit_error("repository '%s' does not exists", repo);
+
				return (NULL);
+
			}
+

+
			reponame = repo;
+
		} else {
+
			/* default repository in multi-repos is 'default' */
+
			reponame = "default";
+
		}
+
	} else {
+
		/* default repository in single-repo is 'remote' */
+
		reponame = "remote";
+
	}
+

+
	sbuf_printf(sql, main_sql, reponame);
+

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

+
	sql_exec(db->sqlite, "DELETE FROM pkgjobs WHERE pkgjobs.origin = "
+
	    "(SELECT packages.origin FROM packages WHERE packages.origin = pkgjobs.origin "
+
	    "and (PKGGT(packages.version, pkgjobs.version) OR packages.version = pkgjobs.version));");
+

+
	if (sqlite3_changes(db->sqlite) > 0) {
+
		sbuf_delete(sql);
+
		return NULL;
+
	}
+
	/* Final SQL */
+
	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);
+
		return (NULL);
+
	}
+

+
	sbuf_delete(sql);
+

+
	return (pkgdb_it_new(db, stmt, PKG_REMOTE));
+
}
+

struct pkgdb_it *
pkgdb_query_installs(struct pkgdb *db, match_t match, int nbpkgs, char **pkgs, const char *repo, bool force)
{
	sqlite3_stmt *stmt = NULL;
+
	struct pkgdb_it *it;
	int i = 0;
	struct sbuf *sql = sbuf_new_auto();
	const char *how = NULL;
	const char *reponame = NULL;
	bool multirepos_enabled = false;

+
	if ((it = pkgdb_query_newpkgversion(db, repo)) != NULL) {
+
		pkg_emit_newpkgversion();
+
		return (it);
+
	}
+

	const char finalsql[] = "SELECT pkgid AS id, origin, name, version, "
		"comment, desc, message, arch, maintainer, "
		"www, prefix, flatsize, newversion, newflatsize, pkgsize, "
		"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, "
			"maintainer, www, prefix, flatsize, pkgsize, "
			"cksum, repopath, automatic) "
@@ -2315,6 +2398,12 @@ pkgdb_query_upgrades(struct pkgdb *db, const char *repo, bool all)
	struct sbuf *sql = sbuf_new_auto();
	const char *reponame = NULL;
	bool multirepos_enabled = false;
+
	struct pkgdb_it *it;
+

+
	if ((it = pkgdb_query_newpkgversion(db, repo)) != NULL) {
+
		pkg_emit_newpkgversion();
+
		return (it);
+
	}

	assert(db != NULL);

modified libpkg/private/event.h
@@ -45,5 +45,6 @@ void pkg_emit_integritycheck_finished(void);
void pkg_emit_noremotedb(const char *);
void pkg_emit_nolocaldb(void);
void pkg_emit_file_mismatch(struct pkg *pkg, struct pkg_file *f, const char *newsum);
+
void pkg_emit_newpkgversion(void);

#endif
modified pkg/event.c
@@ -148,6 +148,8 @@ event_callback(void *data, struct pkg_event *ev)
			fprintf(stderr, "\n");
		break;
	case PKG_EVENT_ALREADY_INSTALLED:
+
		if (quiet)
+
			break;
		pkg_get(ev->e_already_installed.pkg, PKG_NAME, &name, PKG_VERSION, &version);
		printf("%s-%s already installed\n", name, version);
		break;
@@ -163,6 +165,10 @@ event_callback(void *data, struct pkg_event *ev)
		if (geteuid() == 0)
			fprintf(stderr, "Unable to create local database\n");
		break;
+
	case PKG_EVENT_NEWPKGVERSION:
+
		printf("New version of pkg detected, it needs to be installed first.\n"
+
			"After this upgrade it is recommended that you do a full upgrade using: 'pkg upgrade'\n\n");
+
		break;
	case PKG_EVENT_FILE_MISMATCH:
		pkg_get(ev->e_file_mismatch.pkg, PKG_NAME, &name, PKG_VERSION, &version);
		fprintf(stderr, "%s-%s: checksum mismatch for %s\n", name, version, pkg_file_get(ev->e_file_mismatch.file, PKG_FILE_PATH));
modified pkg/install.c
@@ -56,7 +56,6 @@ exec_install(int argc, char **argv)
	struct pkgdb *db = NULL;
	struct pkg_jobs *jobs = NULL;
	const char *reponame = NULL;
-
	char *pkgargs[1];
	int retcode = 1;
	int ch;
	bool yes = false;
@@ -113,35 +112,6 @@ exec_install(int argc, char **argv)
		goto cleanup;
	}

-
	pkgargs[0] = __DECONST(char *,"pkg");
-
	if ((it = pkgdb_query_installs(db, MATCH_EXACT, 1, pkgargs, reponame, false)) != NULL) {
-
		if (pkgdb_it_next(it, &pkg, PKG_LOAD_BASIC|PKG_LOAD_DEPS) == EPKG_OK) {
-
			pkg_jobs_add(jobs, pkg);
-
			pkg = NULL;
-
		}
-
		if (!quiet) {
-
			print_jobs_summary(jobs, PKG_JOBS_INSTALL,
-
			    "An upgrade of pkg as been found it needs to be installed first.\n"
-
			    "After this upgrade it is recommended that you do a full upgrade using:\n"
-
			    " pkg upgrade\n\n");
-
			if (!yes)
-
				pkg_config_bool(PKG_CONFIG_ASSUME_ALWAYS_YES, &yes);
-
			if (!yes)
-
				yes = query_yesno("\nProceed with upgrading [y/N]: ");
-
		}
-
		if (yes)
-
			if (pkg_jobs_apply(jobs, 0) != EPKG_OK)
-
				goto cleanup;
-

-
		if (messages != NULL) {
-
			sbuf_finish(messages);
-
			printf("%s", sbuf_data(messages));
-
		}
-
		retcode = 0;
-
		goto cleanup;
-
	}
-

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

modified pkg/upgrade.c
@@ -49,7 +49,6 @@ exec_upgrade(int argc, char **argv)
	struct pkg *pkg = NULL;
	struct pkg_jobs *jobs = NULL;
	const char *reponame = NULL;
-
	char *pkgargs[1];
	int retcode = 1;
	int ch;
	bool yes = false;
@@ -96,34 +95,6 @@ exec_upgrade(int argc, char **argv)
		goto cleanup;
	}

-
	pkgargs[0] = __DECONST(char *,"pkg");
-
	if ((it = pkgdb_query_installs(db, MATCH_EXACT, 1, pkgargs, reponame, false)) != NULL) {
-
		if (pkgdb_it_next(it, &pkg, PKG_LOAD_BASIC|PKG_LOAD_DEPS) == EPKG_OK) {
-
			pkg_jobs_add(jobs, pkg);
-
			pkg = NULL;
-
		}
-
		if (!quiet) {
-
			print_jobs_summary(jobs, PKG_JOBS_INSTALL,
-
			    "An upgrade of pkg as been found it needs to be installed first.\n"
-
			    "After this upgrade it is recommended that you do a full upgrade using:\n"
-
			    " pkg upgrade\n\n");
-
			if (!yes)
-
				pkg_config_bool(PKG_CONFIG_ASSUME_ALWAYS_YES, &yes);
-
			if (!yes)
-
				yes = query_yesno("\nProceed with upgrading [y/N]: ");
-
		}
-
		if (yes)
-
			if (pkg_jobs_apply(jobs, 0) != EPKG_OK)
-
				goto cleanup;
-

-
		if (messages != NULL) {
-
			sbuf_finish(messages);
-
			printf("%s", sbuf_data(messages));
-
		}
-
		retcode = 0;
-
		goto cleanup;
-
	}
-

	if ((it = pkgdb_query_upgrades(db, reponame, all)) == NULL) {
		goto cleanup;
	}