diff options
| author | Julian Andres Klode <julian.klode@canonical.com> | 2025-02-11 22:03:03 +0100 |
|---|---|---|
| committer | Julian Andres Klode <julian.klode@canonical.com> | 2025-02-14 19:08:45 +0100 |
| commit | 3ae41a76c19e5ad05600188de43b46c3e2800676 (patch) | |
| tree | 338626cb24601c36be38990408b9c15679d04083 | |
| parent | fdc8682db546077cb24b2cc8861b2d5e4eee9da5 (diff) | |
solver3: Pass EDSP flags directly rather than via config
This was a rather silly way to communicate state, and it was
in the wrong place. Notably also, multiple calls to the solver
had the options sticky, that is, if you run upgrade and then
it calls ResolveByKeep(), for example.
| -rw-r--r-- | apt-pkg/edsp.cc | 4 | ||||
| -rw-r--r-- | apt-pkg/solver3.cc | 5 | ||||
| -rw-r--r-- | apt-pkg/solver3.h | 10 | ||||
| -rw-r--r-- | apt-pkg/upgrade.cc | 5 |
4 files changed, 11 insertions, 13 deletions
diff --git a/apt-pkg/edsp.cc b/apt-pkg/edsp.cc index dd9ae18fc..bf96dd35c 100644 --- a/apt-pkg/edsp.cc +++ b/apt-pkg/edsp.cc @@ -756,11 +756,11 @@ bool EDSP::ResolveExternal(const char* const solver, pkgDepCache &Cache, unsigned int const flags, OpProgress *Progress) { if (strstr(solver, "3.") == solver) { - APT::Solver s(Cache.GetCache(), Cache.GetPolicy()); + APT::Solver s(Cache.GetCache(), Cache.GetPolicy(), (EDSP::Request::Flags) flags); FileFd output; bool res = true; if (Progress != NULL) - Progress->OverallProgress(0, 100, 1, _config->FindB("APT::Solver::Upgrade") ? _("Calculating upgrade") : _("Solving dependencies")); + Progress->OverallProgress(0, 100, 1, (flags & EDSP::Request::UPGRADE_ALL) ? _("Calculating upgrade") : _("Solving dependencies")); if (res && not s.FromDepCache(Cache)) res = false; if (Progress != NULL) diff --git a/apt-pkg/solver3.cc b/apt-pkg/solver3.cc index d7a468227..8d80dfb3c 100644 --- a/apt-pkg/solver3.cc +++ b/apt-pkg/solver3.cc @@ -195,7 +195,7 @@ class DefaultRootSetFunc2 : public pkgDepCache::DefaultRootSetFunc }; // FIXME: DEDUP with pkgDepCache. /*}}}*/ -APT::Solver::Solver(pkgCache &cache, pkgDepCache::Policy &policy) +APT::Solver::Solver(pkgCache &cache, pkgDepCache::Policy &policy, EDSP::Request::Flags requestFlags) : cache(cache), policy(policy), rootState(new State), @@ -203,7 +203,8 @@ APT::Solver::Solver(pkgCache &cache, pkgDepCache::Policy &policy) verStates(cache), pkgObsolete(cache), priorities(cache), - candidates(cache) + candidates(cache), + requestFlags(requestFlags) { // Ensure trivially static_assert(std::is_trivially_destructible_v<Work>); diff --git a/apt-pkg/solver3.h b/apt-pkg/solver3.h index 93e4e5116..796f198b1 100644 --- a/apt-pkg/solver3.h +++ b/apt-pkg/solver3.h @@ -14,6 +14,7 @@ #include <apt-pkg/configuration.h> #include <apt-pkg/depcache.h> +#include <apt-pkg/edsp.h> #include <apt-pkg/pkgcache.h> #include <apt-pkg/policy.h> @@ -216,6 +217,7 @@ class Solver // \brief The time we called Solve() time_t startTime; + EDSP::Request::Flags requestFlags; /// Various configuration options std::string version{_config->Find("APT::Solver", "3.0")}; // \brief Debug level @@ -223,13 +225,13 @@ class Solver // \brief If set, we try to keep automatically installed packages installed. bool KeepAuto{version == "3.0" || not _config->FindB("APT::Get::AutomaticRemove")}; // \brief Determines if we are in upgrade mode. - bool IsUpgrade{_config->FindB("APT::Solver::Upgrade", false)}; + bool IsUpgrade{_config->FindB("APT::Solver::Upgrade", requestFlags &EDSP::Request::UPGRADE_ALL)}; // \brief If set, removals are allowed. - bool AllowRemove{_config->FindB("APT::Solver::Remove", true)}; + bool AllowRemove{_config->FindB("APT::Solver::Remove", not(requestFlags & EDSP::Request::FORBID_REMOVE))}; // \brief If set, removal of manual packages is allowed. bool AllowRemoveManual{AllowRemove && _config->FindB("APT::Solver::RemoveManual", false)}; // \brief If set, installs are allowed. - bool AllowInstall{_config->FindB("APT::Solver::Install", true)}; + bool AllowInstall{_config->FindB("APT::Solver::Install", not(requestFlags & EDSP::Request::FORBID_NEW_INSTALL))}; // \brief If set, we use strict pinning. bool StrictPinning{_config->FindB("APT::Solver::Strict-Pinning", true)}; // \brief If set, we install missing recommends and pick new best packages. @@ -273,7 +275,7 @@ class Solver void RescoreWorkIfNeeded(); // \brief Basic solver initializer. This cannot fail. - Solver(pkgCache &Cache, pkgDepCache::Policy &Policy); + Solver(pkgCache &Cache, pkgDepCache::Policy &Policy, EDSP::Request::Flags requestFlags); // Assume that the variable is decided as specified. [[nodiscard]] bool Assume(Var var, bool decision, Var reason); diff --git a/apt-pkg/upgrade.cc b/apt-pkg/upgrade.cc index ac0b71cdf..fad47838c 100644 --- a/apt-pkg/upgrade.cc +++ b/apt-pkg/upgrade.cc @@ -312,11 +312,6 @@ bool pkgMinimizeUpgrade(pkgDepCache &Cache) // APT::Upgrade::Upgrade - Upgrade using a specific strategy /*{{{*/ bool APT::Upgrade::Upgrade(pkgDepCache &Cache, int mode, OpProgress * const Progress) { - _config->Set("APT::Solver::Upgrade", "true"); - if (mode & FORBID_REMOVE_PACKAGES) - _config->Set("APT::Solver::Remove", "false"); - if (mode & FORBID_INSTALL_NEW_PACKAGES) - _config->Set("APT::Solver::Install", "false"); if (mode == ALLOW_EVERYTHING) return pkgDistUpgrade(Cache, Progress); else if ((mode & ~FORBID_REMOVE_PACKAGES) == 0) |
