| Index: utils/pub/hosted_source.dart | 
| diff --git a/utils/pub/hosted_source.dart b/utils/pub/hosted_source.dart | 
| index 4b515aca4f2f5571015a3f337fb3f005b62db6e6..45867e5f924316a02b9d17e9460572780400f5b5 100644 | 
| --- a/utils/pub/hosted_source.dart | 
| +++ b/utils/pub/hosted_source.dart | 
| @@ -4,8 +4,9 @@ | 
|  | 
| library hosted_source; | 
|  | 
| +import 'dart:async'; | 
| import 'dart:io' as io; | 
| -import 'dart:json'; | 
| +import 'dart:json' as json; | 
| import 'dart:uri'; | 
|  | 
| // TODO(nweiz): Make this import better. | 
| @@ -35,9 +36,11 @@ class HostedSource extends Source { | 
| var parsed = _parseDescription(description); | 
| var fullUrl = "${parsed.last}/packages/${parsed.first}.json"; | 
|  | 
| -    return httpClient.read(fullUrl).transform((body) { | 
| -      var doc = JSON.parse(body); | 
| -      return doc['versions'].map((version) => new Version.parse(version)); | 
| +    return httpClient.read(fullUrl).then((body) { | 
| +      var doc = json.parse(body); | 
| +      return doc['versions'] | 
| +          .mappedBy((version) => new Version.parse(version)) | 
| +          .toList(); | 
| }).transformException((ex) { | 
| _throwFriendlyError(ex, parsed.first, parsed.last); | 
| }); | 
| @@ -50,7 +53,7 @@ class HostedSource extends Source { | 
| var fullUrl = "${parsed.last}/packages/${parsed.first}/versions/" | 
| "${id.version}.yaml"; | 
|  | 
| -    return httpClient.read(fullUrl).transform((yaml) { | 
| +    return httpClient.read(fullUrl).then((yaml) { | 
| return new Pubspec.parse(yaml, systemCache.sources); | 
| }).transformException((ex) { | 
| _throwFriendlyError(ex, id, parsed.last); | 
| @@ -71,18 +74,18 @@ class HostedSource extends Source { | 
| var tempDir; | 
| return Futures.wait([ | 
| httpClient.send(new http.Request("GET", new Uri.fromString(fullUrl))) | 
| -          .transform((response) => response.stream), | 
| +          .then((response) => response.stream), | 
| systemCache.createTempDir() | 
| -    ]).chain((args) { | 
| +    ]).then((args) { | 
| tempDir = args[1]; | 
| return timeout(extractTarGz(args[0], tempDir), HTTP_TIMEOUT, | 
| 'fetching URL "$fullUrl"'); | 
| -    }).chain((_) { | 
| +    }).then((_) { | 
| // Now that the install has succeeded, move it to the real location in | 
| // the cache. This ensures that we don't leave half-busted ghost | 
| // directories in the user's pub cache if an install fails. | 
| return renameDir(tempDir, destPath); | 
| -    }).transform((_) => true); | 
| +    }).then((_) => true); | 
| } | 
|  | 
| /// The system cache directory for the hosted source contains subdirectories | 
|  |