summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2022-02-24 14:15:28 +0200
committerTimo Teräs <timo.teras@iki.fi>2022-02-24 14:18:41 +0200
commite4dc2373d6acded0cf14c7e09694726b2d8f524e (patch)
treedea8c386b9c2b685b5f58f65fd2ef5654e17a0c4
parent86d75e10f54fb86ed55096674792ccec74a924d0 (diff)
downloadapk-tools-e4dc2373d6acded0cf14c7e09694726b2d8f524e.tar.gz
apk-tools-e4dc2373d6acded0cf14c7e09694726b2d8f524e.tar.bz2
apk-tools-e4dc2373d6acded0cf14c7e09694726b2d8f524e.tar.xz
apk-tools-e4dc2373d6acded0cf14c7e09694726b2d8f524e.zip
solver: do not auto select virtual-only package with one provider
This reverts most of 0dcbd933 which allowed automatic selection of package with a "virtual provides" having only one provider. While convenient, it creates problems if multiple versions of the same package exist, or if in future other providers would be added to one of the repositories. This restore the original behaviour, and improve the error message to tell the user to mention one of the providers explicitly. fixes #10810
-rw-r--r--src/commit.c4
-rw-r--r--src/solver.c4
-rw-r--r--test/provides10.test2
-rw-r--r--test/provides11.test2
-rw-r--r--test/provides9.test2
5 files changed, 12 insertions, 2 deletions
diff --git a/src/commit.c b/src/commit.c
index 42280aa..db548c7 100644
--- a/src/commit.c
+++ b/src/commit.c
@@ -531,6 +531,10 @@ static void analyze_name(struct print_state *ps, struct apk_name *name)
snprintf(tmp, sizeof(tmp), "%s (virtual)", name->name);
ps->label = tmp;
+ label_start(ps, "note:");
+ apk_print_indented_words(&ps->i, "please select one of the 'provided by' packages explicitly");
+ label_end(ps);
+
label_start(ps, "provided by:");
foreach_array_item(p0, name->providers)
p0->pkg->name->state_int++;
diff --git a/src/solver.c b/src/solver.c
index fc73642..1deaf50 100644
--- a/src/solver.c
+++ b/src/solver.c
@@ -715,8 +715,8 @@ static void select_package(struct apk_solver_state *ss, struct apk_name *name)
if (p->version == &apk_atom_null &&
p->pkg->name->auto_select_virtual == 0 &&
p->pkg->name->ss.requirers == 0 &&
- (p->pkg->provider_priority == 0 && name->providers->num > 1)) {
- dbg_printf(" ignore: virtual package without provider_priority with >1 provider\n");
+ p->pkg->provider_priority == 0) {
+ dbg_printf(" ignore: virtual package without provider_priority\n");
continue;
}
if (compare_providers(ss, p, &chosen) > 0) {
diff --git a/test/provides10.test b/test/provides10.test
index c832b75..91bf295 100644
--- a/test/provides10.test
+++ b/test/provides10.test
@@ -5,6 +5,8 @@ add conflicted-dep
@EXPECT
ERROR: unable to select packages:
conflicted-provider (virtual):
+ note: please select one of the 'provided by'
+ packages explicitly
provided by: conflicted-provider-a
conflicted-provider-b
required by: conflicted-dep-0.1[conflicted-provider]
diff --git a/test/provides11.test b/test/provides11.test
index 54c6b34..c48c33c 100644
--- a/test/provides11.test
+++ b/test/provides11.test
@@ -5,6 +5,8 @@ add conflicted-parent
@EXPECT
ERROR: unable to select packages:
conflicted-provider (virtual):
+ note: please select one of the 'provided by'
+ packages explicitly
provided by: conflicted-provider-a
conflicted-provider-b
required by: conflicted-dep-0.1[conflicted-provider]
diff --git a/test/provides9.test b/test/provides9.test
index ce45a15..8df1bc8 100644
--- a/test/provides9.test
+++ b/test/provides9.test
@@ -4,6 +4,8 @@ add conflicted-provider
@EXPECT
ERROR: unable to select packages:
conflicted-provider (virtual):
+ note: please select one of the 'provided by'
+ packages explicitly
provided by: conflicted-provider-a
conflicted-provider-b
required by: world[conflicted-provider]