diff options
| author | Julian Andres Klode <jak@debian.org> | 2025-05-19 14:17:23 +0200 |
|---|---|---|
| committer | Julian Andres Klode <jak@debian.org> | 2025-05-19 15:20:09 +0000 |
| commit | 7724d170751b3dc1717ba7a08881437cf7151996 (patch) | |
| tree | 9f76923fbd5b856904a414fa615116940d2afff6 /apt-pkg/solver3.cc | |
| parent | 2ddc16b9f8edff1329f5ac3e46b0c0cf9bde661d (diff) | |
Introduce apt why, apt why-not
These are implemented somewhat differently from aptitudes
why and why-not commands: They produce the actual solver
trace for why a particular decision has been taken.
For the why-not case, we need to explicitly discover our
specified package, as if nothing else depends on it in
our graph, it would otherwise always be undiscovered and
conflicts not detected (see e.g. level-3 in the test).
Diffstat (limited to 'apt-pkg/solver3.cc')
| -rw-r--r-- | apt-pkg/solver3.cc | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/apt-pkg/solver3.cc b/apt-pkg/solver3.cc index 620156ac3..abc0af314 100644 --- a/apt-pkg/solver3.cc +++ b/apt-pkg/solver3.cc @@ -1267,3 +1267,23 @@ bool APT::Solver::ToDepCache(pkgDepCache &depcache) const } return true; } + +// Command-line +std::string APT::Solver::InternalCliWhy(pkgDepCache &cache, pkgCache::PkgIterator pkg, bool decision) +{ + APT::Solver solver(cache.GetCache(), cache.GetPolicy(), EDSP::Request::Flags(0)); + // In case nothing has a positive dependency on pkg it may not actually be discovered in a `why-not` + // scenario, so make sure we discover it explicitly. + solver.Discover(Var(pkg)); + if (not solver.FromDepCache(cache) || not solver.Solve()) + return ""; + std::unordered_set<Var> seen; + std::string buf; + if (solver[Var(pkg)].decision == Decision::NONE) + return strprintf(buf, "%s is undecided\n", pkg.FullName().c_str()), buf; + if (decision && solver[Var(pkg)].decision != Decision::MUST) + return strprintf(buf, "%s is not actually marked for install\n", pkg.FullName().c_str()), buf; + if (not decision && solver[Var(pkg)].decision == Decision::MUST) + return strprintf(buf, "%s is actually marked for install\n", pkg.FullName().c_str()), buf; + return solver.LongWhyStr(Var(pkg), decision, solver[Var(pkg)].reason, "", seen); +} |
