Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Split a job request to delete and add.
Vsevolod Stakhov committed 12 years ago
commit c1799c2db2aedc2ddfe132c62948e33d9b44f2a3
parent c617eb1
2 files changed +32 -43
modified libpkg/pkg_jobs.c
@@ -98,8 +98,12 @@ pkg_jobs_free(struct pkg_jobs *j)
	if ((j->flags & PKG_FLAG_DRY_RUN) == 0)
		pkgdb_release_lock(j->db);

-
	HASH_ITER(hh, j->request, req, tmp) {
-
		HASH_DEL(j->request, req);
+
	HASH_ITER(hh, j->request_add, req, tmp) {
+
		HASH_DEL(j->request_add, req);
+
		free(req);
+
	}
+
	HASH_ITER(hh, j->request_delete, req, tmp) {
+
		HASH_DEL(j->request_delete, req);
		free(req);
	}
	HASH_FREE(j->jobs, pkg, pkg_free);
@@ -137,6 +141,23 @@ pkg_jobs_add(struct pkg_jobs *j, match_t match, char **argv, int argc)
	return (EPKG_OK);
}

+
static void
+
pkg_jobs_add_req(struct pkg_jobs *j, const char *origin, struct pkg *pkg, bool add)
+
{
+
	struct pkg_job_request *req;
+

+
	req = malloc(sizeof (struct pkg_job_request));
+
	if (req == NULL) {
+
		pkg_emit_errno("malloc", "struct pkg_job_request");
+
		return;
+
	}
+
	req->pkg = pkg;
+
	if (add)
+
		HASH_ADD_KEYPTR(hh, j->request_add, origin, strlen(origin), req);
+
	else
+
		HASH_ADD_KEYPTR(hh, j->request_delete, origin, strlen(origin), req);
+
}
+

static int
populate_local_rdeps(struct pkg_jobs *j, struct pkg *p)
{
@@ -157,6 +178,7 @@ populate_local_rdeps(struct pkg_jobs *j, struct pkg *p)
		}
		pkg_get(pkg, PKG_ORIGIN, &origin);
		HASH_ADD_KEYPTR(hh, j->bulk, origin, strlen(origin), pkg);
+
		pkg_jobs_add_req(j, origin, pkg, false);
		populate_local_rdeps(j, pkg);
	}

@@ -242,7 +264,6 @@ jobs_solve_deinstall(struct pkg_jobs *j)
	struct pkg *tmp, *p;
	struct pkg_dep *d, *dtmp;
	struct pkgdb_it *it;
-
	struct pkg_job_request *req;
	int64_t oldsize;
	char *origin;
	int ret;
@@ -259,13 +280,7 @@ jobs_solve_deinstall(struct pkg_jobs *j)
			pkg_get(pkg, PKG_ORIGIN, &origin, PKG_FLATSIZE, &oldsize);
			pkg_set(pkg, PKG_OLD_FLATSIZE, oldsize, PKG_FLATSIZE, (int64_t)0);
			HASH_ADD_KEYPTR(hh, j->bulk, origin, strlen(origin), pkg);
-
			req = malloc(sizeof (struct pkg_job_request));
-
			if (req == NULL) {
-
				pkg_emit_errno("malloc", "struct pkg_job_request");
-
				return (EPKG_FATAL);
-
			}
-
			req->pkg = pkg;
-
			HASH_ADD_KEYPTR(hh, j->request, origin, strlen(origin), req);
+
			pkg_jobs_add_req(j, origin, pkg, false);
			if (recursive)
				populate_local_rdeps(j, pkg);
			pkg = NULL;
@@ -313,6 +328,7 @@ recursive_autoremove(struct pkg_jobs *j)
			HASH_DEL(j->bulk, pkg1);
			pkg_get(pkg1, PKG_ORIGIN, &origin, PKG_FLATSIZE, &oldsize);
			pkg_set(pkg1, PKG_OLD_FLATSIZE, oldsize, PKG_FLATSIZE, (int64_t)0);
+
			pkg_jobs_add_req(j, origin, pkg1, false);
			HASH_ADD_KEYPTR(hh, j->jobs, origin, strlen(origin), pkg1);
			remove_from_rdeps(j, origin);
			return (true);
@@ -328,7 +344,6 @@ jobs_solve_autoremove(struct pkg_jobs *j)
	struct pkg *pkg = NULL;
	struct pkgdb_it *it;
	char *origin;
-
	struct pkg_job_request *req;

	if ((it = pkgdb_query(j->db, " WHERE automatic=1 ", MATCH_CONDITION)) == NULL)
		return (EPKG_FATAL);
