Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Add newer remote packages to the universe.
Vsevolod Stakhov committed 12 years ago
commit d9d590ee2bab6727064c1779bb0661a22bd77e32
parent 07272b8
1 file changed +82 -74
modified libpkg/pkg_jobs.c
@@ -47,6 +47,7 @@ static struct pkg *get_local_pkg(struct pkg_jobs *j, const char *origin, unsigne
static struct pkg *get_remote_pkg(struct pkg_jobs *j, const char *origin, unsigned flag);
static int pkg_jobs_fetch(struct pkg_jobs *j);
static bool newer_than_local_pkg(struct pkg_jobs *j, struct pkg *rp, bool force);
+
static bool pkg_need_upgrade(struct pkg *rp, struct pkg *lp, bool recursive);
static bool new_pkg_version(struct pkg_jobs *j);
static int order_pool(struct pkg_jobs *j, bool force);

@@ -211,10 +212,11 @@ pkg_jobs_add_universe(struct pkg_jobs *j, struct pkg *pkg)
{
	struct pkg_dep *d = NULL;
	struct pkg_conflict *c = NULL;
-
	struct pkg *npkg;
+
	struct pkg *npkg, *rpkg;

	/* Go through all depends */
	while (pkg_deps(pkg, &d) == EPKG_OK) {
+
		rpkg = NULL;
		if (pkg->type == PKG_INSTALLED) {
			npkg = get_local_pkg(j, pkg_dep_get(d, PKG_DEP_ORIGIN), 0);
			if (npkg == NULL) {
@@ -229,6 +231,16 @@ pkg_jobs_add_universe(struct pkg_jobs *j, struct pkg *pkg)
					return (EPKG_FATAL);
				}
			}
+
			else if (j->type == PKG_JOBS_UPGRADE) {
+
				/* For upgrade jobs we need to ensure that we do not have a newer version */
+
				rpkg = get_remote_pkg(j, pkg_dep_get(d, PKG_DEP_ORIGIN), 0);
+
				if (rpkg != NULL) {
+
					if (!pkg_need_upgrade(rpkg, npkg, j->flags & PKG_FLAG_RECURSIVE)) {
+
						pkg_free(rpkg);
+
						rpkg = NULL;
+
					}
+
				}
+
			}
		}
		else {
			npkg = get_remote_pkg(j, pkg_dep_get(d, PKG_DEP_ORIGIN), 0);
@@ -243,6 +255,8 @@ pkg_jobs_add_universe(struct pkg_jobs *j, struct pkg *pkg)
		}
		if (pkg_jobs_handle_pkg_universe(j, npkg) != EPKG_OK)
			return (EPKG_FATAL);
+
		if (rpkg != NULL && pkg_jobs_handle_pkg_universe(j, rpkg) != EPKG_OK)
+
			return (EPKG_FATAL);
	}

	/* Go through all rdeps */
@@ -861,92 +875,43 @@ get_remote_pkg(struct pkg_jobs *j, const char *origin, unsigned flag)
}

