Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Load package before calculating its digest.
Vsevolod Stakhov committed 10 years ago
commit e14111c6660f651bd425dd45167ba5a754c01704
parent 631ae91
4 files changed +17 -7
modified libpkg/pkg.c
@@ -37,6 +37,7 @@
#include "pkg.h"
#include "private/event.h"
#include "private/pkg.h"
+
#include "private/pkgdb.h"
#include "private/utils.h"

int
@@ -1462,9 +1463,13 @@ pkg_open2(struct pkg **pkg_p, struct archive **a, struct archive_entry **ae,
}

int
-
pkg_validate(struct pkg *pkg)
+
pkg_validate(struct pkg *pkg, struct pkgdb *db)
{
	assert(pkg != NULL);
+
	unsigned flags = PKG_LOAD_BASIC|PKG_LOAD_OPTIONS|PKG_LOAD_DEPS|
+
					PKG_LOAD_REQUIRES|PKG_LOAD_PROVIDES|
+
					PKG_LOAD_SHLIBS_REQUIRED|PKG_LOAD_SHLIBS_PROVIDED|
+
					PKG_LOAD_ANNOTATIONS|PKG_LOAD_CONFLICTS;

	if (pkg->uid == NULL) {
		/* Keep that part for the day we have to change it */
@@ -1475,9 +1480,13 @@ pkg_validate(struct pkg *pkg)
		pkg->uid = strdup(pkg->name);
	}

-
	if (pkg->digest == NULL || !pkg_checksum_is_valid(pkg->digest, strlen(pkg->digest))) {
+
	if (pkg->digest == NULL || !pkg_checksum_is_valid(pkg->digest,
+
			strlen(pkg->digest))) {
		/* Calculate new digest */
-
		return (pkg_checksum_calculate(pkg, NULL));
+
		if (pkgdb_ensure_loaded(db, pkg, flags)) {
+
			return (pkg_checksum_calculate(pkg, db));
+
		}
+
		return (EPKG_FATAL);
	}

	return (EPKG_OK);
modified libpkg/pkg_jobs.c
@@ -807,7 +807,7 @@ pkg_jobs_try_remote_candidate(struct pkg_jobs *j, const char *pattern,
		sbuf_finish(qmsg);
		if (pkg_emit_query_yesno(true, sbuf_data(qmsg))) {
			/* Change the origin of the local package */
-
			pkg_validate(p);
+
			pkg_validate(p, j->db);
			unit = pkg_jobs_universe_find(j->universe, uid);
			if (unit != NULL)
				pkg_jobs_universe_change_uid(j->universe, unit, p->uid,
@@ -998,7 +998,7 @@ pkg_jobs_find_remote_pattern(struct pkg_jobs *j, struct job_pattern *jp)
		pkg_manifest_keys_new(&keys);
		if (pkg_open(&pkg, jp->path, keys, PKG_OPEN_MANIFEST_ONLY) != EPKG_OK) {
			rc = EPKG_FATAL;
-
		} else if (pkg_validate(pkg) == EPKG_OK) {
+
		} else if (pkg_validate(pkg, j->db) == EPKG_OK) {
			if (j->type == PKG_JOBS_UPGRADE) {
				jfp.match = MATCH_EXACT;
				jfp.pattern = pkg->name;
modified libpkg/pkg_jobs_universe.c
@@ -171,7 +171,8 @@ pkg_jobs_universe_add_pkg(struct pkg_jobs_universe *universe, struct pkg *pkg,
{
	struct pkg_job_universe_item *item, *seen, *tmp = NULL;

-
	pkg_validate(pkg);
+
	pkg_validate(pkg, universe->j->db);
+

	if (pkg->digest == NULL) {
		pkg_debug(3, "no digest found for package %s (%s-%s)",
		    pkg->uid, pkg->name, pkg->version);
modified libpkg/private/pkg.h
@@ -583,7 +583,7 @@ int pkg_script_run(struct pkg *, pkg_script type);
int pkg_open2(struct pkg **p, struct archive **a, struct archive_entry **ae,
	      const char *path, struct pkg_manifest_key *keys, int flags, int fd);

-
int pkg_validate(struct pkg *pkg);
+
int pkg_validate(struct pkg *pkg, struct pkgdb *db);

void pkg_list_free(struct pkg *, pkg_list);