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 ---
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 -3Learn more about email & git
--- 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 ---