| Index: utils/pub/source.dart
 | 
| diff --git a/utils/pub/source.dart b/utils/pub/source.dart
 | 
| index 8dbe1546343583b5c54c6e0de676f2de8e451b99..4e7db4980cd25e7d894d236b423e8fad1b997ad5 100644
 | 
| --- a/utils/pub/source.dart
 | 
| +++ b/utils/pub/source.dart
 | 
| @@ -32,23 +32,24 @@ class Source {
 | 
|    abstract bool get shouldCache();
 | 
|  
 | 
|    /**
 | 
| -   * Get the list of all versions that exist for package [name].
 | 
| +   * Get the list of all versions that exist for the package described by
 | 
| +   * [description].
 | 
|     *
 | 
|     * Note that this does *not* require the packages to be installed, which is
 | 
|     * the point. This is used during version resolution to determine which
 | 
|     * package versions are available to be installed (or already installed).
 | 
|     */
 | 
| -  Future<List<Version>> getVersions(String name) {
 | 
| +  Future<List<Version>> getVersions(description) {
 | 
|      // TODO(rnystrom): Do something better here.
 | 
|      throw "Source $name doesn't support versioning.";
 | 
|    }
 | 
|  
 | 
|    /**
 | 
| -   * Loads the (possibly remote) pubspec for the desired [version] of the named
 | 
| -   * [package]. This will be called for packages that have not yet been
 | 
| -   * installed during the version resolution process.
 | 
| +   * Loads the (possibly remote) pubspec for the package version identified by
 | 
| +   * [id]. This will be called for packages that have not yet been installed
 | 
| +   * during the version resolution process.
 | 
|     */
 | 
| -  Future<Pubspec> describe(String package, Version version) {
 | 
| +  Future<Pubspec> describe(PackageId id) {
 | 
|      // TODO(rnystrom): Figure out how non-default sources should handle this.
 | 
|      throw "Source $name doesn't support versioning.";
 | 
|    }
 | 
| @@ -72,7 +73,7 @@ class Source {
 | 
|     * This doesn't need to be implemented if [shouldCache] is false.
 | 
|     */
 | 
|    String systemCacheDirectory(PackageId id, String parent) =>
 | 
| -    join(parent, packageName(id));
 | 
| +    join(parent, packageName(id.description));
 | 
|  
 | 
|    /**
 | 
|     * When a [Pubspec] is parsed, it reads in the description for each
 | 
| @@ -84,12 +85,23 @@ class Source {
 | 
|    void validateDescription(description) {}
 | 
|  
 | 
|    /**
 | 
| -   * Returns a human-friendly name for the package identified by [id]. This
 | 
| -   * method should be light-weight. It doesn't need to validate that the given
 | 
| -   * package exists.
 | 
| +   * Returns a human-friendly name for the package described by [description].
 | 
| +   * This method should be light-weight. It doesn't need to validate that the
 | 
| +   * given package exists.
 | 
|     *
 | 
|     * The package name should be lower-case and suitable for use in a filename.
 | 
|     * It may contain forward slashes.
 | 
|     */
 | 
| -  String packageName(PackageId id) => id.description;
 | 
| +  String packageName(description) => description;
 | 
| +
 | 
| +  /**
 | 
| +   * Returns whether or not [description1] describes the same package as
 | 
| +   * [description2] for this source. This method should be light-weight. It
 | 
| +   * doesn't need to validate that either package exists.
 | 
| +   *
 | 
| +   * By default, this assumes both descriptions are strings and compares them
 | 
| +   * for equality.
 | 
| +   */
 | 
| +  bool descriptionsEqual(description1, description2) =>
 | 
| +    description1 == description2;
 | 
|  }
 | 
| 
 |