@@ -336,13 +351,7 @@ jobs_solve_autoremove(struct pkg_jobs *j)
	while (pkgdb_it_next(it, &pkg, PKG_LOAD_BASIC|PKG_LOAD_RDEPS) == EPKG_OK) {
		pkg_get(pkg, PKG_ORIGIN, &origin);
		HASH_ADD_KEYPTR(hh, j->bulk, origin, strlen(origin), pkg);
-
		req = malloc(sizeof (struct pkg_job_request));
-
		if (req == NULL) {
-
			pkg_emit_errno("malloc", "struct pkg_job_request");
-
			return (EPKG_FATAL);
-
		}
-
		req->pkg = pkg;
-
		HASH_ADD_KEYPTR(hh, j->request, origin, strlen(origin), req);
+
		pkg_jobs_add_req(j, origin, pkg, false);
		pkg = NULL;
	}
	pkgdb_it_free(it);
@@ -364,7 +373,6 @@ jobs_solve_upgrade(struct pkg_jobs *j)
	struct pkgdb_it *it;
	char *origin;
	struct pkg_dep *d, *dtmp;
-
	struct pkg_job_request *req;
	int ret;

	if ((j->flags & PKG_FLAG_PKG_VERSION_TEST) == PKG_FLAG_PKG_VERSION_TEST)
@@ -378,13 +386,7 @@ jobs_solve_upgrade(struct pkg_jobs *j)

	while (pkgdb_it_next(it, &pkg, PKG_LOAD_BASIC) == EPKG_OK) {
		pkg_get(pkg, PKG_ORIGIN, &origin);
-
		req = malloc(sizeof (struct pkg_job_request));
-
		if (req == NULL) {
-
			pkg_emit_errno("malloc", "struct pkg_job_request");
-
			return (EPKG_FATAL);
-
		}
-
		req->pkg = pkg;
-
		HASH_ADD_KEYPTR(hh, j->request, origin, strlen(origin), req);
+
		pkg_jobs_add_req(j, origin, pkg, true);
		/* Do not test we ignore what doesn't exists remotely */
		get_remote_pkg(j, origin, MATCH_EXACT, false);
		pkg = NULL;
@@ -881,7 +883,6 @@ jobs_solve_install(struct pkg_jobs *j)
	struct pkg *pkg, *tmp, *p;
	struct pkg_dep *d, *dtmp;
	struct pkgdb_it *it;
-
	struct pkg_job_request *req;
	const char *origin;
	int ret;

@@ -900,13 +901,7 @@ jobs_solve_install(struct pkg_jobs *j)
			while (pkgdb_it_next(it, &pkg, PKG_LOAD_BASIC|PKG_LOAD_RDEPS) == EPKG_OK) {
				d = NULL;
				pkg_get(pkg, PKG_ORIGIN, &origin);
-
				req = malloc(sizeof (struct pkg_job_request));
-
				if (req == NULL) {
-
					pkg_emit_errno("malloc", "struct pkg_job_request");
-
					return (EPKG_FATAL);
-
				}
-
				req->pkg = pkg;
-
				HASH_ADD_KEYPTR(hh, j->request, origin, strlen(origin), req);
+
				pkg_jobs_add_req(j, origin, pkg, false);
				if (get_remote_pkg(j, origin, MATCH_EXACT, true) == EPKG_FATAL)
					pkg_emit_error("No packages matching '%s', has been found in the repositories", origin);

@@ -973,7 +968,6 @@ jobs_solve_fetch(struct pkg_jobs *j)
	struct job_pattern *jp = NULL;
	struct pkg *pkg = NULL;
	struct pkgdb_it *it;
-
	struct pkg_job_request *req;
	char *origin;
	unsigned flag = PKG_LOAD_BASIC;

@@ -986,13 +980,7 @@ jobs_solve_fetch(struct pkg_jobs *j)

		while (pkgdb_it_next(it, &pkg, PKG_LOAD_BASIC) == EPKG_OK) {
			pkg_get(pkg, PKG_ORIGIN, &origin);
-
			req = malloc(sizeof (struct pkg_job_request));
-
			if (req == NULL) {
-
				pkg_emit_errno("malloc", "struct pkg_job_request");
-
				return (EPKG_FATAL);
-
			}
-
			req->pkg = pkg;
-
			HASH_ADD_KEYPTR(hh, j->request, origin, strlen(origin), req);
+
			pkg_jobs_add_req(j, origin, pkg, false);
			/* Do not test we ignore what doesn't exists remotely */
			get_remote_pkg(j, origin, MATCH_EXACT, false);
			pkg = NULL;
modified libpkg/private/pkg.h
@@ -204,7 +204,8 @@ struct pkg_jobs {
	struct pkg	*jobs;
	struct pkg 	*bulk;
	struct pkg	*seen;
-
	struct pkg_job_request	*request;
+
	struct pkg_job_request	*request_add;
+
	struct pkg_job_request	*request_delete;
	struct pkgdb	*db;
	pkg_jobs_t	 type;
	pkg_flags	 flags;