From e61635ada7901763919caeaa01fa62ead3f6e97f Mon Sep 17 00:00:00 2001 From: "A. Wilcox" Date: Fri, 31 May 2019 21:32:02 -0500 Subject: [PATCH 1/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(+) 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