Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Ensure load of files for remote packages.
Vsevolod Stakhov committed 11 years ago
commit e79e383844498f61900ac8ab46ef35dc6d664992
parent 7bf6b9f
3 files changed +25 -19
modified libpkg/pkg_jobs.c
@@ -2557,31 +2557,22 @@ static int
pkg_jobs_check_conflicts(struct pkg_jobs *j)
{
	struct pkg_solved *ps;
-
	struct pkg_manifest_key *keys = NULL;
-
	struct pkg *pkg = NULL, *p = NULL;
-
	char path[MAXPATHLEN];
+
	struct pkg *p = NULL;
	int ret = EPKG_OK, res, added = 0;

	pkg_emit_integritycheck_begin();

-
	pkg_manifest_keys_new(&keys);
	DL_FOREACH(j->jobs, ps) {
		if (ps->type == PKG_SOLVED_DELETE || ps->type == PKG_SOLVED_UPGRADE_REMOVE) {
			continue;
		}
		else {
			p = ps->items[0]->pkg;
-
			if (p->type == PKG_REMOTE) {
-
				pkg_snprintf(path, sizeof(path), "%R", p);
-
				if (*path != '/')
-
					pkg_repo_cached_name(p, path, sizeof(path));
-
				if (pkg_open(&pkg, path, keys, 0) != EPKG_OK)
-
					return (EPKG_FATAL);
-
				p = pkg;
-
			}
-
			else if (p->type != PKG_FILE) {
+

+
			if (p->type == PKG_REMOTE)
+
				pkgdb_ensure_loaded(j->db, p, PKG_LOAD_FILES|PKG_LOAD_DIRS);
+
			else if (p->type != PKG_FILE)
				continue;
-
			}
		}
		if ((res = pkg_conflicts_append_pkg(p, j)) != EPKG_OK)
			ret = res;
@@ -2589,8 +2580,6 @@ pkg_jobs_check_conflicts(struct pkg_jobs *j)
			added ++;

	}
-
	pkg_manifest_keys_free(keys);
-
	pkg_free(pkg);

	if (added > 0) {
		pkg_debug(1, "check integrity for %d items added", added);
modified libpkg/pkgdb_iterator.c
@@ -1026,6 +1026,7 @@ pkgdb_ensure_loaded_sqlite(sqlite3 *sqlite, struct pkg *pkg, unsigned flags)
			ret = load_on_flag[i].load(sqlite, pkg);
			if (ret != EPKG_OK)
				return (ret);
+
			pkg->flags |= load_on_flag[i].flag;
		}
	}

modified libpkg/repo/binary/query.c
@@ -359,12 +359,28 @@ pkg_repo_binary_ensure_loaded(struct pkg_repo *repo,
	struct pkg *pkg, unsigned flags)
{
	sqlite3 *sqlite = PRIV_GET(repo);
+
	struct pkg_manifest_key *keys = NULL;
+
	struct pkg *cached = NULL;
+
	char path[MAXPATHLEN];

-
	if (flags & (PKG_LOAD_FILES|PKG_LOAD_DIRS|PKG_LOAD_ANNOTATIONS)) {
+
	if (flags & (PKG_LOAD_FILES|PKG_LOAD_DIRS)) {
		/*
-
		 * At the moment, we have no such information in repo
+
		 * Try to get that information from fetched package in cache
		 */
-
		return (EPKG_FATAL);
+
		pkg_manifest_keys_new(&keys);
+
		pkg_repo_cached_name(pkg, path, sizeof(path));
+

+
		if (pkg_open(&cached, path, keys, 0) != EPKG_OK)
+
			return (EPKG_FATAL);
+

+
		/* Now move required elements to the provided package */
+
		pkg->files = cached->files;
+
		pkg->dirs = cached->dirs;
+
		cached->files = NULL;
+
		cached->dirs = NULL;
+

+
		pkg_free(cached);
+
		pkg->flags |= (flags & (PKG_LOAD_FILES|PKG_LOAD_DIRS));
	}

	return (pkgdb_ensure_loaded_sqlite(sqlite, pkg, flags));