Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(117)

Unified Diff: sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart

Issue 103453005: Show detailed report on upgrade. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Revise again. Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();

Powered by Google App Engine
This is Rietveld 408576698