Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Separate upgrade task from install and delete.
Vsevolod Stakhov committed 12 years ago
commit c523ba1247b4583c2c1e678e6515167f1bba211e
parent f511eb5
5 files changed +84 -72
modified libpkg/pkg.h.in
@@ -1182,6 +1182,7 @@ int pkg_jobs_count(struct pkg_jobs *jobs);
 */
struct pkg * pkg_jobs_add_iter(struct pkg_jobs *jobs, void **iter);
struct pkg * pkg_jobs_delete_iter(struct pkg_jobs *jobs, void **iter);
+
struct pkg * pkg_jobs_upgrade_iter(struct pkg_jobs *jobs, void **iter);

/**
 * Apply the jobs in the queue (fetch and install).
modified libpkg/pkg_jobs.c
@@ -3,7 +3,7 @@
 * Copyright (c) 2011-2012 Julien Laffaye <jlaffaye@FreeBSD.org>
 * Copyright (c) 2011-2012 Marin Atanasov Nikolov <dnaeon@gmail.com>
 * Copyright (c) 2013 Matthew Seaman <matthew@FreeBSD.org>
-
 * Copyright (c) 2013 Vsevolod Stakhov <vsevolod@FreeBSD.org>
+
 * Copyright (c) 2013-2014 Vsevolod Stakhov <vsevolod@FreeBSD.org>
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
@@ -123,6 +123,7 @@ pkg_jobs_free(struct pkg_jobs *j)
	LL_FREE(j->patterns, job_pattern, free);
	LL_FREE(j->jobs_add, pkg_solved, free);
	LL_FREE(j->jobs_delete, pkg_solved, free);
+
	LL_FREE(j->jobs_upgrade, pkg_solved, free);

	free(j);
}
@@ -156,61 +157,35 @@ pkg_jobs_add(struct pkg_jobs *j, match_t match, char **argv, int argc)
	return (EPKG_OK);
}

-
struct pkg *
-
pkg_jobs_add_iter(struct pkg_jobs *jobs, void **iter)
-
{
-
	struct pkg_solved *s;
-
	struct pkg *res;
-
	assert(iter != NULL);
-

-
	if (jobs->jobs_add == NULL) {
-
		return NULL;
-
	}
-

-
	if (*iter == NULL) {
-
		s = jobs->jobs_add;
-
	}
-
	else if (*iter == jobs->jobs_add) {
-
		return (NULL);
-
	}
-
	else {
-
		s = *iter;
-
	}
-

-
	res = s->pkg;
-

-
	*iter = s->next ? s->next : jobs->jobs_add;
-

-
	return (res);
-
}
-

-
struct pkg *
-
pkg_jobs_delete_iter(struct pkg_jobs *jobs, void **iter)
-
{
-
	struct pkg_solved *s;
-
	struct pkg *res;
-
	assert(iter != NULL);
-

-
	if (jobs->jobs_delete == NULL) {
-
		return NULL;
-
	}
-

-
	if (*iter == NULL) {
-
		s = jobs->jobs_delete;
-
	}
-
	else if (*iter == jobs->jobs_delete) {
-
		return (NULL);
-
	}
-
	else {
-
		s = *iter;
-
	}
-

-
	res = s->pkg;
-

-
	*iter = s->next ? s->next : jobs->jobs_delete;
-

-
	return (res);
-
}
+
#define MAKE_JOBS_ITER_FUNC(type)											\
+
    struct pkg *															\
+
    pkg_jobs_##type##_iter(struct pkg_jobs *jobs, void **iter)				\
+
    {																		\
+
    	struct pkg_solved *s;												\
+
    	struct pkg *res;													\
+
    	assert(iter != NULL);												\
+
    	if (jobs->jobs_##type == NULL) {									\
+
    		return (NULL);													\
+
    	}																	\
+
    	if (*iter == NULL) {												\
+
    		s = jobs->jobs_##type;											\
+
    	}																	\
+
    	else if (*iter == jobs->jobs_##type) {								\
+
    		return (NULL);													\
+
    	}																	\
+
    	else {																\
+
    		s = *iter;														\
+
    	}																	\
+
    	res = s->pkg;														\
+
    	*iter = s->next ? s->next : jobs->jobs_##type;						\
+
    	return (res);														\
+
    }
+

+
MAKE_JOBS_ITER_FUNC(add)
+
MAKE_JOBS_ITER_FUNC(delete)
+
MAKE_JOBS_ITER_FUNC(upgrade)
+

+
#undef MAKE_JOBS_ITER_FUNC

static void
pkg_jobs_add_req(struct pkg_jobs *j, const char *origin, struct pkg *pkg, bool add, int priority)
@@ -1176,6 +1151,7 @@ pkg_jobs_solve(struct pkg_jobs *j)
	/* Resort priorities */
	if (j->solved) {
		DL_SORT(j->jobs_add, jobs_sort_priority_inc);
+
		DL_SORT(j->jobs_upgrade, jobs_sort_priority_inc);
		DL_SORT(j->jobs_delete, jobs_sort_priority_dec);
	}

