Radish alpha
H
HardenedBSD Package Manager
Radicle
Git (anonymous pull)
Log in to clone via SSH
Perform integrity check early if all packages are downloaded.
Vsevolod Stakhov committed 11 years ago
commit 5b306aaf55d045ea9b24841486e178ef59b9762d
parent 2bc8f9d5328b3586f3ce5a52e128999c168fc381
2 files changed +72 -33
modified libpkg/pkg_jobs.c
@@ -2232,6 +2232,7 @@ pkg_jobs_solve(struct pkg_jobs *j)
{
	int ret, pstatus;
	struct pkg_solve_problem *problem;
+
	struct pkg_solved *job;
	const char *solver;
	FILE *spipe[2];
	pid_t pchild;
@@ -2314,6 +2315,37 @@ pkg_jobs_solve(struct pkg_jobs *j)

	pkgdb_end_solver(j->db);

+
	pkg_jobs_apply_replacements(j);
+

+
	/* Check if we need to fetch and re-run the solver */
+
	DL_FOREACH(j->jobs, job) {
+
		if (pkgdb_ensure_loaded(j->db, job->items[0]->pkg,
+
		    PKG_LOAD_FILES|PKG_LOAD_DIRS) == EPKG_FATAL) {
+
			j->need_fetch = true;
+
			break;
+
		}
+
	}
+

+
	if (j->solved == 1 && !j->need_fetch) {
+
		int rc;
+
		bool has_conflicts = false;
+
		do {
+
			j->conflicts_registered = 0;
+
			rc = pkg_jobs_check_conflicts(j);
+
			if (rc == EPKG_CONFLICT) {
+
				/* Cleanup results */
+
				LL_FREE(j->jobs, free);
+
				j->jobs = NULL;
+
				j->count = 0;
+
				has_conflicts = true;
+
				rc = pkg_jobs_solve(j);
+
			}
+
			else if (rc == EPKG_OK && !has_conflicts) {
+
				break;
+
			}
+
		} while (j->conflicts_registered > 0);
+
	}
+

	return (ret);
}

@@ -2539,44 +2571,50 @@ pkg_jobs_apply(struct pkg_jobs *j)
	case PKG_JOBS_UPGRADE:
	case PKG_JOBS_DEINSTALL:
	case PKG_JOBS_AUTOREMOVE:
-
		pkg_jobs_apply_replacements(j);
-
		pkg_plugins_hook_run(PKG_PLUGIN_HOOK_PRE_FETCH, j, j->db);
-
		rc = pkg_jobs_fetch(j);
-
		pkg_plugins_hook_run(PKG_PLUGIN_HOOK_POST_FETCH, j, j->db);
-
		if (rc == EPKG_OK) {
-
			/* Check local conflicts in the first run */
-
			if (j->solved == 1) {
-
				do {
-
					j->conflicts_registered = 0;
-
					rc = pkg_jobs_check_conflicts(j);
-
					if (rc == EPKG_CONFLICT) {
-
						/* Cleanup results */
-
						LL_FREE(j->jobs, free);
-
						j->jobs = NULL;
-
						j->count = 0;
-
						has_conflicts = true;
-
						rc = pkg_jobs_solve(j);
-
					}
-
					else if (rc == EPKG_OK && !has_conflicts) {
-
						pkg_plugins_hook_run(pre, j, j->db);
-
						rc = pkg_jobs_execute(j);
-
						break;
-
					}
-
				} while (j->conflicts_registered > 0);
+
		if (j->need_fetch) {
+
			pkg_plugins_hook_run(PKG_PLUGIN_HOOK_PRE_FETCH, j, j->db);
+
			rc = pkg_jobs_fetch(j);
+
			pkg_plugins_hook_run(PKG_PLUGIN_HOOK_POST_FETCH, j, j->db);
+
			if (rc == EPKG_OK) {
+
				/* Check local conflicts in the first run */
+
				if (j->solved == 1) {
+
					do {
+
						j->conflicts_registered = 0;
+
						rc = pkg_jobs_check_conflicts(j);
+
						if (rc == EPKG_CONFLICT) {
+
							/* Cleanup results */
+
							LL_FREE(j->jobs, free);
+
							j->jobs = NULL;
+
							j->count = 0;
+
							has_conflicts = true;
+
							rc = pkg_jobs_solve(j);
+
						}
+
						else if (rc == EPKG_OK && !has_conflicts) {
+
							pkg_plugins_hook_run(pre, j, j->db);
+
							rc = pkg_jobs_execute(j);
+
							break;
+
						}
+
					} while (j->conflicts_registered > 0);

-
				if (has_conflicts) {
-
					if (j->conflicts_registered == 0)
-
						pkg_jobs_set_priorities(j);
+
					if (has_conflicts) {
+
						if (j->conflicts_registered == 0)
+
							pkg_jobs_set_priorities(j);

-
					return (EPKG_CONFLICT);
+
						return (EPKG_CONFLICT);
+
					}
+
				}
+
				else {
+
					/* Not the first run, conflicts are resolved already */
+
					pkg_plugins_hook_run(pre, j, j->db);
+
					rc = pkg_jobs_execute(j);
				}
-
			}
-
			else {
-
				/* Not the first run, conflicts are resolved already */
-
				pkg_plugins_hook_run(pre, j, j->db);
-
				rc = pkg_jobs_execute(j);
			}
		}
+
		else {
+
			pkg_plugins_hook_run(pre, j, j->db);
+
			rc = pkg_jobs_execute(j);
+
		}
+

		pkg_plugins_hook_run(post, j, j->db);
		break;
	case PKG_JOBS_FETCH:
modified libpkg/private/pkg.h
@@ -264,6 +264,7 @@ struct pkg_jobs {
	int count;
	int total;
	int conflicts_registered;
+
	bool need_fetch;
	const char *	 reponame;
	struct job_pattern *patterns;
};