| Index: lib/src/global_packages.dart
 | 
| diff --git a/lib/src/global_packages.dart b/lib/src/global_packages.dart
 | 
| index dd6865ac6cbb0925f615beffac4afed71500eebe..451a084de50aeac2f1c888c74780731d907843cf 100644
 | 
| --- a/lib/src/global_packages.dart
 | 
| +++ b/lib/src/global_packages.dart
 | 
| @@ -21,9 +21,6 @@ import 'pubspec.dart';
 | 
|  import 'sdk.dart' as sdk;
 | 
|  import 'solver/version_solver.dart';
 | 
|  import 'source/cached.dart';
 | 
| -import 'source/git.dart';
 | 
| -import 'source/hosted.dart';
 | 
| -import 'source/path.dart';
 | 
|  import 'system_cache.dart';
 | 
|  import 'utils.dart';
 | 
|  
 | 
| @@ -80,8 +77,7 @@ class GlobalPackages {
 | 
|    /// Otherwise, the previous ones will be preserved.
 | 
|    Future activateGit(String repo, List<String> executables,
 | 
|        {bool overwriteBinStubs}) async {
 | 
| -    var source = cache.sources["git"] as GitSource;
 | 
| -    var name = await source.getPackageNameFromRepo(repo);
 | 
| +    var name = await cache.git.getPackageNameFromRepo(repo);
 | 
|      // Call this just to log what the current active package is, if any.
 | 
|      _describeActive(name);
 | 
|  
 | 
| @@ -90,7 +86,8 @@ class GlobalPackages {
 | 
|      // be a mechanism for redoing dependency resolution if a path pubspec has
 | 
|      // changed (see also issue 20499).
 | 
|      await _installInCache(
 | 
| -        GitSource.refFor(name, repo).withConstraint(VersionConstraint.any),
 | 
| +        cache.git.source.refFor(name, repo)
 | 
| +            .withConstraint(VersionConstraint.any),
 | 
|          executables, overwriteBinStubs: overwriteBinStubs);
 | 
|    }
 | 
|  
 | 
| @@ -107,8 +104,10 @@ class GlobalPackages {
 | 
|    Future activateHosted(String name, VersionConstraint constraint,
 | 
|        List<String> executables, {bool overwriteBinStubs}) async {
 | 
|      _describeActive(name);
 | 
| -    await _installInCache(HostedSource.refFor(name).withConstraint(constraint),
 | 
| -        executables, overwriteBinStubs: overwriteBinStubs);
 | 
| +    await _installInCache(
 | 
| +        cache.hosted.source.refFor(name).withConstraint(constraint),
 | 
| +        executables,
 | 
| +        overwriteBinStubs: overwriteBinStubs);
 | 
|    }
 | 
|  
 | 
|    /// Makes the local package at [path] globally active.
 | 
| @@ -133,7 +132,7 @@ class GlobalPackages {
 | 
|  
 | 
|      // Write a lockfile that points to the local package.
 | 
|      var fullPath = canonicalize(entrypoint.root.dir);
 | 
| -    var id = PathSource.idFor(name, entrypoint.root.version, fullPath);
 | 
| +    var id = cache.path.source.idFor(name, entrypoint.root.version, fullPath);
 | 
|  
 | 
|      // TODO(rnystrom): Look in "bin" and display list of binaries that
 | 
|      // user can run.
 | 
| @@ -154,7 +153,7 @@ class GlobalPackages {
 | 
|          dependencies: [dep], sources: cache.sources));
 | 
|  
 | 
|      // Resolve it and download its dependencies.
 | 
| -    var result = await resolveVersions(SolveType.GET, cache.sources, root);
 | 
| +    var result = await resolveVersions(SolveType.GET, cache, root);
 | 
|      if (!result.succeeded) {
 | 
|        // If the package specified by the user doesn't exist, we want to
 | 
|        // surface that as a [DataError] with the associated exit code.
 | 
| @@ -175,7 +174,7 @@ class GlobalPackages {
 | 
|  
 | 
|      var lockFile = result.lockFile;
 | 
|      _writeLockFile(dep.name, lockFile);
 | 
| -    writeTextFile(_getPackagesFilePath(dep.name), lockFile.packagesFile());
 | 
| +    writeTextFile(_getPackagesFilePath(dep.name), lockFile.packagesFile(cache));
 | 
|  
 | 
|      _updateBinStubs(entrypoint.packageGraph.packages[dep.name], executables,
 | 
|          overwriteBinStubs: overwriteBinStubs, snapshots: snapshots);
 | 
| @@ -208,7 +207,7 @@ class GlobalPackages {
 | 
|    Future _cacheDependency(PackageId id) async {
 | 
|      if (id.isRoot) return;
 | 
|  
 | 
| -    var source = cache.sources[id.source];
 | 
| +    var source = cache.source(id.source);
 | 
|      if (source is! CachedSource) return;
 | 
|  
 | 
|      await source.downloadToSystemCache(id);
 | 
| @@ -237,11 +236,11 @@ class GlobalPackages {
 | 
|        var id = lockFile.packages[name];
 | 
|  
 | 
|        if (id.source == 'git') {
 | 
| -        var url = GitSource.urlFromDescription(id.description);
 | 
| +        var url = cache.git.source.urlFromDescription(id.description);
 | 
|          log.message('Package ${log.bold(name)} is currently active from Git '
 | 
|              'repository "${url}".');
 | 
|        } else if (id.source == 'path') {
 | 
| -        var path = PathSource.pathFromDescription(id.description);
 | 
| +        var path = cache.path.source.pathFromDescription(id.description);
 | 
|          log.message('Package ${log.bold(name)} is currently active at path '
 | 
|              '"$path".');
 | 
|        } else {
 | 
| @@ -303,19 +302,19 @@ class GlobalPackages {
 | 
|      var id = lockFile.packages[name];
 | 
|      lockFile = lockFile.removePackage(name);
 | 
|  
 | 
| -    var source = cache.sources[id.source];
 | 
| +    var source = cache.source(id.source);
 | 
|      var entrypoint;
 | 
|      if (source is CachedSource) {
 | 
|        // For cached sources, the package itself is in the cache and the
 | 
|        // lockfile is the one we just loaded.
 | 
|        entrypoint = new Entrypoint.inMemory(
 | 
| -          cache.sources.load(id), lockFile, cache, isGlobal: true);
 | 
| +          cache.load(id), lockFile, cache, isGlobal: true);
 | 
|      } else {
 | 
|        // For uncached sources (i.e. path), the ID just points to the real
 | 
|        // directory for the package.
 | 
|        assert(id.source == "path");
 | 
|        entrypoint = new Entrypoint(
 | 
| -          PathSource.pathFromDescription(id.description), cache,
 | 
| +          cache.path.source.pathFromDescription(id.description), cache,
 | 
|            isGlobal: true);
 | 
|      }
 | 
|  
 | 
| @@ -408,10 +407,10 @@ class GlobalPackages {
 | 
|    /// Returns formatted string representing the package [id].
 | 
|    String _formatPackage(PackageId id) {
 | 
|      if (id.source == 'git') {
 | 
| -      var url = GitSource.urlFromDescription(id.description);
 | 
| +      var url = cache.sources.git.urlFromDescription(id.description);
 | 
|        return '${log.bold(id.name)} ${id.version} from Git repository "$url"';
 | 
|      } else if (id.source == 'path') {
 | 
| -      var path = PathSource.pathFromDescription(id.description);
 | 
| +      var path = cache.sources.path.pathFromDescription(id.description);
 | 
|        return '${log.bold(id.name)} ${id.version} at path "$path"';
 | 
|      } else {
 | 
|        return '${log.bold(id.name)} ${id.version}';
 | 
| 
 |