Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
install and upgrade are now ordered during the query, not in pkg_jobs
Baptiste Daroussin committed 14 years ago
commit cd4d3aebf663c4442f77ab684d133ab80cded08a
parent f41192a
2 files changed +2 -151
modified libpkg/pkg_jobs.c
@@ -48,7 +48,6 @@ pkg_jobs_add(struct pkg_jobs *j, struct pkg *pkg)
{
	assert(j != NULL);
	assert(pkg != NULL);
-
	assert(j->resolved != 1);

	STAILQ_INSERT_TAIL(&j->jobs, pkg, next);

@@ -60,8 +59,6 @@ pkg_jobs_is_empty(struct pkg_jobs *j)
{
	assert(j != NULL);

-
	pkg_jobs_resolv(j);
-

	return (STAILQ_EMPTY(&j->jobs));
}

@@ -70,8 +67,6 @@ pkg_jobs(struct pkg_jobs *j, struct pkg **pkg)
{
	assert(j != NULL);

-
	pkg_jobs_resolv(j);
-

	if (*pkg == NULL)
		*pkg = STAILQ_FIRST(&j->jobs);
	else
@@ -166,147 +161,3 @@ pkg_jobs_apply(struct pkg_jobs *j, int force)
	pkg_emit_error("bad jobs argument");
	return (EPKG_FATAL);
}
-

-
static struct pkg_jobs_node *
-
get_node(struct pkg_jobs *j, const char *name, int create)
-
{
-
	struct pkg_jobs_node *n;
-

-
	/* XXX hashmap? */
-
	LIST_FOREACH(n, &j->nodes, entries) {
-
		if (strcmp(name, pkg_get(n->pkg, PKG_ORIGIN)) == 0) {
-
			return (n);
-
		}
-
	}
-

-
	if (create == 0)
-
		return (NULL);
-

-
	if ((n = calloc(1, sizeof(struct pkg_jobs_node))) == NULL) {
-
		pkg_emit_errno("calloc", "pkg_jobs_node");
-
		return (NULL);
-
	}
-

-
	LIST_INSERT_HEAD(&j->nodes, n, entries);
-
	return (n);
-
}
-

-
static void
-
add_parent(struct pkg_jobs_node *n, struct pkg_jobs_node *p)
-
{
-
		p->nrefs++;
-

-
		if (n->parents_len == n->parents_cap) {
-
			if (n->parents_cap == 0)
-
				n->parents_cap = 5;
-
			else
-
				n->parents_cap *= 2;
-
			if ((n->parents = reallocf(n->parents,
-
					n->parents_cap * sizeof(struct pkg_jobs_node))) == NULL) {
-
					pkg_emit_errno("realloc", "pkg_jobs_node");
-
					return;
-
			}
-
		}
-
		n->parents[n->parents_len] = p;
-
		n->parents_len++;
-
}
-

-
static void
-
add_dep(struct pkg_jobs *j, struct pkg_jobs_node *n)
-
{
-
	struct pkg_dep *dep = NULL;
-
	struct pkg_jobs_node *ndep;
-

-
	pkgdb_load_deps(j->db, n->pkg);
-

-
	while (pkg_deps(n->pkg, &dep) == EPKG_OK) {
-
		ndep = get_node(j, pkg_dep_origin(dep), 0);
-
		if (ndep != NULL)
-
			add_parent(ndep, n);
-
	}
-
}
-

-
static void
-
add_rdep(struct pkg_jobs *j, struct pkg_jobs_node *n)
-
{
-
	struct pkg_jobs_node *nrdep;
-
	struct pkg_dep *rdep = NULL;
-

-
	pkgdb_load_rdeps(j->db, n->pkg);
-

-
	while (pkg_rdeps(n->pkg, &rdep) == EPKG_OK) {
-
		nrdep = get_node(j, pkg_dep_origin(rdep), 0);
-
		if (nrdep != NULL)
-
			add_parent(nrdep, n);
-
	}
-
}
-

-
static void
-
remove_node(struct pkg_jobs *j, struct pkg_jobs_node *n)
-
{
-
	struct pkg_jobs_node *np;
-
	size_t i;
-

-
	assert(n->nrefs == 0);
-

-
	STAILQ_INSERT_TAIL(&j->jobs, n->pkg, next);
-

-
	LIST_REMOVE(n, entries);
-

-
	for (i = 0; i < n->parents_len; i++) {
-
		np = n->parents[i];
-
		np->nrefs--;
-
	}
-
	free(n->parents);
-
	free(n);
-
}
-

-
int
-
pkg_jobs_resolv(struct pkg_jobs *j)
-
{
-
	struct pkg_jobs_node *n, *tmp;
-
	struct pkg *p;
-

-
	assert(j != NULL);
-

-
	if (j->resolved == 1)
-
		return (EPKG_OK);
-

-
	if (j->type == PKG_JOBS_DEINSTALL) {
-
		j->resolved = 1;
-
		return (EPKG_OK);
-
	}
-

-
	/* Create nodes and remove jobs form the queue */
-
	while (!STAILQ_EMPTY(&j->jobs)) {
-
		p = STAILQ_FIRST(&j->jobs);
-
		STAILQ_REMOVE_HEAD(&j->jobs, next);
-

-
		n = get_node(j, pkg_get(p, PKG_ORIGIN), 1);
-

-
		if (n->pkg == NULL)
-
			n->pkg = p;
-
		else
-
			pkg_free(p);
-
	}
-

-
	/* Add dependencies into nodes */
-
	LIST_FOREACH(n, &j->nodes, entries) {
-
		if (j->type == PKG_JOBS_DEINSTALL)
-
			add_rdep(j, n);
-
		else
-
			add_dep(j, n);
-
	}
-

-
	/* Resolv !*/
-
	do {
-
		LIST_FOREACH_SAFE(n, &j->nodes, entries, tmp) {
-
			if (n->nrefs == 0)
-
				remove_node(j, n);
-
		}
-
	} while (!LIST_EMPTY(&j->nodes));
-

-
	j->resolved = 1;
-

-
	return (EPKG_OK);
-
}
modified libpkg/pkgdb.c
@@ -1812,7 +1812,7 @@ pkgdb_query_installs(struct pkgdb *db, match_t match, int nbpkgs, char **pkgs)
	const char finalsql[] = "select pkgid as id, origin, name, version, "
		"comment, desc, message, arch, osversion, maintainer, "
		"www, prefix, flatsize, newversion, newflatsize, pkgsize, "
-
		"cksum, repopath, automatic FROM pkgjobs;";
+
		"cksum, repopath, automatic, (select count(*) from remote.deps as d where d.origin = pkgjobs.origin) as weight FROM pkgjobs order by weight DESC;";

	assert(db != NULL);

@@ -1917,7 +1917,7 @@ pkgdb_query_upgrades(struct pkgdb *db)
	const char sql[] = "select pkgid as id, origin, name, version, "
		"comment, desc, message, arch, osversion, maintainer, "
		"www, prefix, flatsize, newversion, newflatsize, pkgsize, "
-
		"cksum, repopath, automatic FROM pkgjobs;";
+
		"cksum, repopath, automatic, (select count(*) from remote.deps as d where d.origin = pkgjobs.origin) as weight FROM pkgjobs order by weight DESC;";

	create_temporary_pkgjobs(db->sqlite);