| 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
|
|
|