modified libpkg/pkg_solve.c
@@ -695,18 +695,54 @@ pkg_solve_dimacs_export(struct pkg_solve_problem *problem, FILE *f)
}

static void
-
pkg_solve_insert_res_job (struct pkg_solved **target, struct pkg_solve_variable *var)
+
pkg_solve_insert_res_job (struct pkg_solve_variable *var,
+
		struct pkg_solve_problem *problem, struct pkg_jobs *j)
{
	struct pkg_solved *res;
+
	struct pkg_solve_variable *cur_var, *del_var = NULL, *add_var = NULL;
+
	int seen_add = 0, seen_del = 0;

-
	res = calloc(1, sizeof(struct pkg_solved));
-
	if (res == NULL) {
-
		pkg_emit_errno("calloc", "pkg_solved");
+
	LL_FOREACH(var, cur_var) {
+
		if (cur_var->to_install && cur_var->pkg->type != PKG_INSTALLED) {
+
			add_var = cur_var;
+
			seen_add ++;
+
		}
+
		else if (!var->to_install && var->pkg->type == PKG_INSTALLED) {
+
			del_var = cur_var;
+
			seen_del ++;
+
		}
+
	}
+
	if (seen_add > 1 || seen_del > 1) {
+
		pkg_emit_error("internal solver error: more than two packages to install from the same origin");
		return;
	}
-
	res->priority = var->priority;
-
	res->pkg = var->pkg;
-
	DL_APPEND(*target, res);
+
	else if (seen_add != 0 || seen_del != 0) {
+
		res = calloc(1, sizeof(struct pkg_solved));
+
		if (res == NULL) {
+
			pkg_emit_errno("calloc", "pkg_solved");
+
			return;
+
		}
+
		if (seen_add == 0 && seen_del != 0) {
+
			res->priority = del_var->priority;
+
			res->pkg = del_var->pkg;
+
			DL_APPEND(j->jobs_delete, res);
+
		}
+
		else if (seen_del == 0 && seen_add != 0) {
+
			res->priority = add_var->priority;
+
			res->pkg = add_var->pkg;
+
			DL_APPEND(j->jobs_add, res);
+
		}
+
		else {
+
			res->priority = del_var->priority;
+
			res->pkg = del_var->pkg;
+
			DL_APPEND(j->jobs_upgrade, res);
+
		}
+
		j->count ++;
+
	}
+
	else {
+
		pkg_debug(2, "solver: ignoring package %s(%s) as its state has not been changed",
+
				var->origin, var->digest);
+
	}
}

int
@@ -715,19 +751,12 @@ pkg_solve_sat_to_jobs(struct pkg_solve_problem *problem, struct pkg_jobs *j)
	struct pkg_solve_variable *var, *vtmp;
	const char *origin;

-
	HASH_ITER(hd, problem->variables_by_digest, var, vtmp) {
+
	HASH_ITER(hd, problem->variables_by_origin, var, vtmp) {
		if (!var->resolved)
			return (EPKG_FATAL);

		pkg_get(var->pkg, PKG_ORIGIN, &origin);
-
		if (var->to_install && var->pkg->type != PKG_INSTALLED) {
-
			pkg_solve_insert_res_job(&j->jobs_add, var);
-
			j->count ++;
-
		}
-
		else if (!var->to_install && var->pkg->type == PKG_INSTALLED) {
-
			pkg_solve_insert_res_job(&j->jobs_delete, var);
-
			j->count ++;
-
		}
+
		pkg_solve_insert_res_job(var, problem, j);
	}

	return (EPKG_OK);
modified libpkg/private/pkg.h
@@ -228,6 +228,7 @@ struct pkg_jobs {
	struct pkg_job_request	*request_delete;
	struct pkg_solved *jobs_add;
	struct pkg_solved *jobs_delete;
+
	struct pkg_solved *jobs_upgrade;
	struct pkg_job_seen *seen;
	struct pkgdb	*db;
	pkg_jobs_t	 type;
modified pkg/utils.c
@@ -3,6 +3,7 @@
 * Copyright (c) 2011-2012 Julien Laffaye <jlaffaye@FreeBSD.org>
 * Copyright (c) 2011-2012 Marin Atanasov Nikolov <dnaeon@gmail.com>
 * Copyright (c) 2012-2013 Matthew Seaman <matthew@FreeBSD.org>
+
 * Copyright (c) 2013-2014 Vsevolod Stakhov <vsevolod@FreeBSD.org>
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
@@ -679,6 +680,10 @@ print_jobs_summary(struct pkg_jobs *jobs, const char *msg, ...)
	while ((pkg = pkg_jobs_delete_iter(jobs, &iter))) {
		print_jobs_summary_pkg(pkg, inv_type, &oldsize, &newsize, &dlsize);
	}
+
	iter = NULL;
+
	while ((pkg = pkg_jobs_upgrade_iter(jobs, &iter))) {
+
		print_jobs_summary_pkg(pkg, inv_type, &oldsize, &newsize, &dlsize);
+
	}

	if (oldsize > newsize) {
		humanize_number(size, sizeof(size), oldsize - newsize, "B", HN_AUTOSCALE, 0);