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 |
deleted file mode 100644 |
index fa111a4bc8a4e150bd7815db2a245a58959aac11..0000000000000000000000000000000000000000 |
--- a/sdk/lib/_internal/pub/lib/src/package.dart |
+++ /dev/null |
@@ -1,422 +0,0 @@ |
-// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-library pub.package; |
- |
-import 'dart:io'; |
- |
-import 'package:barback/barback.dart'; |
-import 'package:path/path.dart' as p; |
-import 'package:pub_semver/pub_semver.dart'; |
- |
-import 'barback/transformer_id.dart'; |
-import 'io.dart'; |
-import 'git.dart' as git; |
-import 'pubspec.dart'; |
-import 'source_registry.dart'; |
-import 'utils.dart'; |
- |
-final _README_REGEXP = new RegExp(r"^README($|\.)", caseSensitive: false); |
- |
-/// A named, versioned, unit of code and resource reuse. |
-class Package { |
- /// Compares [a] and [b] orders them by name then version number. |
- /// |
- /// This is normally used as a [Comparator] to pass to sort. This does not |
- /// take a package's description or root directory into account, so multiple |
- /// distinct packages may order the same. |
- static int orderByNameAndVersion(Package a, Package b) { |
- var name = a.name.compareTo(b.name); |
- if (name != 0) return name; |
- |
- return a.version.compareTo(b.version); |
- } |
- |
- /// The path to the directory containing the package. |
- final String dir; |
- |
- /// The name of the package. |
- String get name { |
- if (pubspec.name != null) return pubspec.name; |
- if (dir != null) return p.basename(dir); |
- return null; |
- } |
- |
- /// The package's version. |
- Version get version => pubspec.version; |
- |
- /// The parsed pubspec associated with this package. |
- final Pubspec pubspec; |
- |
- /// The immediate dependencies this package specifies in its pubspec. |
- List<PackageDep> get dependencies => pubspec.dependencies; |
- |
- /// The immediate dev dependencies this package specifies in its pubspec. |
- List<PackageDep> get devDependencies => pubspec.devDependencies; |
- |
- /// The dependency overrides this package specifies in its pubspec. |
- List<PackageDep> get dependencyOverrides => pubspec.dependencyOverrides; |
- |
- /// All immediate dependencies this package specifies. |
- /// |
- /// This includes regular, dev dependencies, and overrides. |
- Set<PackageDep> get immediateDependencies { |
- var deps = {}; |
- |
- addToMap(dep) { |
- deps[dep.name] = dep; |
- } |
- |
- dependencies.forEach(addToMap); |
- devDependencies.forEach(addToMap); |
- |
- // Make sure to add these last so they replace normal dependencies. |
- dependencyOverrides.forEach(addToMap); |
- |
- return deps.values.toSet(); |
- } |
- |
- /// Returns a list of asset ids for all Dart executables in this package's bin |
- /// directory. |
- List<AssetId> get executableIds { |
- return ordered(listFiles(beneath: "bin", recursive: false)) |
- .where((executable) => p.extension(executable) == '.dart') |
- .map((executable) { |
- return new AssetId( |
- name, p.toUri(p.relative(executable, from: dir)).toString()); |
- }).toList(); |
- } |
- |
- /// 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 same conventions as |
- /// pub.dartlang.org for choosing the primary one: the README with the fewest |
- /// extensions that is lexically ordered first is chosen. |
- String get readmePath { |
- var readmes = listFiles(recursive: false).map(p.basename). |
- where((entry) => entry.contains(_README_REGEXP)); |
- if (readmes.isEmpty) return null; |
- |
- return p.join(dir, readmes.reduce((readme1, readme2) { |
- var extensions1 = ".".allMatches(readme1).length; |
- var extensions2 = ".".allMatches(readme2).length; |
- var comparison = extensions1.compareTo(extensions2); |
- if (comparison == 0) comparison = readme1.compareTo(readme2); |
- return (comparison <= 0) ? readme1 : readme2; |
- })); |
- } |
- |
- /// Loads the package whose root directory is [packageDir]. |
- /// |
- /// [name] is the expected name of that package (e.g. the name given in the |
- /// dependency), or `null` if the package being loaded is the entrypoint |
- /// package. |
- Package.load(String name, String packageDir, SourceRegistry sources) |
- : dir = packageDir, |
- pubspec = new Pubspec.load(packageDir, sources, expectedName: name); |
- |
- /// Constructs a package with the given pubspec. |
- /// |
- /// The package will have no directory associated with it. |
- Package.inMemory(this.pubspec) |
- : dir = null; |
- |
- /// Creates a package with [pubspec] located at [dir]. |
- Package(this.pubspec, this.dir); |
- |
- /// Given a relative path within this package, returns its absolute path. |
- /// |
- /// This is similar to `p.join(dir, part1, ...)`, except that subclasses may |
- /// override it to report that certain paths exist elsewhere than within |
- /// [dir]. For example, a [CachedPackage]'s `lib` directory is in the |
- /// `.pub/deps` directory. |
- String path(String part1, [String part2, String part3, String part4, |
- String part5, String part6, String part7]) { |
- if (dir == null) { |
- throw new StateError("Package $name is in-memory and doesn't have paths " |
- "on disk."); |
- } |
- return p.join(dir, part1, part2, part3, part4, part5, part6, part7); |
- } |
- |
- /// Given an absolute path within this package (such as that returned by |
- /// [path] or [listFiles]), returns it relative to the package root. |
- String relative(String path) { |
- if (dir == null) { |
- throw new StateError("Package $name is in-memory and doesn't have paths " |
- "on disk."); |
- } |
- return p.relative(path, from: dir); |
- } |
- |
- /// Returns the path to the library identified by [id] within [this]. |
- String transformerPath(TransformerId id) { |
- if (id.package != name) { |
- throw new ArgumentError("Transformer $id isn't in package $name."); |
- } |
- |
- if (id.path != null) return path('lib', p.fromUri('${id.path}.dart')); |
- |
- var transformerPath = path('lib/transformer.dart'); |
- if (fileExists(transformerPath)) return transformerPath; |
- return path('lib/$name.dart'); |
- } |
- |
- /// The basenames of files that are included in [list] despite being hidden. |
- static final _WHITELISTED_FILES = const ['.htaccess']; |
- |
- /// A set of patterns that match paths to blacklisted files. |
- static final _blacklistedFiles = createFileFilter(['pubspec.lock']); |
- |
- /// A set of patterns that match paths to blacklisted directories. |
- static final _blacklistedDirs = createDirectoryFilter(['packages']); |
- |
- /// Returns a list of files that are considered to be part of this package. |
- /// |
- /// If this is a Git repository, this will respect .gitignore; otherwise, it |
- /// will return all non-hidden, non-blacklisted files. |
- /// |
- /// If [beneath] is passed, this will only return files beneath that path, |
- /// which is expected to be relative to the package's root directory. If |
- /// [recursive] is true, this will return all files beneath that path; |
- /// otherwise, it will only return files one level beneath it. |
- /// |
- /// If [useGitIgnore] is passed, this will take the .gitignore rules into |
- /// account if the package's root directory is a Git repository. |
- /// |
- /// Note that the returned paths won't always be beneath [dir]. To safely |
- /// convert them to paths relative to the package root, use [relative]. |
- List<String> listFiles({String beneath, bool recursive: true, |
- bool useGitIgnore: false}) { |
- if (beneath == null) { |
- beneath = dir; |
- } else { |
- beneath = p.join(dir, beneath); |
- } |
- |
- if (!dirExists(beneath)) return []; |
- |
- // This is used in some performance-sensitive paths and can list many, many |
- // files. As such, it leans more havily towards optimization as opposed to |
- // readability than most code in pub. In particular, it avoids using the |
- // path package, since re-parsing a path is very expensive relative to |
- // string operations. |
- var files; |
- if (useGitIgnore && git.isInstalled && dirExists(path('.git'))) { |
- // Later versions of git do not allow a path for ls-files that appears to |
- // be outside of the repo, so make sure we give it a relative path. |
- var relativeBeneath = p.relative(beneath, from: dir); |
- |
- // List all files that aren't gitignored, including those not checked in |
- // to Git. |
- files = git.runSync( |
- ["ls-files", "--cached", "--others", "--exclude-standard", |
- relativeBeneath], |
- workingDir: dir); |
- |
- // If we're not listing recursively, strip out paths that contain |
- // separators. Since git always prints forward slashes, we always detect |
- // them. |
- if (!recursive) { |
- // If we're listing a subdirectory, we only want to look for slashes |
- // after the subdirectory prefix. |
- var relativeStart = relativeBeneath == '.' ? 0 : |
- relativeBeneath.length + 1; |
- files = files.where((file) => !file.contains('/', relativeStart)); |
- } |
- |
- // Git always prints files relative to the repository root, but we want |
- // them relative to the working directory. It also prints forward slashes |
- // on Windows which we normalize away for easier testing. |
- files = files.map((file) { |
- if (Platform.operatingSystem != 'windows') return "$dir/$file"; |
- return "$dir\\${file.replaceAll("/", "\\")}"; |
- }).where((file) { |
- // Filter out broken symlinks, since git doesn't do so automatically. |
- return fileExists(file); |
- }); |
- } else { |
- files = listDir(beneath, recursive: recursive, includeDirs: false, |
- whitelist: _WHITELISTED_FILES); |
- } |
- |
- return files.where((file) { |
- // Using substring here is generally problematic in cases where dir has |
- // one or more trailing slashes. If you do listDir("foo"), you'll get back |
- // paths like "foo/bar". If you do listDir("foo/"), you'll get "foo/bar" |
- // (note the trailing slash was dropped. If you do listDir("foo//"), |
- // you'll get "foo//bar". |
- // |
- // This means if you strip off the prefix, the resulting string may have a |
- // leading separator (if the prefix did not have a trailing one) or it may |
- // not. However, since we are only using the results of that to call |
- // contains() on, the leading separator is harmless. |
- assert(file.startsWith(beneath)); |
- file = file.substring(beneath.length); |
- return !_blacklistedFiles.any(file.endsWith) && |
- !_blacklistedDirs.any(file.contains); |
- }).toList(); |
- } |
- |
- /// Returns a debug string for the package. |
- String toString() => '$name $version ($dir)'; |
-} |
- |
-/// 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) |
- : isMagic = false; |
- |
- _PackageName.magic(this.name) |
- : source = null, |
- description = null, |
- isMagic = true; |
- |
- /// The name of the package being identified. |
- final String name; |
- |
- /// The name of the [Source] used to look up this package given its |
- /// [description]. |
- /// |
- /// If this is a root package, this will be `null`. |
- final String source; |
- |
- /// 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 get |
- /// the package. For example, the description of a git sourced package might |
- /// by the URL "git://github.com/dart/uilib.git". |
- final description; |
- |
- /// Whether this is a name for a magic package. |
- /// |
- /// Magic packages are unversioned pub constructs that have special semantics. |
- /// For example, a magic package named "pub itself" is inserted into the |
- /// dependency graph when any package depends on barback. This packages has |
- /// dependencies that represent the versions of barback and related packages |
- /// that pub is compatible with. |
- final bool isMagic; |
- |
- /// Whether this package is the root package. |
- bool get isRoot => source == null && !isMagic; |
- |
- String toString() { |
- if (isRoot) return "$name (root)"; |
- if (isMagic) return name; |
- return "$name from $source"; |
- } |
- |
- /// Returns a [PackageRef] with this one's [name], [source], and |
- /// [description]. |
- PackageRef toRef() => isMagic |
- ? new PackageRef.magic(name) |
- : new PackageRef(name, source, description); |
- |
- /// Returns a [PackageId] for this package with the given concrete version. |
- PackageId atVersion(Version version) => |
- new PackageId(name, source, version, description); |
- |
- /// Returns a [PackageDep] for this package with the given version constraint. |
- PackageDep withConstraint(VersionConstraint constraint) => |
- new PackageDep(name, source, constraint, description); |
-} |
- |
-/// A reference to a [Package], but not any particular version(s) of it. |
-class PackageRef extends _PackageName { |
- PackageRef(String name, String source, description) |
- : super(name, source, description); |
- |
- /// Creates a reference to a magic package (see [isMagic]). |
- PackageRef.magic(String name) |
- : super.magic(name); |
- |
- int get hashCode => name.hashCode ^ source.hashCode; |
- |
- 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; |
- } |
-} |
- |
-/// A reference to a specific version of a package. |
-/// |
-/// A package ID contains enough information to correctly get 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; |
- |
- PackageId(String name, String source, this.version, description) |
- : super(name, source, description); |
- |
- /// Creates an ID for a magic package (see [isMagic]). |
- PackageId.magic(String name) |
- : super.magic(name), |
- version = Version.none; |
- |
- /// Creates an ID for the given root package. |
- PackageId.root(Package package) |
- : version = package.version, |
- super(package.name, null, package.name); |
- |
- int get hashCode => name.hashCode ^ source.hashCode ^ version.hashCode; |
- |
- 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; |
- } |
- |
- String toString() { |
- if (isRoot) return "$name $version (root)"; |
- if (isMagic) return name; |
- return "$name $version from $source"; |
- } |
-} |
- |
-/// 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, String source, this.constraint, description) |
- : super(name, source, description); |
- |
- PackageDep.magic(String name) |
- : super.magic(name), |
- constraint = Version.none; |
- |
- String toString() { |
- if (isRoot) return "$name $constraint (root)"; |
- if (isMagic) return name; |
- return "$name $constraint from $source ($description)"; |
- } |
- |
- int get hashCode => name.hashCode ^ source.hashCode; |
- |
- 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; |
- } |
-} |