Index: sdk/lib/_internal/pub/lib/src/solver/version_solver.dart |
diff --git a/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart b/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart |
index 1c46c14896067e0d0fb04c448391af637d8526c1..0a10c9da6f156f338a91d88ade9f6e55b733f9f3 100644 |
--- a/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart |
+++ b/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart |
@@ -181,22 +181,21 @@ class PubspecCache { |
} |
/// Loads the pubspec for the package identified by [id]. |
- Future<Pubspec> getPubspec(PackageId id) { |
+ Future<Pubspec> getPubspec(PackageId id) async { |
_explicitlyCached.add(id); |
// Complete immediately if it's already cached. |
if (_pubspecs.containsKey(id)) { |
_pubspecCacheHits++; |
- return new Future<Pubspec>.value(_pubspecs[id]); |
+ return _pubspecs[id]; |
} |
_pubspecCacheMisses++; |
var source = _sources[id.source]; |
- return source.describe(id).then((pubspec) { |
- _pubspecs[id] = pubspec; |
- return pubspec; |
- }); |
+ var pubspec = await source.describe(id); |
+ _pubspecs[id] = pubspec; |
+ return pubspec; |
} |
/// Returns the previously cached pubspec for the package identified by [id] |
@@ -210,7 +209,7 @@ class PubspecCache { |
/// versions (i.e. ones without a prerelease suffix) before pre-release |
/// versions. This ensures that the solver prefers stable packages over |
/// unstable ones. |
- Future<List<PackageId>> getVersions(PackageRef package) { |
+ Future<List<PackageId>> getVersions(PackageRef package) async { |
if (package.isRoot) { |
throw new StateError("Cannot get versions for root package $package."); |
} |
@@ -219,43 +218,45 @@ class PubspecCache { |
var versions = _versions[package]; |
if (versions != null) { |
_versionCacheHits++; |
- return new Future.value(versions); |
+ return versions; |
} |
// See if we cached a failure. |
var error = _versionErrors[package]; |
if (error != null) { |
_versionCacheHits++; |
- return new Future.error(error.first, error.last); |
+ await new Future.error(error.first, error.last); |
} |
_versionCacheMisses++; |
var source = _sources[package.source]; |
- return source.getVersions(package.name, package.description) |
- .then((pubspecs) { |
- // Sort by priority so we try preferred versions first. |
- pubspecs.sort((pubspec1, pubspec2) { |
- return _type == SolveType.DOWNGRADE |
- ? Version.antiprioritize(pubspec1.version, pubspec2.version) |
- : Version.prioritize(pubspec1.version, pubspec2.version); |
- }); |
- |
- var ids = pubspecs.reversed.map((pubspec) { |
- var id = package.atVersion(pubspec.version); |
- // Eagerly cache the pubspec now since we have it. |
- _pubspecs[id] = pubspec; |
- return id; |
- }).toList(); |
- _versions[package] = ids; |
- return ids; |
- }).catchError((error, trace) { |
+ var pubspecs; |
+ try { |
+ pubspecs = await source.getVersions(package.name, package.description); |
+ } catch (error, stackTrace) { |
// If an error occurs, cache that too. We only want to do one request |
// for any given package, successful or not. |
- log.solver("Could not get versions for $package:\n$error\n\n$trace"); |
- _versionErrors[package] = new Pair(error, new Chain.forTrace(trace)); |
+ log.solver("Could not get versions for $package:\n$error\n\n$stackTrace"); |
+ _versionErrors[package] = new Pair(error, new Chain.forTrace(stackTrace)); |
throw error; |
+ } |
+ |
+ // Sort by priority so we try preferred versions first. |
+ pubspecs.sort((pubspec1, pubspec2) { |
+ return _type == SolveType.DOWNGRADE |
+ ? Version.antiprioritize(pubspec1.version, pubspec2.version) |
+ : Version.prioritize(pubspec1.version, pubspec2.version); |
}); |
+ |
+ var ids = pubspecs.reversed.map((pubspec) { |
+ var id = package.atVersion(pubspec.version); |
+ // Eagerly cache the pubspec now since we have it. |
+ _pubspecs[id] = pubspec; |
+ return id; |
+ }).toList(); |
+ _versions[package] = ids; |
+ return ids; |
} |
/// Returns the previously cached list of versions for the package identified |