Index: utils/pub/solver/backtracking_solver.dart |
diff --git a/utils/pub/solver/backtracking_solver.dart b/utils/pub/solver/backtracking_solver.dart |
index 0a583e2f6077cac765d207b3bf92181ea04d19de..81666a664de7304bb51fc16ada9ba60a300d7d32 100644 |
--- a/utils/pub/solver/backtracking_solver.dart |
+++ b/utils/pub/solver/backtracking_solver.dart |
@@ -175,7 +175,7 @@ class BacktrackingVersionSolver extends VersionSolver { |
return true; |
} |
- logSolve('${previous} is last version, backtracking'); |
+ logSolve('$previous is last version, backtracking'); |
// That package has no more versions, so pop it and try the next one. |
_selected.removeLast(); |
@@ -189,40 +189,41 @@ class BacktrackingVersionSolver extends VersionSolver { |
/// Returns a string describing the dependency chain if it does, or `null` if |
/// there is no dependency. |
String _getDependencyPath(PackageId depender, String dependent) { |
+ // TODO(rnystrom): This is O(n^2) where n is the number of selected |
+ // packages. Could store the reverse dependency graph to address that. If |
+ // we do that, we need to make sure it gets correctly rolled back when |
+ // backtracking occurs. |
var visited = new Set<String>(); |
- var resultPath; |
- var currentPath = '${depender.name}'; |
+ var currentPath = depender.name; |
nweiz
2013/04/17 00:59:55
I think my comment on this may have been swallowed
Bob Nystrom
2013/04/17 17:11:03
Oh, now I see. I read that earlier comment as just
|
walkDeps(PackageId package) { |
- if (visited.contains(package.name)) return false; |
+ if (visited.contains(package.name)) return null; |
visited.add(package.name); |
var pubspec = cache.getCachedPubspec(package); |
- if (pubspec == null) return false; |
+ if (pubspec == null) return null; |
for (var dep in pubspec.dependencies) { |
var previousPath = currentPath; |
currentPath = '$currentPath -> ${dep.name}'; |
- if (dep.name == dependent) { |
- resultPath = currentPath; |
- return true; |
- } |
+ if (dep.name == dependent) return currentPath; |
var selected = getSelected(dep.name); |
// Ignore unselected dependencies. We haven't traversed into them yet, |
// so they can't affect backjumping. |
if (selected == null) continue; |
- if (walkDeps(selected)) return true; |
+ var depPath = walkDeps(selected); |
+ if (depPath != null) return depPath; |
currentPath = previousPath; |
} |
- return false; |
+ return null; |
} |
- return walkDeps(depender) ? resultPath : null; |
+ return walkDeps(depender); |
} |
/// Logs [message] in the context of the current selected packages. If |
@@ -232,13 +233,8 @@ class BacktrackingVersionSolver extends VersionSolver { |
if (_selected.isEmpty) { |
message = "* start at root"; |
} else { |
- var versions = _selected.last.map((id) => id.version).toList(); |
- if (versions.length > 5) { |
- versions = versions.take(5).join(', ') + '...'; |
- } else { |
- versions = versions.join(', '); |
- } |
- message = "* select ${_selected.last.first} (from $versions)"; |
+ var count = _selected.last.length; |
+ message = "* select ${_selected.last.first} ($count versions)"; |
} |
} else { |
// Otherwise, indent it under the current selected package. |
@@ -327,6 +323,8 @@ class Traverser { |
// If it fails for any reason, just treat that as no versions. This |
// will sort this reference higher so that we can traverse into it |
// and report the error more properly. |
+ log.solver("Could not get versions for $ref:\n$error\n\n" |
+ "${getAttachedStackTrace(error)}"); |
return new Pair<PackageRef, int>(ref, 0); |
}); |
} |