Index: sdk/lib/_internal/pub/lib/src/package.dart |
diff --git a/sdk/lib/_internal/pub/lib/src/package.dart b/sdk/lib/_internal/pub/lib/src/package.dart |
index ce1ad35d7a370699e156466a02c7f3e1cb5fc538..62a2a9854266c8906c762d0053269b8e8d7a87ff 100644 |
--- a/sdk/lib/_internal/pub/lib/src/package.dart |
+++ b/sdk/lib/_internal/pub/lib/src/package.dart |
@@ -36,7 +36,7 @@ class Package { |
/// The ids of the packages that this package depends on. This is what is |
/// specified in the pubspec when this package depends on another. |
- List<PackageRef> get dependencies => pubspec.dependencies; |
+ List<PackageDep> get dependencies => pubspec.dependencies; |
/// Returns the path to the README file at the root of the entrypoint, or null |
/// if no README file is found. If multiple READMEs are found, this uses the |
@@ -77,136 +77,146 @@ class Package { |
String toString() => '$name $version ($dir)'; |
} |
-/// An unambiguous resolved reference to a package. A package ID contains enough |
-/// information to correctly install the package. |
-/// |
-/// Note that it's possible for multiple distinct package IDs to point to |
-/// different directories that happen to contain identical packages. For |
-/// example, the same package may be available from multiple sources. As far as |
-/// Pub is concerned, those packages are different. |
-class PackageId implements Comparable<PackageId> { |
+/// This is the private base class of [PackageRef], [PackageID], and |
+/// [PackageDep]. It contains functionality and state that those classes share |
+/// but is private so that from outside of this library, there is no type |
+/// relationship between those three types. |
+class _PackageName { |
+ _PackageName(this.name, this.source, this.description); |
+ |
/// The name of the package being identified. |
final String name; |
/// The [Source] used to look up this package given its [description]. If |
- /// this is a root package ID, this will be `null`. |
+ /// this is a root package, this will be `null`. |
final Source source; |
- /// The package's version. |
- final Version version; |
- |
/// The metadata used by the package's [source] to identify and locate it. It |
/// contains whatever [Source]-specific data it needs to be able to install |
/// the package. For example, the description of a git sourced package might |
/// by the URL "git://github.com/dart/uilib.git". |
final description; |
- PackageId(this.name, this.source, this.version, this.description); |
- |
- /// Creates an ID for the given root package. |
- PackageId.root(Package package) |
- : name = package.name, |
- source = null, |
- version = package.version, |
- description = package.name; |
- |
- /// Whether this ID identifies the root package. |
+ /// Whether this package is the root package. |
bool get isRoot => source == null; |
- int get hashCode => name.hashCode ^ source.hashCode ^ version.hashCode; |
- |
/// Gets the directory where this package is or would be found in the |
/// [SystemCache]. |
Future<String> get systemCacheDirectory => source.systemCacheDirectory(this); |
- bool operator ==(other) { |
- if (other is! PackageId) return false; |
- // TODO(rnystrom): We're assuming here the name/version/source tuple is |
- // enough to uniquely identify the package and that we don't need to delve |
- // into the description. |
- return other.name == name && |
- other.source == source && |
- other.version == version; |
- } |
- |
String toString() { |
- if (isRoot) return "$name $version (root)"; |
- if (source.isDefault) return "$name $version"; |
- return "$name $version from $source"; |
+ if (isRoot) return "$name (root)"; |
+ if (source.isDefault) return name; |
+ return "$name from $source"; |
} |
- int compareTo(PackageId other) { |
- var sourceComp = source.name.compareTo(other.source.name); |
- if (sourceComp != 0) return sourceComp; |
+ /// Returns a [PackageRef] with this one's [name], [source], and |
+ /// [description]. |
+ PackageRef toRef() => new PackageRef(name, source, description); |
- var nameComp = name.compareTo(other.name); |
- if (nameComp != 0) return nameComp; |
+ /// Returns a [PackageId] for this package with the given concrete version. |
+ PackageId atVersion(Version version) => |
+ new PackageId(name, source, version, description); |
- return version.compareTo(other.version); |
+ /// Returns `true` if this package's description matches [other]'s. |
+ bool descriptionEquals(PackageDep other) { |
+ return source.descriptionsEqual(description, other.description); |
} |
+} |
- /// Returns the pubspec for this package. |
- Future<Pubspec> describe() => source.systemCache.describe(this); |
+/// A reference to a [Package], but not any particular version(s) of it. |
+class PackageRef extends _PackageName { |
+ PackageRef(String name, Source source, description) |
+ : super(name, source, description); |
- /// Returns a future that completes to the resovled [PackageId] for this id. |
- Future<PackageId> get resolved => source.resolveId(this); |
+ int get hashCode => name.hashCode ^ source.hashCode; |
- /// Returns a [PackageRef] that references this package and constrains its |
- /// version to exactly match [version]. |
- PackageRef toRef() { |
- return new PackageRef(name, source, version, description); |
+ bool operator ==(other) { |
+ // TODO(rnystrom): We're assuming here that we don't need to delve into the |
+ // description. |
+ return other is PackageRef && |
+ other.name == name && |
+ other.source == source; |
} |
- /// Returns `true` if this id's description matches [other]'s. |
- bool descriptionEquals(PackageRef other) { |
- return source.descriptionsEqual(description, other.description); |
+ /// Gets the list of ids of all versions of the package that are described by |
+ /// this reference. |
+ Future<List<PackageId>> getVersions() { |
+ if (isRoot) { |
+ throw new StateError("Cannot get versions for the root package."); |
+ } |
+ |
+ return source.getVersions(name, description).then((versions) { |
+ return versions.map((version) => atVersion(version)).toList(); |
+ }); |
} |
} |
-/// A reference to a package. Unlike a [PackageId], a PackageRef may not |
-/// unambiguously refer to a single package. It may describe a range of allowed |
-/// packages. |
-class PackageRef { |
- /// The name of the package being identified. |
- final String name; |
+/// A reference to a specific version of a package. A package ID contains |
+/// enough information to correctly install the package. |
+/// |
+/// Note that it's possible for multiple distinct package IDs to point to |
+/// different packages that have identical contents. For example, the same |
+/// package may be available from multiple sources. As far as Pub is concerned, |
+/// those packages are different. |
+class PackageId extends _PackageName { |
+ /// The package's version. |
+ final Version version; |
- /// The [Source] used to look up the package. If this refers to a root |
- /// package, this will be `null`. |
- final Source source; |
+ PackageId(String name, Source source, this.version, description) |
+ : super(name, source, description); |
- /// The allowed package versions. |
- final VersionConstraint constraint; |
+ /// Creates an ID for the given root package. |
+ PackageId.root(Package package) |
+ : version = package.version, |
+ super(package.name, null, package.name); |
- /// The metadata used to identify the package being referenced. The |
- /// interpretation of this will vary based on the [source]. |
- final description; |
+ int get hashCode => name.hashCode ^ source.hashCode ^ version.hashCode; |
- PackageRef(this.name, this.source, this.constraint, this.description); |
+ bool operator ==(other) { |
+ // TODO(rnystrom): We're assuming here that we don't need to delve into the |
+ // description. |
+ return other is PackageId && |
+ other.name == name && |
+ other.source == source && |
+ other.version == version; |
+ } |
- // TODO(rnystrom): Remove this if the old version solver is removed. |
- /// Creates a reference to the given root package. |
- PackageRef.root(Package package) |
- : name = package.name, |
- source = null, |
- constraint = package.version, |
- description = package.name; |
+ String toString() { |
+ if (isRoot) return "$name $version (root)"; |
+ if (source.isDefault) return "$name $version"; |
+ return "$name $version from $source"; |
+ } |
- /// Whether this refers to the root package. |
- bool get isRoot => source == null; |
+ /// Returns the pubspec for this package. |
+ Future<Pubspec> describe() => source.systemCache.describe(this); |
+ |
+ /// Returns a future that completes to the resolved [PackageId] for this id. |
+ Future<PackageId> get resolved => source.resolveId(this); |
+} |
+ |
+/// A reference to a constrained range of versions of one package. |
+class PackageDep extends _PackageName { |
+ /// The allowed package versions. |
+ final VersionConstraint constraint; |
+ |
+ PackageDep(String name, Source source, this.constraint, description) |
+ : super(name, source, description); |
String toString() { |
if (isRoot) return "$name $constraint (root)"; |
return "$name $constraint from $source ($description)"; |
} |
- /// Returns a [PackageId] generated from this [PackageRef] with the given |
- /// concrete version. |
- PackageId atVersion(Version version) => |
- new PackageId(name, source, version, description); |
+ int get hashCode => name.hashCode ^ source.hashCode; |
- /// Returns `true` if this reference's description matches [other]'s. |
- bool descriptionEquals(PackageRef other) { |
- return source.descriptionsEqual(description, other.description); |
+ bool operator ==(other) { |
+ // TODO(rnystrom): We're assuming here that we don't need to delve into the |
+ // description. |
+ return other is PackageDep && |
+ other.name == name && |
+ other.source == source && |
+ other.constraint == constraint; |
} |
} |