summaryrefslogtreecommitdiff
path: root/apt-pkg
diff options
context:
space:
mode:
authorJulian Andres Klode <julian.klode@canonical.com>2025-03-12 20:21:42 +0100
committerJulian Andres Klode <julian.klode@canonical.com>2025-03-13 21:59:09 +0100
commit8ae73d1e037a6b9cb258b1ca505abce5681d9931 (patch)
tree181d99da8c0dbde0304ca57bd072143bbb97ef56 /apt-pkg
parent1bc3055b737f2e9732a009026f4fe2a322ef7607 (diff)
solver3: Only hide ver->pkg clauses, not pkg->ver version selection ones
Particularly as Helmut pointed out we need to show which version we selected for install if there is only one but there is a versioned conflicts. Reported-By: Helmut Grohne <helmut@subdivi.de> on IRC
Diffstat (limited to 'apt-pkg')
-rw-r--r--apt-pkg/solver3.cc18
1 files changed, 14 insertions, 4 deletions
diff --git a/apt-pkg/solver3.cc b/apt-pkg/solver3.cc
index cebface27..4030b9de1 100644
--- a/apt-pkg/solver3.cc
+++ b/apt-pkg/solver3.cc
@@ -249,8 +249,17 @@ std::string APT::Solver::Clause::toString(pkgCache &cache, bool pretty) const
out.append(" | ");
}
}
- else if (group == Group::SelectVersion && negative)
+ else if (pretty && group == Group::SelectVersion && negative)
out.append(" conflicts with other versions of itself");
+ else if (pretty && group == Group::SelectVersion && reason.Pkg()) {
+ out.append(solutions.size() > 1 ? " is available in versions " : " is available in version ");
+ for (auto var : solutions) {
+ assert(var.Ver());
+ if (var != solutions.front())
+ out.append(", ");
+ out.append(var.Ver(cache).VerStr());
+ }
+ }
else
{
out.append(" -> ");
@@ -349,8 +358,9 @@ std::string APT::Solver::LongWhyStr(Var var, bool decision, const Clause *rclaus
}
};
- // Version selection clauses like pkg=ver -> pkg or pkg -> pkg=ver are irrelevant for the user, skip them
- if (decision && rclause && rclause->group == Group::SelectVersion)
+ // Inverse version selection clauses that select the package if the version is selected,
+ // such as pkg=ver -> pkg, are irrelevant for the user, skip them
+ if (var.Pkg() && decision && rclause && rclause->group == Group::SelectVersion)
{
var = rclause->reason;
rclause = (*this)[var].reason;
@@ -398,7 +408,7 @@ std::string APT::Solver::LongWhyStr(Var var, bool decision, const Clause *rclaus
{
auto const &state = (*this)[*it];
// Don't print version selection clauses
- if (state.reason && state.reason->group == Group::SelectVersion)
+ if (it->Pkg() && state.reason && state.reason->group == Group::SelectVersion)
{
--i;
continue;