Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Fix CUDF integration.
Vsevolod Stakhov committed 12 years ago
commit 7d8cb27d49dfa58ccd4a73243d875b995403e1a0
parent 9cb4bca
3 files changed +93 -34
modified libpkg/pkg_cudf.c
@@ -91,14 +91,40 @@ cudf_print_element(FILE *f, const char *line, bool has_next, int *column)
	return (ret);
}

+
static inline int
+
cudf_print_conflict(FILE *f, const char *origin, int ver, bool has_next, int *column)
+
{
+
	int ret = 0;
+
	if (*column > 80) {
+
		*column = 0;
+
		ret += fprintf(f, "\n ");
+
	}
+

+
	ret += cudf_print_package_name(f, origin);
+
	ret += fprintf(f, "=%d", ver);
+

+
	if (has_next)
+
		ret += fprintf(f, ", ");
+
	else
+
		ret += fprintf(f, "\n");
+

+
	if (ret > 0)
+
		*column += ret;
+

+
	return (ret);
+
}
+

+

static int
-
cudf_emit_pkg(struct pkg *pkg, int version, FILE *f)
+
cudf_emit_pkg(struct pkg *pkg, int version, FILE *f,
+
		struct pkg_job_universe_item *conflicts_chain)
{
	const char *origin;
	struct pkg_dep *dep, *dtmp;
	struct pkg_provide *prov, *ptmp;
	struct pkg_conflict *conflict, *ctmp;
-
	int column = 0;
+
	struct pkg_job_universe_item *u;
+
	int column = 0, ver;

	pkg_get(pkg, PKG_ORIGIN, &origin);
	if (fprintf(f, "package: ") < 0)
@@ -134,7 +160,7 @@ cudf_emit_pkg(struct pkg *pkg, int version, FILE *f)
	}

	column = 0;
