Chromium Code Reviews| Index: sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart |
| diff --git a/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart b/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart |
| index 6995889f9b82432b5e2ec5f0f45c7b73d8620dd9..552cc6d7967a1f536ba6aca7b22fe943734e4f4b 100644 |
| --- a/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart |
| +++ b/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart |
| @@ -242,12 +242,19 @@ class BacktrackingSolver { |
| // Bail if there is nothing to backtrack to. |
| if (_selected.isEmpty) return new Future.value(false); |
| - // Get the set of packages that may have led to this failure. |
| + // Mark any packages that may have led to this failure so that we know to |
| + // consider them when backtracking. |
| var dependers = _getTransitiveDependers(failure.package); |
| + for (var selected in _selected) { |
| + if (dependers.contains(selected.current.name)) { |
| + selected.fail(); |
| + } |
| + } |
| + |
| // Advance past the current version of the leaf-most package. |
| advanceVersion() { |
| - _backjump(failure, dependers); |
| + _backjump(failure); |
| var previous = _selected.last.current; |
| return _selected.last.advance().then((success) { |
| if (success) { |
| @@ -274,7 +281,7 @@ class BacktrackingSolver { |
| /// ones can be ignored and jumped over by the backtracker. The only packages |
| /// we need to backtrack to are ones that led (possibly indirectly) to the |
| /// failure. Everything else can be skipped. |
| - void _backjump(SolveFailure failure, Set<String> dependers) { |
| + void _backjump(SolveFailure failure) { |
| for (var i = _selected.length - 1; i >= 0; i--) { |
| // Each queue will never be empty since it gets discarded by _backtrack() |
| // when that happens. |
| @@ -289,18 +296,8 @@ class BacktrackingSolver { |
| continue; |
| } |
| - // If we get to the package that failed, backtrack to here. |
| - if (selected.name == failure.package) { |
| - logSolve('backjump to failed package ${selected.name}'); |
| - _selected.removeRange(i + 1, _selected.length); |
| - return; |
| - } |
| - |
| - // If we get to a package that depends on the failing package, backtrack |
| - // to here. |
| - if (dependers.contains(selected.name)) { |
| - logSolve('backjump to ${selected.name} because it depends on ' |
| - '${failure.package}'); |
| + if (_selected[i].hasFailed) { |
| + logSolve('backjump to ${selected.name}'); |
| _selected.removeRange(i + 1, _selected.length); |
| return; |
|
nweiz
2014/05/12 20:18:55
This return is no longer necessary.
Bob Nystrom
2014/05/12 22:07:55
It is. We're iterating backwards through the list,
|
| } |