Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Merge pull request #479 from vstakhov/master
Baptiste Daroussin committed 13 years ago
commit 5590d0e303c4b0f818834e662888729ee86bce4a
parent 1e0d7c5
9 files changed +88 -21
modified libpkg/pkg.h.in
@@ -36,6 +36,7 @@
#include <stdarg.h>
#include <stdbool.h>
#include <sys/sbuf.h>
+
#include <stringlist.h>
#include <openssl/pem.h>

/* The expected name of the pkg(1) binary executable. */
@@ -299,6 +300,7 @@ typedef enum _pkg_flags {
	PKG_FLAG_NOSCRIPT = (1U << 5),
	PKG_FLAG_PKG_VERSION_TEST = (1U << 6),
	PKG_FLAG_UPGRADES_FOR_INSTALLED = (1U << 7),
+
	PKG_FLAG_SKIP_INSTALL = (1U << 8)
} pkg_flags;

typedef enum _pkg_config_key {
@@ -1136,6 +1138,7 @@ typedef enum {
	PKG_EVENT_FETCHING,
	PKG_EVENT_INTEGRITYCHECK_BEGIN,
	PKG_EVENT_INTEGRITYCHECK_FINISHED,
+
	PKG_EVENT_INTEGRITYCHECK_CONFLICT,
	PKG_EVENT_NEWPKGVERSION,
	PKG_EVENT_NOTICE,
	/* errors */
@@ -1235,6 +1238,12 @@ struct pkg_event {
		struct {
			const char *pkg_name;
		} e_not_found;
+
		struct {
+
			const char *pkg_name;
+
			const char *pkg_version;
+
			const char *pkg_path;
+
			StringList *conflicts;
+
		} e_integrity_conflict;
	};
};

modified libpkg/pkg_event.c
@@ -60,6 +60,8 @@ pipeevent(struct pkg_event *ev)
	struct sbuf *msg, *buf;
	const char *message;
	const char *name, *version, *newversion;
+
	unsigned int i;
+
	StringList *sl;

	if (eventpipe < 0)
		return;
@@ -138,6 +140,27 @@ pipeevent(struct pkg_event *ev)
		sbuf_printf(msg, "{ \"type\": \"INFO_INTEGRITYCHECK_BEGIN\", "
		    "\"data\": {}}");
		break;
+
	case PKG_EVENT_INTEGRITYCHECK_CONFLICT:
+
		sbuf_printf(msg, "{ \"type\": \"INFO_INTEGRITYCHECK_CONFLICT\","
+
			"\"data\": { "
+
			"\"pkgname\": \"%s\", "
+
			"\"pkgversion\": \"%s\", "
+
			"\"pkgpath\": \"%s\", "
+
			"\"conflicts\": [",
+
			ev->e_integrity_conflict.pkg_name,
+
			ev->e_integrity_conflict.pkg_version,
+
			ev->e_integrity_conflict.pkg_path);
+
		sl = ev->e_integrity_conflict.conflicts;
+
		for (i = 0; i < sl->sl_cur; i ++) {
+
			if (i != sl->sl_cur - 1) {
+
				sbuf_printf(msg, "\"%s\",", sl->sl_str[i]);
+
			}
+
			else {
+
				sbuf_printf(msg, "\"%s\"", sl->sl_str[i]);
+
			}
+
		}
+
		sbuf_cat(msg, "]}}");
+
		break;
	case PKG_EVENT_INTEGRITYCHECK_FINISHED:
		sbuf_printf(msg, "{ \"type\": \"INFO_INTEGRITYCHECK_FINISHED\", "
		    "\"data\": {}}");
@@ -347,7 +370,7 @@ pkg_emit_error(const char *fmt, ...)

	ev.type = PKG_EVENT_ERROR;

-
	va_start(ap, fmt);
+
	va_start(ap, fmt);pkg_emit_event(&ev);
	vasprintf(&ev.e_pkg_error.msg, fmt, ap);
	va_end(ap);

@@ -474,6 +497,20 @@ pkg_emit_integritycheck_finished(void)
}

