| 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 882ef36228e294cb5bc1b0796d341f1f6220bad0..d1f687ee9beaf0ad59ae48bc4c6fe73df592e10d 100644
|
| --- a/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
|
| +++ b/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
|
| @@ -55,13 +55,19 @@ import 'version_solver.dart';
|
| class BacktrackingSolver {
|
| final SourceRegistry sources;
|
| final Package root;
|
| +
|
| + /// The lockfile that was present before solving.
|
| final LockFile lockFile;
|
| +
|
| final PubspecCache cache;
|
|
|
| /// The set of packages that are being explicitly upgraded. The solver will
|
| /// only allow the very latest version for each of these packages.
|
| final _forceLatest = new Set<String>();
|
|
|
| + /// If this is set, the contents of [lockFile] are ignored while solving.
|
| + final bool _upgradeAll;
|
| +
|
| /// The set of packages whose dependecy is being overridden by the root
|
| /// package, keyed by the name of the package.
|
| ///
|
| @@ -93,12 +99,12 @@ class BacktrackingSolver {
|
| var _attemptedSolutions = 1;
|
|
|
| BacktrackingSolver(SourceRegistry sources, this.root, this.lockFile,
|
| - List<String> useLatest)
|
| + List<String> useLatest, {bool upgradeAll: false})
|
| : sources = sources,
|
| - cache = new PubspecCache(sources) {
|
| + cache = new PubspecCache(sources),
|
| + _upgradeAll = upgradeAll {
|
| for (var package in useLatest) {
|
| - forceLatestVersion(package);
|
| - lockFile.packages.remove(package);
|
| + _forceLatest.add(package);
|
| }
|
|
|
| for (var override in root.dependencyOverrides) {
|
| @@ -126,12 +132,14 @@ class BacktrackingSolver {
|
| _validateSdkConstraint(root.pubspec);
|
| return _traverseSolution();
|
| }).then((packages) {
|
| - return new SolveResult(packages, overrides, null, attemptedSolutions);
|
| + return new SolveResult.success(sources, root, lockFile, packages,
|
| + overrides, _getAvailableVersions(packages), attemptedSolutions);
|
| }).catchError((error) {
|
| if (error is! SolveFailure) throw error;
|
|
|
| // Wrap a failure in a result so we can attach some other data.
|
| - return new SolveResult(null, overrides, error, attemptedSolutions);
|
| + return new SolveResult.failure(sources, root, lockFile, overrides,
|
| + error, attemptedSolutions);
|
| }).whenComplete(() {
|
| // Gather some solving metrics.
|
| var buffer = new StringBuffer();
|
| @@ -148,8 +156,30 @@ class BacktrackingSolver {
|
| });
|
| }
|
|
|
| - void forceLatestVersion(String package) {
|
| - _forceLatest.add(package);
|
| + /// Generates a map containing all of the known available versions for each
|
| + /// package in [packages].
|
| + ///
|
| + /// The version list may not always be complete. The the package is the root
|
| + /// root package, or its a package that we didn't unlock while solving
|
| + /// because we weren't trying to upgrade it, we will just know the current
|
| + /// version.
|
| + Map<String, List<Version>> _getAvailableVersions(List<PackageId> packages) {
|
| + var availableVersions = new Map<String, List<Version>>();
|
| + for (var package in packages) {
|
| + var cached = cache.getCachedVersions(package.toRef());
|
| + var versions;
|
| + if (cached != null) {
|
| + versions = cached.map((id) => id.version).toList();
|
| + } else {
|
| + // If the version list was never requested, just use the one known
|
| + // version.
|
| + versions = [package.version];
|
| + }
|
| +
|
| + availableVersions[package.name] = versions;
|
| + }
|
| +
|
| + return availableVersions;
|
| }
|
|
|
| /// Adds [versions], which is the list of all allowed versions of a given
|
| @@ -179,7 +209,12 @@ class BacktrackingSolver {
|
|
|
| /// Gets the version of [package] currently locked in the lock file. Returns
|
| /// `null` if it isn't in the lockfile (or has been unlocked).
|
| - PackageId getLocked(String package) => lockFile.packages[package];
|
| + PackageId getLocked(String package) {
|
| + if (_upgradeAll) return null;
|
| + if (_forceLatest.contains(package)) return null;
|
| +
|
| + return lockFile.packages[package];
|
| + }
|
|
|
| /// Traverses the root package's dependency graph using the current potential
|
| /// solution. If successful, completes to the solution. If not, backtracks
|
| @@ -335,10 +370,11 @@ class BacktrackingSolver {
|
| buffer.writeln("Solving dependencies:");
|
| for (var package in root.dependencies) {
|
| buffer.write("- $package");
|
| + var locked = getLocked(package.name);
|
| if (_forceLatest.contains(package.name)) {
|
| buffer.write(" (use latest)");
|
| - } else if (lockFile.packages.containsKey(package.name)) {
|
| - var version = lockFile.packages[package.name].version;
|
| + } else if (locked != null) {
|
| + var version = locked.version;
|
| buffer.write(" (locked to $version)");
|
| }
|
| buffer.writeln();
|
|
|