-
	if (HASH_COUNT(pkg->conflicts) > 0) {
+
	if (HASH_COUNT(pkg->conflicts) > 0 || conflicts_chain->next != NULL) {
		if (fprintf(f, "conflicts: ") < 0)
			return (EPKG_FATAL);
		HASH_ITER(hh, pkg->conflicts, conflict, ctmp) {
@@ -143,6 +169,16 @@ cudf_emit_pkg(struct pkg *pkg, int version, FILE *f)
				return (EPKG_FATAL);
			}
		}
+
		ver = 1;
+
		LL_FOREACH(conflicts_chain, u) {
+
			if (u->pkg != pkg) {
+
				if (cudf_print_conflict(f, origin, ver,
+
						(u->next != NULL && u->next->pkg != pkg), &column) < 0) {
+
					return (EPKG_FATAL);
+
				}
+
			}
+
			ver ++;
+
		}
	}

	if (fprintf(f, "installed: %s\n\n", pkg->type == PKG_INSTALLED ?
@@ -221,11 +257,12 @@ pkg_jobs_cudf_emit_file(struct pkg_jobs *j, pkg_jobs_t t, FILE *f)
		return (EPKG_FATAL);

	HASH_ITER(hh, j->universe, it, itmp) {
-
		LL_SORT(it, pkg_cudf_version_cmp);
+
		DL_SORT(it, pkg_cudf_version_cmp);
+

		version = 1;
		LL_FOREACH(it, icur) {
			pkg = icur->pkg;
-
			if (cudf_emit_pkg(pkg, version++, f) != EPKG_OK)
+
			if (cudf_emit_pkg(pkg, version++, f, it) != EPKG_OK)
				return (EPKG_FATAL);
		}
	}
@@ -278,7 +315,8 @@ cudf_strdup(const char *in)
}

static void
-
pkg_jobs_cudf_insert_res_job (struct pkg_solved **target, struct pkg_job_universe_item *it)
+
pkg_jobs_cudf_insert_res_job (struct pkg_solved **target, struct pkg_job_universe_item *it_new,
+
		struct pkg_job_universe_item *it_old)
{
	struct pkg_solved *res;

@@ -287,8 +325,12 @@ pkg_jobs_cudf_insert_res_job (struct pkg_solved **target, struct pkg_job_univers
		pkg_emit_errno("calloc", "pkg_solved");
		return;
	}
-
	res->priority = it->priority;
-
	res->pkg[0] = it->pkg;
+
	res->priority = it_new->priority;
+
	res->pkg[0] = it_new->pkg;
+
	if (it_old != NULL) {
+
		res->pkg[1] = it_old->pkg;
+
		res->priority = MAX(it_old->priority, res->priority);
+
	}
	DL_APPEND(*target, res);
}

@@ -302,9 +344,9 @@ struct pkg_cudf_entry {
static int
pkg_jobs_cudf_add_package(struct pkg_jobs *j, struct pkg_cudf_entry *entry)
{
-
	struct pkg_job_universe_item *it, *cur, *selected = NULL;
+
	struct pkg_job_universe_item *it, *cur, *selected = NULL, *old = NULL, *head;
	const char *origin;
-
	int ver;
+
	int ver, n;

	HASH_FIND(hh, j->universe, entry->origin, strlen(entry->origin), it);
	if (it == NULL) {
@@ -319,11 +361,20 @@ pkg_jobs_cudf_add_package(struct pkg_jobs *j, struct pkg_cudf_entry *entry)
	 */
	ver = strtoul(entry->version, NULL, 10);

-
	LL_FOREACH(it, cur) {
-
		if (--ver == 0) {
+
	/* Find the old head */
+
	cur = it;
+
	do {
+
		head = cur;
+
		cur = cur->prev;
+
	} while (cur != it);
+

+
	n = 1;
+
	LL_FOREACH(head, cur) {
+
		if (n == ver) {
			selected = cur;
			break;
		}
+
		n ++;
	}

	if (selected == NULL) {
@@ -332,13 +383,25 @@ pkg_jobs_cudf_add_package(struct pkg_jobs *j, struct pkg_cudf_entry *entry)
	}

	pkg_get(selected->pkg, PKG_ORIGIN, &origin);
-
	/* XXX: handle forced versions here including reinstall */
-
	if (entry->installed && selected->pkg->type != PKG_INSTALLED) {
-
		pkg_jobs_cudf_insert_res_job (&j->jobs_add, selected);
-
		j->count ++;
+
	if (ver == 1) {
+
		if (entry->installed && selected->pkg->type != PKG_INSTALLED) {
+
			pkg_jobs_cudf_insert_res_job (&j->jobs_add, selected, NULL);
+
			j->count ++;
+
		}
+
		else if (!entry->installed && selected->pkg->type == PKG_INSTALLED) {
+
			pkg_jobs_cudf_insert_res_job (&j->jobs_delete, selected, NULL);
+
			j->count ++;
+
		}
	}
-
	else if (!entry->installed && selected->pkg->type == PKG_INSTALLED) {
-
		pkg_jobs_cudf_insert_res_job (&j->jobs_delete, selected);
+
	else {
+
		/* Define upgrade */
+
		LL_FOREACH(head, cur) {
+
			if (cur != selected) {
+
				old = cur;
+
				break;
+
			}
+
		}
+
		pkg_jobs_cudf_insert_res_job (&j->jobs_upgrade, selected, old);
		j->count ++;
	}

modified libpkg/pkg_jobs.c
@@ -248,7 +248,7 @@ pkg_jobs_handle_pkg_universe(struct pkg_jobs *j, struct pkg *pkg, int priority)
	seen->pkg = pkg;
	HASH_ADD_KEYPTR(hh, j->seen, seen->digest, strlen(seen->digest), seen);

-
	HASH_FIND_STR(j->universe, __DECONST(char *, origin), item);
+
	HASH_FIND_STR(j->universe, origin, item);
	if (item == NULL) {
		/* Insert new origin */
		item = calloc(1, sizeof (struct pkg_job_universe_item));
@@ -259,7 +259,8 @@ pkg_jobs_handle_pkg_universe(struct pkg_jobs *j, struct pkg *pkg, int priority)
		}
		item->pkg = pkg;
		item->priority = priority;
-
		HASH_ADD_KEYPTR(hh, j->universe, __DECONST(char *, origin), strlen(origin), item);
+
		item->prev = item;
+
		HASH_ADD_KEYPTR(hh, j->universe, origin, strlen(origin), item);
		j->total++;
		return (EPKG_OK);
	}
@@ -292,8 +293,8 @@ pkg_jobs_handle_pkg_universe(struct pkg_jobs *j, struct pkg *pkg, int priority)
			priority, name, version);
	item->pkg = pkg;
	item->priority = priority;
-
	if (tmp != NULL)
-
		tmp->next = item;
+

+
	DL_APPEND(tmp, item);

	j->total++;

@@ -479,6 +480,8 @@ jobs_solve_upgrade(struct pkg_jobs *j)
	struct pkg *pkg = NULL;
	struct pkgdb_it *it;
	char *origin;
+
	unsigned flags = PKG_LOAD_BASIC|PKG_LOAD_OPTIONS|PKG_LOAD_DEPS|
+
			PKG_LOAD_SHLIBS_REQUIRED|PKG_LOAD_ANNOTATIONS|PKG_LOAD_CONFLICTS;

	if ((j->flags & PKG_FLAG_PKG_VERSION_TEST) == PKG_FLAG_PKG_VERSION_TEST)
		if (new_pkg_version(j)) {
@@ -489,7 +492,7 @@ jobs_solve_upgrade(struct pkg_jobs *j)
	if ((it = pkgdb_query(j->db, NULL, MATCH_ALL)) == NULL)
		return (EPKG_FATAL);

-
	while (pkgdb_it_next(it, &pkg, PKG_LOAD_BASIC) == EPKG_OK) {
+
	while (pkgdb_it_next(it, &pkg, flags) == EPKG_OK) {
		/* TODO: use repository priority here */
		pkg_jobs_add_universe(j, pkg, 0, true);
		if(pkg_is_locked(pkg)) {
@@ -561,7 +564,7 @@ find_remote_pkg(struct pkg_jobs *j, const char *pattern, match_t m, bool root, i
	const char *buf1, *buf2;
	bool force = false, seen = false;
	int rc = EPKG_FATAL;
-
	unsigned flags = PKG_LOAD_BASIC|PKG_LOAD_OPTIONS|
+
	unsigned flags = PKG_LOAD_BASIC|PKG_LOAD_OPTIONS|PKG_LOAD_DEPS|
			PKG_LOAD_SHLIBS_REQUIRED|PKG_LOAD_ANNOTATIONS|PKG_LOAD_CONFLICTS;

	if (root && (j->flags & PKG_FLAG_FORCE) == PKG_FLAG_FORCE)
@@ -574,15 +577,6 @@ find_remote_pkg(struct pkg_jobs *j, const char *pattern, match_t m, bool root, i
	if (j->type == PKG_JOBS_UPGRADE && (j->flags & PKG_FLAG_FORCE) == PKG_FLAG_FORCE)
		force = true;

-
	if (j->type == PKG_JOBS_FETCH) {
-
		if ((j->flags & PKG_FLAG_WITH_DEPS) == PKG_FLAG_WITH_DEPS)
-
			flags |= PKG_LOAD_DEPS;
-
		if ((j->flags & PKG_FLAG_UPGRADES_FOR_INSTALLED) == PKG_FLAG_UPGRADES_FOR_INSTALLED)
-
			flags |= PKG_LOAD_DEPS;
-
	} else {
-
		flags |= PKG_LOAD_DEPS;
-
	}
-

	if ((it = pkgdb_rquery(j->db, pattern, m, j->reponame)) == NULL)
		return (rc);

@@ -1119,6 +1113,8 @@ pkg_jobs_handle_install(struct pkg *new, struct pkg *old, struct pkg_jobs *j, bo
				PKG_AUTOMATIC, &automatic);
	if (old != NULL)
		pkg_get(old, PKG_VERSION, &oldversion);
+
	else
+
		pkg_get(new, PKG_OLD_VERSION, &oldversion);

	an = pkg_annotation_lookup(new, "repository");

modified libpkg/private/pkg.h
@@ -219,7 +219,7 @@ struct pkg_job_universe_item {
	struct pkg *pkg;
	UT_hash_handle hh;
	int priority;
-
	struct pkg_job_universe_item *next;
+
	struct pkg_job_universe_item *next, *prev;
};

struct pkg_jobs {