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