Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Merge pull request #481 from vstakhov/master
Baptiste Daroussin committed 13 years ago
commit 323cc9638701f2c0cacb2f67f58696818a7f53ee
parent dfda7c6
6 files changed +70 -30
modified AUTHORS
@@ -18,5 +18,5 @@ Matthew Seaman <matthew@FreeBSD.org>
Bryan Drewery <bryan@shatow.net>
Eitan Adler <eadler@FreeBSD.org>
Romain Tartière <romain@FreeBSD.org>
-
Vsevolod Stakhov <vsevolod@highsecure.ru>
+
Vsevolod Stakhov <vsevolod@FreeBSD.org>
Alexandre Perrin <alexandre.perrin@netoxygen.ch>
modified libpkg/pkg.h.in
@@ -1126,6 +1126,16 @@ int ports_parse_plist(struct pkg *, char *, const char *);
int pkg_copy_tree(struct pkg *, const char *src, const char *dest);

/**
+
 * Special structure to report about conflicts
+
 */
+
struct pkg_event_conflict {
+
	char *name;
+
	char *origin;
+
	char *version;
+
	struct pkg_event_conflict *next;
+
};
+

+
/**
 * Event type used to report progress or problems.
 */
typedef enum {
@@ -1242,8 +1252,9 @@ struct pkg_event {
		struct {
			const char *pkg_name;
			const char *pkg_version;
+
			const char *pkg_origin;
			const char *pkg_path;
-
			StringList *conflicts;
+
			struct pkg_event_conflict *conflicts;
		} e_integrity_conflict;
	};
};
modified libpkg/pkg_event.c
@@ -60,9 +60,7 @@ pipeevent(struct pkg_event *ev)
	struct sbuf *msg, *buf;
	const char *message;
	const char *name, *version, *newversion;
-
	unsigned int i;
-
	StringList *sl;
-

+
	struct pkg_event_conflict *cur_conflict;
	if (eventpipe < 0)
		return;

@@ -145,19 +143,31 @@ pipeevent(struct pkg_event *ev)
			"\"data\": { "
			"\"pkgname\": \"%s\", "
			"\"pkgversion\": \"%s\", "
+
			"\"pkgorigin\": \"%s\", "
			"\"pkgpath\": \"%s\", "
			"\"conflicts\": [",
			ev->e_integrity_conflict.pkg_name,
			ev->e_integrity_conflict.pkg_version,
+
			ev->e_integrity_conflict.pkg_origin,
			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]);
+
		cur_conflict = ev->e_integrity_conflict.conflicts;
+
		while (cur_conflict != NULL) {
+
			if (cur_conflict->next != NULL) {
+
				sbuf_printf(msg, "{\"name\":\"%s\","
+
						"\"version\":\"%s\","
+
						"\"origin\":\"%s\"},",
+
						cur_conflict->name, cur_conflict->version,
+
						cur_conflict->origin);
			}
			else {
-
				sbuf_printf(msg, "\"%s\"", sl->sl_str[i]);
+
				sbuf_printf(msg, "{\"name\":\"%s\","
+
						"\"version\":\"%s\","
+
						"\"origin\":\"%s\"}",
+
						cur_conflict->name, cur_conflict->version,
+
						cur_conflict->origin);
+
				break;
			}
+
			cur_conflict = cur_conflict->next;
		}
		sbuf_cat(msg, "]}}");
		break;
@@ -499,12 +509,13 @@ pkg_emit_integritycheck_finished(void)

void
pkg_emit_integritycheck_conflict(const char *name, const char *version,
-
		const char *path, StringList *conflicts)
+
		const char *origin, const char *path, struct pkg_event_conflict *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_origin = origin;
	ev.e_integrity_conflict.pkg_path = path;
	ev.e_integrity_conflict.conflicts = conflicts;

modified libpkg/pkgdb.c
@@ -3821,7 +3821,7 @@ pkgdb_integrity_append(struct pkgdb *db, struct pkg *p)
		"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, origin, version from integritycheck where path=?1;";

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

@@ -3842,7 +3842,7 @@ pkgdb_integrity_append(struct pkgdb *db, struct pkg *p)
	while (pkg_files(p, &file) == EPKG_OK) {
		const char	*name, *origin, *version;
		const char	*pkg_path = pkg_file_path(file);
-
		StringList	*conflicts_list = NULL;
+
		struct pkg_event_conflict *conflicts_list = NULL, *cur;

		pkg_get(p, PKG_NAME, &name, PKG_ORIGIN, &origin,
		    PKG_VERSION, &version);
@@ -3862,13 +3862,31 @@ pkgdb_integrity_append(struct pkgdb *db, struct pkg *p)

			sqlite3_bind_text(stmt_conflicts, 1, pkg_path,
			    -1, SQLITE_STATIC);
-
			conflicts_list = sl_init();
+
			cur = conflicts_list;
			while (sqlite3_step(stmt_conflicts) != SQLITE_DONE) {
-
				sl_add(conflicts_list, strdup (sqlite3_column_text(stmt_conflicts, 0)));
+
				if (cur == NULL) {
+
					cur = calloc(1, sizeof (struct pkg_event_conflict));
+
					conflicts_list = cur;
+
				}
+
				else {
+
					cur->next = calloc(1, sizeof (struct pkg_event_conflict));
+
					cur = cur->next;
+
				}
+
				cur->name = strdup(sqlite3_column_text(stmt_conflicts, 0));
+
				cur->origin = strdup(sqlite3_column_text(stmt_conflicts, 1));
+
				cur->version = strdup(sqlite3_column_text(stmt_conflicts, 2));
			}
			sqlite3_finalize(stmt_conflicts);
-
			pkg_emit_integritycheck_conflict(name, version, pkg_path, conflicts_list);
-
			sl_free(conflicts_list, 1);
+
			pkg_emit_integritycheck_conflict(name, version, origin, pkg_path, conflicts_list);
+
			cur = conflicts_list;
+
			while (cur) {
+
				free(cur->name);
+
				free(cur->origin);
+
				free(cur->version);
+
				cur = cur->next;
+
				free(conflicts_list);
+
				conflicts_list = cur;
+
			}
			ret = EPKG_FATAL;
		}
		sqlite3_reset(stmt);
modified libpkg/private/event.h
@@ -45,7 +45,7 @@ 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);
+
		const char *origin, const char *path, struct pkg_event_conflict *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,8 +51,7 @@ event_callback(void *data, struct pkg_event *ev)
	(void) debug;
	const char *name, *version, *newversion;
	const char *filename;
-
	unsigned int i;
-
	StringList *sl;
+
	struct pkg_event_conflict *cur_conflict;

	switch(ev->type) {
	case PKG_EVENT_ERRNO:
@@ -128,18 +127,19 @@ event_callback(void *data, struct pkg_event *ev)
		printf(" done\n");
		break;
	case PKG_EVENT_INTEGRITYCHECK_CONFLICT:
-
		printf("\nConflict found on path %s between %s-%s and ",
+
		printf("\nConflict found on path %s between %s-%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]);
-
			}
+
			ev->e_integrity_conflict.pkg_version,
+
			ev->e_integrity_conflict.pkg_origin);
+
		cur_conflict = ev->e_integrity_conflict.conflicts;
+
		while (cur_conflict) {
+
			if (cur_conflict->next)
+
				printf("%s-%s(%s), ", cur_conflict->name, cur_conflict->version, cur_conflict->origin);
+
			else
+
				printf("%s-%s(%s)", cur_conflict->name, cur_conflict->version, cur_conflict->origin);
+

+
			cur_conflict = cur_conflict->next;
		}
		printf("\n");
		break;