summaryrefslogtreecommitdiff
path: root/apt-pkg/solver3.cc
diff options
context:
space:
mode:
Diffstat (limited to 'apt-pkg/solver3.cc')
-rw-r--r--apt-pkg/solver3.cc32
1 files changed, 24 insertions, 8 deletions
diff --git a/apt-pkg/solver3.cc b/apt-pkg/solver3.cc
index a00da5716..6f445328c 100644
--- a/apt-pkg/solver3.cc
+++ b/apt-pkg/solver3.cc
@@ -342,16 +342,23 @@ bool APT::Solver::Enqueue(Var var, bool decision, Var reason)
std::cerr << "[" << depth() << "] " << (decision ? "Install" : "Reject") << ":" << var.toString(cache) << " (" << WhyStr(state.reason) << ")\n";
solved.push_back(Solved{var, std::nullopt});
+ propQ.push(var);
if (not decision)
- {
- if (not PropagateReject(var))
- return false;
needsRescore = true;
- }
- else
+
+ return true;
+}
+
+bool APT::Solver::Propagate()
+{
+ while (!propQ.empty())
{
- if (not PropagateInstall(var))
+ Var var = propQ.front();
+ propQ.pop();
+ if ((*this)[var].decision == Decision::MUST && not PropagateInstall(var))
+ return false;
+ else if ((*this)[var].decision == Decision::MUSTNOT && not PropagateReject(var))
return false;
}
return true;
@@ -822,8 +829,17 @@ void APT::Solver::RescoreWorkIfNeeded()
bool APT::Solver::Solve()
{
- while (not work.empty())
+ while (true)
{
+ while (not Propagate())
+ {
+ if (not Pop())
+ return false;
+ }
+
+ if (work.empty())
+ break;
+
// Rescore the work if we need to
RescoreWorkIfNeeded();
// *NOW* we can pop the item.
@@ -993,7 +1009,7 @@ bool APT::Solver::FromDepCache(pkgDepCache &depcache)
}
}
- return true;
+ return Propagate();
}
bool APT::Solver::ToDepCache(pkgDepCache &depcache)