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 48b84f2104110c32ef01e3439e179f3a1118e317..6a0a53974f117a2e61dd3e31100fc9a426cde6bb 100644 |
--- a/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart |
+++ b/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart |
@@ -59,6 +59,13 @@ class BacktrackingSolver { |
/// only allow the very latest version for each of these packages. |
final _forceLatest = new Set<String>(); |
+ /// The set of packages whose dependecy is being overridden by the root |
+ /// package, keyed by the name of the package. |
+ /// |
+ /// Any dependency on a package that appears in this map will be overriden |
+ /// to use the one here. |
+ final _overrides = new Map<String, PackageDep>(); |
+ |
/// Every time a package is encountered when traversing the dependency graph, |
/// the solver must select a version for it, sometimes when multiple versions |
/// are valid. This keeps track of which versions have been selected so far |
@@ -83,13 +90,17 @@ class BacktrackingSolver { |
var _attemptedSolutions = 1; |
BacktrackingSolver(SourceRegistry sources, this.root, this.lockFile, |
- List<String> useLatest) |
+ Iterable<PackageDep> overrides, List<String> useLatest) |
: sources = sources, |
cache = new PubspecCache(sources) { |
for (var package in useLatest) { |
forceLatestVersion(package); |
lockFile.packages.remove(package); |
} |
+ |
+ for (var override in overrides) { |
nweiz
2013/11/15 21:57:16
We should probably detect duplicates in the pubspe
Bob Nystrom
2013/11/16 00:19:10
It's parsed from a map like regular dependencies,
|
+ _overrides[override.name] = override; |
+ } |
} |
/// Run the solver. Completes with a list of specific package versions if |
@@ -381,10 +392,25 @@ class Traverser { |
return _solver.cache.getPubspec(id).then((pubspec) { |
_validateSdkConstraint(pubspec); |
- var deps = pubspec.dependencies.toList(); |
+ var deps = pubspec.dependencies.toSet(); |
+ |
+ if (id.isRoot) { |
+ // Include dev dependencies of the root package. |
+ deps.addAll(pubspec.devDependencies); |
- // Include dev dependencies of the root package. |
- if (id.isRoot) deps.addAll(pubspec.devDependencies); |
+ // Add all overrides. This ensures a dependency only present as an |
+ // override is still included. |
+ deps.addAll(_solver._overrides.values); |
+ } |
+ |
+ // Replace any overridden dependencies. |
+ deps = deps.map((dep) { |
+ var override = _solver._overrides[dep.name]; |
+ if (override != null) return override; |
+ |
+ // Not overridden. |
+ return dep; |
+ }); |
// Make sure the package doesn't have any bad dependencies. |
for (var dep in deps) { |