| Index: test/version_solver_test.dart | 
| diff --git a/test/version_solver_test.dart b/test/version_solver_test.dart | 
| index 7d8da5d532a0d01f62a64651d2cd41816f10076a..da890621771fb360d7b4ffcbca2ab8b7893c168c 100644 | 
| --- a/test/version_solver_test.dart | 
| +++ b/test/version_solver_test.dart | 
| @@ -12,6 +12,7 @@ import 'package:pub/src/sdk.dart' as sdk; | 
| import 'package:pub/src/solver/version_solver.dart'; | 
| import 'package:pub/src/source.dart'; | 
| import 'package:pub/src/source/cached.dart'; | 
| +import 'package:pub/src/source_registry.dart'; | 
| import 'package:pub/src/system_cache.dart'; | 
| import 'package:pub/src/utils.dart'; | 
| import 'package:pub_semver/pub_semver.dart'; | 
| @@ -652,7 +653,7 @@ backtracking() { | 
| 'c 5.0.0': {}, | 
| }, result: { | 
| 'myapp from root': '0.0.0', | 
| -    'a': '1.0.0', | 
| +    'a-x': '1.0.0', | 
| 'b': '1.0.0', | 
| 'c': '5.0.0' | 
| }, maxTries: 2); | 
| @@ -1121,8 +1122,8 @@ testResolve(String description, Map packages, { | 
| // Build the test package graph. | 
| var root; | 
| packages.forEach((description, dependencies) { | 
| -      var id = parseSpec(description); | 
| -      var package = mockPackage(id, dependencies, | 
| +      var id = parseSpec(cache.sources, description); | 
| +      var package = mockPackage(cache.sources, id, dependencies, | 
| id.name == 'myapp' ? overrides : null); | 
| if (id.name == 'myapp') { | 
| // Don't add the root package to the server, so we can verify that Pub | 
| @@ -1139,7 +1140,7 @@ testResolve(String description, Map packages, { | 
| if (result != null) { | 
| var newResult = {}; | 
| result.forEach((description, version) { | 
| -        var id = parseSpec(description, version); | 
| +        var id = parseSpec(cache.sources, description, version); | 
| newResult[id.name] = id; | 
| }); | 
| result = newResult; | 
| @@ -1148,12 +1149,12 @@ testResolve(String description, Map packages, { | 
| // Parse the lockfile. | 
| var realLockFile; | 
| if (lockfile == null) { | 
| -      realLockFile = new LockFile.empty(cache.sources); | 
| +      realLockFile = new LockFile.empty(); | 
| } else { | 
| realLockFile = new LockFile(lockfile.keys.map((name) { | 
| var version = new Version.parse(lockfile[name]); | 
| -        return new PackageId(name, source1.name, version, name); | 
| -      }), cache.sources); | 
| +        return new PackageId(name, source1, version, name); | 
| +      })); | 
| } | 
|  | 
| // Resolve the versions. | 
| @@ -1358,13 +1359,15 @@ class MockSource extends Source { | 
| BoundSource bind(SystemCache cache) => new BoundMockSource(this, cache); | 
|  | 
| PackageRef parseRef(String name, description, {String containingPath}) => | 
| -      new PackageRef(name, this.name, description); | 
| +      new PackageRef(name, this, description); | 
|  | 
| PackageId parseId(String name, Version version, description) => | 
| -      new PackageId(name, this.name, version, description); | 
| +      new PackageId(name, this, version, description); | 
|  | 
| bool descriptionsEqual(description1, description2) => | 
| description1 == description2; | 
| + | 
| +  int hashDescription(description) => description.hashCode; | 
| } | 
|  | 
| class BoundMockSource extends CachedSource { | 
| @@ -1403,8 +1406,7 @@ class BoundMockSource extends CachedSource { | 
| } | 
|  | 
| return _packages[ref.description].values.map((package) { | 
| -      return new PackageId( | 
| -          ref.name, source.name, package.version, ref.description); | 
| +      return new PackageId(ref.name, source, package.version, ref.description); | 
| }).toList(); | 
| } | 
|  | 
| @@ -1438,7 +1440,8 @@ class BoundMockSource extends CachedSource { | 
| } | 
| } | 
|  | 
| -Package mockPackage(PackageId id, Map dependencyStrings, Map overrides) { | 
| +Package mockPackage(SourceRegistry sources, PackageId id, Map dependencyStrings, | 
| +    Map overrides) { | 
| var sdkConstraint = null; | 
|  | 
| // Build the pubspec dependencies. | 
| @@ -1451,7 +1454,7 @@ Package mockPackage(PackageId id, Map dependencyStrings, Map overrides) { | 
| spec = spec.substring("(dev) ".length); | 
| } | 
|  | 
| -    var dep = parseSpec(spec).withConstraint( | 
| +    var dep = parseSpec(sources, spec).withConstraint( | 
| new VersionConstraint.parse(constraint)); | 
|  | 
| if (dep.name == 'sdk') { | 
| @@ -1469,8 +1472,8 @@ Package mockPackage(PackageId id, Map dependencyStrings, Map overrides) { | 
| var dependencyOverrides = <PackageDep>[]; | 
| if (overrides != null) { | 
| overrides.forEach((spec, constraint) { | 
| -      dependencyOverrides.add(parseSpec(spec).withConstraint( | 
| -          new VersionConstraint.parse(constraint))); | 
| +      dependencyOverrides.add(parseSpec(sources, spec) | 
| +          .withConstraint(new VersionConstraint.parse(constraint))); | 
| }); | 
| } | 
|  | 
| @@ -1497,7 +1500,7 @@ Package mockPackage(PackageId id, Map dependencyStrings, Map overrides) { | 
| /// | 
| /// The "from mock" optional suffix is the name of a source for the package. | 
| /// If omitted, it defaults to "mock1". | 
| -PackageId parseSpec(String text, [String version]) { | 
| +PackageId parseSpec(SourceRegistry sources, String text, [String version]) { | 
| var pattern = new RegExp(r"(([a-z_]*)(-[a-z_]+)?)( ([^ ]+))?( from (.*))?$"); | 
| var match = pattern.firstMatch(text); | 
| if (match == null) { | 
| @@ -1523,11 +1526,8 @@ PackageId parseSpec(String text, [String version]) { | 
| } | 
| } | 
|  | 
| -  var source = "mock1"; | 
| -  if (match[7] != null) { | 
| -    source = match[7]; | 
| -    if (source == "root") source = null; | 
| -  } | 
| +  var source = sources["mock1"]; | 
| +  if (match[7] != null) source = match[7] == "root" ? null : sources[match[7]]; | 
|  | 
| return new PackageId(name, source, parsedVersion, description); | 
| } | 
|  |