~alpine/devel

apk upgrade has issues when old deps still available v1 PROPOSED

When running `apk upgrade -al` only packages listed in the world file are
forced to upgrade.  If a package in world has a dependency that is eligible
for upgrade, but the currently installed version is also still available in
the repository, it will not be considered for upgrade.

This causes considerable breakage for at least Adélie Linux; we keep built
packages around on the mirrors indefinitely.  This breakage was noticed
during upgrades of 1.0-BETA2 to 1.0-BETA3, and the solver log (using
DEBUG_PRINT) can be seen at [1].

The patch I am sending fixes this issue for us by adding an option to the
upgrade applet, '-d' or '--deep', which causes the solver to prefer newer
versions of all selected packages when available.  The difference in the
solver log can be seen at [2].

[1]: https://www.adelielinux.org/storage/apk-error.log
[2]: https://www.adelielinux.org/storage/deep.diff

A. Wilcox (1):
  upgrade: add --deep option to upgrade everything

 src/apk_solver.h |  1 +
 src/solver.c     | 10 ++++++++++
 src/upgrade.c    |  5 +++++
 3 files changed, 16 insertions(+)

-- 
2.21.0



---
Unsubscribe:  alpine-devel+unsubscribe@lists.alpinelinux.org
Help:         alpine-devel+help@lists.alpinelinux.org
---
Export patchset (mbox)
How do I use this?

Copy & paste the following snippet into your terminal to import this patchset into git:

curl -s https://lists.alpinelinux.org/~alpine/devel/patches/772/mbox | git am -3
Learn more about email & git

[alpine-devel] [PATCH 1/1] upgrade: add --deep option to upgrade everything Export this patch

---
 src/apk_solver.h |  1 +
 src/solver.c     | 10 ++++++++++
 src/upgrade.c    |  5 +++++
 3 files changed, 16 insertions(+)

diff --git a/src/apk_solver.h b/src/apk_solver.h
index b8b072d..908b3fd 100644
--- a/src/apk_solver.h
+++ b/src/apk_solver.h
@@ -35,6 +35,7 @@ struct apk_changeset {
#define APK_SOLVERF_REINSTALL		0x0004
#define APK_SOLVERF_LATEST		0x0008
#define APK_SOLVERF_IGNORE_CONFLICT	0x0010
#define APK_SOLVERF_DEEP		0x0020

void apk_solver_set_name_flags(struct apk_name *name,
			       unsigned short solver_flags,
diff --git a/src/solver.c b/src/solver.c
index e10cf8b..8437d61 100644
--- a/src/solver.c
+++ b/src/solver.c
@@ -40,6 +40,7 @@ struct apk_solver_state {
	unsigned int pinning_inherit;
	unsigned int default_repos;
	unsigned ignore_conflict : 1;
	unsigned deep_upgrade : 1;
};

static struct apk_provider provider_none = {
@@ -510,6 +511,14 @@ static int compare_providers(struct apk_solver_state *ss,
	unsigned int solver_flags;
	int r;

	/* In deep upgrades, always return the greater version */
	if (ss->deep_upgrade)
		switch (apk_version_compare_blob(*pA->version, *pB->version)) {
			case APK_VERSION_LESS:
				return -1;
			case APK_VERSION_GREATER:
				return 1;
		}

	/* Prefer existing package */
	if (pkgA == NULL || pkgB == NULL)
@@ -1006,6 +1015,7 @@ restart:
	ss->changeset = changeset;
	ss->default_repos = apk_db_get_pinning_mask_repos(db, APK_DEFAULT_PINNING_MASK);
	ss->ignore_conflict = !!(solver_flags & APK_SOLVERF_IGNORE_CONFLICT);
	ss->deep_upgrade = !!(solver_flags & APK_SOLVERF_DEEP);
	list_init(&ss->dirty_head);
	list_init(&ss->unresolved_head);

diff --git a/src/upgrade.c b/src/upgrade.c
index 14457b5..e48d8e3 100644
--- a/src/upgrade.c
+++ b/src/upgrade.c
@@ -38,6 +38,9 @@ static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt
	case 'a':
		uctx->solver_flags |= APK_SOLVERF_AVAILABLE;
		break;
	case 'd':
		uctx->solver_flags |= APK_SOLVERF_DEEP;
		break;
	case 'l':
		uctx->solver_flags |= APK_SOLVERF_LATEST;
		break;
@@ -59,6 +62,8 @@ static const struct apk_option options_applet[] = {
	{ 0x10000, "no-self-upgrade",
	  "Do not do early upgrade of 'apk-tools' package" },
	{ 0x10001, "self-upgrade-only", "Only do self-upgrade" },
	{ 'd', "deep",
	  "Include dependencies when upgrading world" },
};

static const struct apk_option_group optgroup_applet = {
-- 
2.21.0



---
Unsubscribe:  alpine-devel+unsubscribe@lists.alpinelinux.org
Help:         alpine-devel+help@lists.alpinelinux.org
---