Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Add hashing tree for files and dirs.
Vsevolod Stakhov committed 11 years ago
commit d4a7009bfc99555faebc09030bc580f6c3d3f047
parent 01cd942
2 files changed +23 -1
modified libpkg/pkg_jobs_conflicts.c
@@ -325,6 +325,13 @@ pkg_conflicts_add_from_pkgdb_remote(const char *o1, const char *o2, void *ud)
	}
}

+
static int
+
pkg_conflicts_item_cmp(struct pkg_jobs_conflict_item *a,
+
	struct pkg_jobs_conflict_item *b)
+
{
+
	return (b->hash - a->hash);
+
}
+

static void
pkg_conflicts_check_local_conflict(struct pkg_job_universe_item *it,
	struct pkg_job_universe_item *local, struct pkg_jobs *j)
@@ -357,12 +364,17 @@ pkg_conflicts_append_chain(struct pkg_job_universe_item *it,
{
	struct pkg_job_universe_item *lp = NULL, *cur;

+
	/* Ensure that we have a tree initialized */
+
	if (j->conflict_items.th_cmp == NULL) {
+
		j->conflict_items.th_cmp = pkg_conflicts_item_cmp;
+
	}
+

	/* Find local package */
	cur = it->prev;
	while (cur != it) {
		if (cur->pkg->type == PKG_INSTALLED) {
			lp = cur;
-
			if (pkgdb_ensure_loaded(j->db, PKG_LOAD_FILES|PKG_LOAD_DIRS)
+
			if (pkgdb_ensure_loaded(j->db, cur->pkg, PKG_LOAD_FILES|PKG_LOAD_DIRS)
							!= EPKG_OK)
				return (EPKG_FATAL);

@@ -383,6 +395,8 @@ pkg_conflicts_append_chain(struct pkg_job_universe_item *it,

		cur = cur->prev;
	} while (cur != it);
+

+
	return (EPKG_OK);
}

int
modified libpkg/private/pkg_jobs.h
@@ -35,6 +35,7 @@
#include "private/utils.h"
#include "private/pkg.h"
#include "pkg.h"
+
#include "tree.h"

struct pkg_jobs;
struct job_pattern;
@@ -97,6 +98,12 @@ struct pkg_jobs_universe {
	size_t nitems;
};

+
struct pkg_jobs_conflict_item {
+
	uint64_t hash;
+
	struct pkg_job_universe_item *item;
+
	TREE_ENTRY(pkg_jobs_conflit_item) entry;
+
};
+

struct pkg_jobs {
	struct pkg_jobs_universe *universe;
	struct pkg_job_request	*request_add;
@@ -112,6 +119,7 @@ struct pkg_jobs {
	bool need_fetch;
	const char *reponame;
	const char *destdir;
+
	TREE_HEAD(, pkg_jobs_conflict_item) conflict_items;
	struct job_pattern *patterns;
};