summaryrefslogtreecommitdiff
path: root/system/apk-tools/deep.patch
blob: f315339cc691f23617bdfed82ca429ff70f48ee8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
From e61635ada7901763919caeaa01fa62ead3f6e97f Mon Sep 17 00:00:00 2001
From: "A. Wilcox" <AWilcox@Wilcox-Tech.com>
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