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 3dd84e2d253facf02d1f199f47644495037b39df..1eda9dfdfa2430bada663facdad73bf59860766e 100644 |
--- a/sdk/lib/_internal/pub/lib/src/package.dart |
+++ b/sdk/lib/_internal/pub/lib/src/package.dart |
@@ -6,9 +6,10 @@ library pub.package; |
import 'dart:io'; |
-import 'package:path/path.dart' as path; |
+import 'package:path/path.dart' as p; |
import 'package:barback/barback.dart'; |
+import 'barback/transformer_id.dart'; |
import 'io.dart'; |
import 'git.dart' as git; |
import 'pubspec.dart'; |
@@ -38,7 +39,7 @@ class Package { |
/// The name of the package. |
String get name { |
if (pubspec.name != null) return pubspec.name; |
- if (dir != null) return path.basename(dir); |
+ if (dir != null) return p.basename(dir); |
return null; |
} |
@@ -79,14 +80,11 @@ class Package { |
/// Returns a list of asset ids for all Dart executables in this package's bin |
/// directory. |
List<AssetId> get executableIds { |
- var binDir = path.join(dir, 'bin'); |
- if (!dirExists(binDir)) return []; |
- |
- return ordered(listFiles(beneath: binDir, recursive: false)) |
- .where((executable) => path.extension(executable) == '.dart') |
+ return ordered(listFiles(beneath: "bin", recursive: false)) |
+ .where((executable) => p.extension(executable) == '.dart') |
.map((executable) { |
return new AssetId( |
- name, path.toUri(path.relative(executable, from: dir)).toString()); |
+ name, p.toUri(p.relative(executable, from: dir)).toString()); |
}).toList(); |
} |
@@ -97,11 +95,11 @@ class Package { |
/// 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 = listDir(dir).map(path.basename). |
+ var readmes = listFiles(recursive: false).map(p.basename). |
where((entry) => entry.contains(_README_REGEXP)); |
if (readmes.isEmpty) return null; |
- return path.join(dir, readmes.reduce((readme1, readme2) { |
+ return p.join(dir, readmes.reduce((readme1, readme2) { |
var extensions1 = ".".allMatches(readme1).length; |
var extensions2 = ".".allMatches(readme2).length; |
var comparison = extensions1.compareTo(extensions2); |
@@ -128,6 +126,38 @@ class Package { |
/// Creates a package with [pubspec] located at [dir]. |
Package(this.pubspec, this.dir); |
+ 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); |
+ } |
+ |
+ 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]. |
+ /// |
+ /// Throws an [ArgumentError] if [id.package] isn't [name]. |
+ 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']; |
@@ -142,11 +172,18 @@ class 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. If |
+ /// 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. |
List<String> listFiles({String beneath, recursive: true}) { |
- if (beneath == null) beneath = dir; |
+ 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 |
@@ -154,10 +191,10 @@ class Package { |
// path package, since re-parsing a path is very expensive relative to |
// string operations. |
var files; |
- if (git.isInstalled && dirExists(path.join(dir, '.git'))) { |
+ if (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 = path.relative(beneath, from: dir); |
+ var relativeBeneath = p.relative(beneath, from: dir); |
// List all files that aren't gitignored, including those not checked in |
// to Git. |