void
+
pkg_emit_integritycheck_conflict(const char *name, const char *version,
+
		const char *path, StringList *conflicts)
+
{
+
	struct pkg_event ev;
+
	ev.type = PKG_EVENT_INTEGRITYCHECK_CONFLICT;
+
	ev.e_integrity_conflict.pkg_name = name;
+
	ev.e_integrity_conflict.pkg_version = version;
+
	ev.e_integrity_conflict.pkg_path = path;
+
	ev.e_integrity_conflict.conflicts = conflicts;
+

+
	pkg_emit_event(&ev);
+
}
+

+
void
pkg_emit_deinstall_begin(struct pkg *p)
{
	struct pkg_event ev;
modified libpkg/pkg_jobs.c
@@ -378,6 +378,9 @@ pkg_jobs_install(struct pkg_jobs *j)
	if (pkg_jobs_fetch(j) != EPKG_OK)
		return (EPKG_FATAL);

+
	if (j->flags & PKG_FLAG_SKIP_INSTALL)
+
		return (EPKG_OK);
+

	if (pkg_config_string(PKG_CONFIG_CACHEDIR, &cachedir) != EPKG_OK)
		return (EPKG_FATAL);
	
modified libpkg/pkgdb.c
@@ -3815,13 +3815,13 @@ pkgdb_integrity_append(struct pkgdb *db, struct pkg *p)
	sqlite3_stmt	*stmt = NULL;
	sqlite3_stmt	*stmt_conflicts = NULL;
	struct pkg_file	*file = NULL;
-
	struct sbuf	*conflictmsg = NULL;
+


	const char	 sql[] = ""
		"INSERT INTO integritycheck (name, origin, version, path)"
		"values (?1, ?2, ?3, ?4);";
	const char	 sql_conflicts[] = ""
-
		"SELECT name, version from integritycheck where path=?1;";
+
		"SELECT name || '-' || version from integritycheck where path=?1;";

	assert(db != NULL && p != NULL);

@@ -3838,11 +3838,11 @@ pkgdb_integrity_append(struct pkgdb *db, struct pkg *p)
		return (EPKG_FATAL);
	}

-
	conflictmsg = sbuf_new_auto();

	while (pkg_files(p, &file) == EPKG_OK) {
		const char	*name, *origin, *version;
		const char	*pkg_path = pkg_file_path(file);
+
		StringList	*conflicts_list = NULL;

		pkg_get(p, PKG_NAME, &name, PKG_ORIGIN, &origin,
		    PKG_VERSION, &version);
@@ -3852,36 +3852,28 @@ pkgdb_integrity_append(struct pkgdb *db, struct pkg *p)
		sqlite3_bind_text(stmt, 4, pkg_path, -1, SQLITE_STATIC);

		if (sqlite3_step(stmt) != SQLITE_DONE) {
-
			sbuf_clear(conflictmsg);
-
			sbuf_printf(conflictmsg,
-
			    "WARNING: %s-%s conflict on %s with: \n", name,
-
			    version, pkg_path);

			if (sqlite3_prepare_v2(db->sqlite, sql_conflicts,
			    -1, &stmt_conflicts, NULL) != SQLITE_OK) {
				ERROR_SQLITE(db->sqlite);
				sqlite3_finalize(stmt);
-
				sbuf_delete(conflictmsg);
				return (EPKG_FATAL);
			}

			sqlite3_bind_text(stmt_conflicts, 1, pkg_path,
			    -1, SQLITE_STATIC);
-

+
			conflicts_list = sl_init();
			while (sqlite3_step(stmt_conflicts) != SQLITE_DONE) {
-
				sbuf_printf(conflictmsg, "\t- %s-%s\n",
-
				    sqlite3_column_text(stmt_conflicts, 0),
-
				    sqlite3_column_text(stmt_conflicts, 1));
+
				sl_add(conflicts_list, strdup (sqlite3_column_text(stmt_conflicts, 0)));
			}
			sqlite3_finalize(stmt_conflicts);
-
			sbuf_finish(conflictmsg);
-
			pkg_emit_error("%s", sbuf_get(conflictmsg));
+
			pkg_emit_integritycheck_conflict(name, version, pkg_path, conflicts_list);
+
			sl_free(conflicts_list, 1);
			ret = EPKG_FATAL;
		}
		sqlite3_reset(stmt);
	}
	sqlite3_finalize(stmt);