static bool
-
newer_than_local_pkg(struct pkg_jobs *j, struct pkg *rp, bool force)
+
pkg_need_upgrade(struct pkg *rp, struct pkg *lp, bool recursive)
{
-
	char *origin, *newversion, *oldversion, *reponame;
-
	struct pkg_note *an;
-
	int64_t oldsize;
-
	struct pkg *lp;
+
	int ret, ret1, ret2;
+
	const char *lversion, *rversion;
	struct pkg_option *lo = NULL, *ro = NULL;
	struct pkg_dep *ld = NULL, *rd = NULL;
	struct pkg_shlib *ls = NULL, *rs = NULL;
	struct pkg_conflict *lc = NULL, *rc = NULL;
	struct pkg_provide *lpr = NULL, *rpr = NULL;
-
	bool automatic;
-
	int	ret1, ret2;
-
	pkg_change_t cmp;
-

-
	pkg_get(rp, PKG_ORIGIN, &origin,
-
	    PKG_REPONAME, &reponame);
-
	lp = get_local_pkg(j, origin, 0);

-
	/* obviously yes because local doesn't exists */
-
	if (lp == NULL) {
-
		pkg_set(rp, PKG_AUTOMATIC, (int64_t)true);
-
		return (true);
-
	}
-

-
	if (pkg_is_locked(lp)) {
-
		pkg_free(lp);
+
	/* Do not upgrade locked packages */
+
	if (pkg_is_locked(lp))
		return (false);
-
	}
-

-
	pkg_get(lp, PKG_AUTOMATIC, &automatic,
-
	    PKG_VERSION, &oldversion,
-
	    PKG_FLATSIZE, &oldsize);
-

-
	an = pkg_annotation_lookup(lp, "repository");
-
	if (an != NULL)  {
-
		if (strcmp(pkg_repo_ident(pkg_repo_find_name(reponame)),
-
		    pkg_annotation_value(an)) != 0)  {
-
			pkg_free(lp);
-
			return (false);
-
		} else {
-
			pkg_addannotation(rp, "repository", pkg_annotation_value(an));
-
		}
-
	}
-

-
	pkg_get(rp, PKG_VERSION, &newversion);
-
	pkg_set(rp, PKG_OLD_VERSION, oldversion,
-
	    PKG_OLD_FLATSIZE, oldsize,
-
	    PKG_AUTOMATIC, (int64_t)automatic);

-
	if (force) {
-
		pkg_free(lp);
-
		return (true);
-
	}
+
	pkg_get(lp, PKG_VERSION, &lversion);
+
	pkg_get(rp, PKG_VERSION, &rversion);

-
	/* compare versions */
-
	cmp = pkg_version_change(rp);
-

-
	if (cmp == PKG_UPGRADE) {
-
		pkg_free(lp);
+
	ret = pkg_version_cmp(lversion, rversion);
+
	if (ret == 0 && recursive)
		return (true);
-
	}
-

-
	if (cmp == PKG_REINSTALL && (j->flags & PKG_FLAG_RECURSIVE) == PKG_FLAG_RECURSIVE) {
-
		pkg_free(lp);
+
	else if (ret > 0)
		return (true);
-
	}
-

-
	if (cmp == PKG_DOWNGRADE) {
-
		pkg_free(lp);
+
	else
		return (false);
-
	}
+


	/* compare options */
	for (;;) {
		ret1 = pkg_options(rp, &ro);
		ret2 = pkg_options(lp, &lo);
		if (ret1 != ret2) {
-
			pkg_free(lp);
			pkg_set(rp, PKG_REASON, "options changed");
			return (true);
		}
		if (ret1 == EPKG_OK) {
			if (strcmp(pkg_option_opt(lo), pkg_option_opt(ro)) != 0 ||
-
				strcmp(pkg_option_value(lo), pkg_option_value(ro)) != 0) {
-
				pkg_free(lp);
+
					strcmp(pkg_option_value(lo), pkg_option_value(ro)) != 0) {
				pkg_set(rp, PKG_REASON, "options changed");
				return (true);
			}
@@ -955,20 +920,17 @@ newer_than_local_pkg(struct pkg_jobs *j, struct pkg *rp, bool force)
			break;
	}

-

	/* What about the direct deps */
	for (;;) {
		ret1 = pkg_deps(rp, &rd);
		ret2 = pkg_deps(lp, &ld);
		if (ret1 != ret2) {
-
			pkg_free(lp);
			pkg_set(rp, PKG_REASON, "direct dependency changed");
			return (true);
		}
		if (ret1 == EPKG_OK) {
			if (strcmp(pkg_dep_get(rd, PKG_DEP_NAME),
-
			    pkg_dep_get(ld, PKG_DEP_NAME)) != 0) {
-
				pkg_free(lp);
+
					pkg_dep_get(ld, PKG_DEP_NAME)) != 0) {
				pkg_set(rp, PKG_REASON, "direct dependency changed");
				return (true);
			}
@@ -982,14 +944,12 @@ newer_than_local_pkg(struct pkg_jobs *j, struct pkg *rp, bool force)
		ret1 = pkg_conflicts(rp, &rc);
		ret2 = pkg_conflicts(lp, &lc);
		if (ret1 != ret2) {
-
			pkg_free(lp);
			pkg_set(rp, PKG_REASON, "direct conflict changed");
			return (true);
		}
		if (ret1 == EPKG_OK) {
			if (strcmp(pkg_conflict_origin(rc),
					pkg_conflict_origin(lc)) != 0) {
-
				pkg_free(lp);
				pkg_set(rp, PKG_REASON, "direct conflict changed");
				return (true);
			}
@@ -1003,14 +963,12 @@ newer_than_local_pkg(struct pkg_jobs *j, struct pkg *rp, bool force)
		ret1 = pkg_provides(rp, &rpr);
		ret2 = pkg_provides(lp, &lpr);
		if (ret1 != ret2) {
-
			pkg_free(lp);
			pkg_set(rp, PKG_REASON, "provides changed");
			return (true);
		}
		if (ret1 == EPKG_OK) {
			if (strcmp(pkg_provide_name(rpr),
					pkg_provide_name(lpr)) != 0) {
-
				pkg_free(lp);
				pkg_set(rp, PKG_REASON, "provides changed");
				return (true);
			}
@@ -1024,14 +982,12 @@ newer_than_local_pkg(struct pkg_jobs *j, struct pkg *rp, bool force)
		ret1 = pkg_shlibs_required(rp, &rs);
		ret2 = pkg_shlibs_required(lp, &ls);
		if (ret1 != ret2) {
-
			pkg_free(lp);
			pkg_set(rp, PKG_REASON, "needed shared library changed");
			return (true);
		}
		if (ret1 == EPKG_OK) {
			if (strcmp(pkg_shlib_name(rs),
-
			    pkg_shlib_name(ls)) != 0) {
-
				pkg_free(lp);
+
					pkg_shlib_name(ls)) != 0) {
				pkg_set(rp, PKG_REASON, "needed shared library changed");
				return (true);
			}
@@ -1043,6 +999,58 @@ newer_than_local_pkg(struct pkg_jobs *j, struct pkg *rp, bool force)
	return (false);
}

+
static bool
+
newer_than_local_pkg(struct pkg_jobs *j, struct pkg *rp, bool force)
+
{
+
	char *origin, *newversion, *oldversion, *reponame;
+
	struct pkg_note *an;
+
	int64_t oldsize;
+
	struct pkg *lp;
+
	bool automatic;
+
	int ret;
+

+
	pkg_get(rp, PKG_ORIGIN, &origin,
+
	    PKG_REPONAME, &reponame);
+
	lp = get_local_pkg(j, origin, 0);
+

+
	/* obviously yes because local doesn't exists */
+
	if (lp == NULL) {
+
		pkg_set(rp, PKG_AUTOMATIC, (int64_t)true);
+
		return (true);
+
	}
+

+
	pkg_get(lp, PKG_AUTOMATIC, &automatic,
+
	    PKG_VERSION, &oldversion,
+
	    PKG_FLATSIZE, &oldsize);
+

+
	/* Add repo name to the annotation */
+
	an = pkg_annotation_lookup(lp, "repository");
+
	if (an != NULL)  {
+
		if (strcmp(pkg_repo_ident(pkg_repo_find_name(reponame)),
+
		    pkg_annotation_value(an)) != 0)  {
+
			pkg_free(lp);
+
			return (false);
+
		} else {
+
			pkg_addannotation(rp, "repository", pkg_annotation_value(an));
+
		}
+
	}
+

+
	pkg_get(rp, PKG_VERSION, &newversion);
+
	pkg_set(rp, PKG_OLD_VERSION, oldversion,
+
	    PKG_OLD_FLATSIZE, oldsize,
+
	    PKG_AUTOMATIC, (int64_t)automatic);
+

+
	if (force) {
+
		pkg_free(lp);
+
		return (true);
+
	}
+

+
	ret = pkg_need_upgrade(rp, lp, j->flags & PKG_FLAG_RECURSIVE);
+
	pkg_free(lp);
+

+
	return (ret);
+
}
+

static int
jobs_solve_install(struct pkg_jobs *j)
{