-
	sbuf_delete(conflictmsg);

	return (ret);
}
modified libpkg/private/event.h
@@ -44,6 +44,8 @@ void pkg_emit_locked(struct pkg *p);
void pkg_emit_required(struct pkg *p, int force);
void pkg_emit_integritycheck_begin(void);
void pkg_emit_integritycheck_finished(void);
+
void pkg_emit_integritycheck_conflict(const char *name, const char *version,
+
		const char *path, StringList *conflicts);
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);
modified pkg/event.c
@@ -51,6 +51,8 @@ event_callback(void *data, struct pkg_event *ev)
	(void) debug;
	const char *name, *version, *newversion;
	const char *filename;
+
	unsigned int i;
+
	StringList *sl;

	switch(ev->type) {
	case PKG_EVENT_ERRNO:
@@ -125,6 +127,22 @@ event_callback(void *data, struct pkg_event *ev)
			break;
		printf(" done\n");
		break;
+
	case PKG_EVENT_INTEGRITYCHECK_CONFLICT:
+
		printf("\nConflict found on path %s between %s-%s and ",
+
			ev->e_integrity_conflict.pkg_path,
+
			ev->e_integrity_conflict.pkg_name,
+
			ev->e_integrity_conflict.pkg_version);
+
		sl = ev->e_integrity_conflict.conflicts;
+
		for (i = 0; i < sl->sl_cur; i ++) {
+
			if (i != sl->sl_cur - 1) {
+
				printf("%s, ", sl->sl_str[i]);
+
			}
+
			else {
+
				printf("%s", sl->sl_str[i]);
+
			}
+
		}
+
		printf("\n");
+
		break;
	case PKG_EVENT_DEINSTALL_BEGIN:
		if (quiet)
			break;
modified pkg/pkg-upgrade.8
@@ -23,7 +23,7 @@
.Nd performs upgrades of package software distributions
.Sh SYNOPSIS
.Nm
-
.Op Fl fInqUy
+
.Op Fl fInFqUy
.Op Fl r Ar reponame
.Sh DESCRIPTION
.Nm
@@ -67,6 +67,9 @@ any upgrades.
Repository catalogues will be updated as usual unless the
.Fl U
option is also given.
+
.It Fl F
+
Do not perform installation of packages, just fetch packages that should be 
+
upgraded and detect possible conflicts.
.It Fl q
Force quiet output, except when
.Fl n
modified pkg/update.c
@@ -114,7 +114,7 @@ usage_update(void)
}

int
-
exec_update(__unused int argc, __unused char **argv)
+
exec_update(int argc, char **argv)
{
	int ret;
	int ch;
modified pkg/upgrade.c
@@ -44,11 +44,11 @@ usage_upgrade(void)
}

int
-
exec_upgrade(__unused int argc, __unused char **argv)
+
exec_upgrade(int argc, char **argv)
{
	struct pkgdb *db = NULL;
	struct pkg_jobs *jobs = NULL;
-
	const char __unused *reponame = NULL;
+
	const char *reponame = NULL;
	int retcode;
	int updcode;
	int ch;
@@ -62,7 +62,7 @@ exec_upgrade(__unused int argc, __unused char **argv)
	pkg_config_bool(PKG_CONFIG_REPO_AUTOUPDATE, &auto_update);


-
	while ((ch = getopt(argc, argv, "fLnqr:Uy")) != -1) {
+
	while ((ch = getopt(argc, argv, "fLnqFr:Uy")) != -1) {
		switch (ch) {
		case 'f':
			f |= PKG_FLAG_FORCE;
@@ -80,6 +80,9 @@ exec_upgrade(__unused int argc, __unused char **argv)
			f |= PKG_FLAG_DRY_RUN;
			dry_run = true;
			break;
+
		case 'F':
+
			f |= PKG_FLAG_SKIP_INSTALL;
+
			break;
		case 'q':
			quiet = true;
			break;