Index: sdk/lib/_internal/pub_generated/lib/src/package.dart |
diff --git a/sdk/lib/_internal/pub_generated/lib/src/package.dart b/sdk/lib/_internal/pub_generated/lib/src/package.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..73b5b05aac946805fa9fa4a22f022ee66b9924f2 |
--- /dev/null |
+++ b/sdk/lib/_internal/pub_generated/lib/src/package.dart |
@@ -0,0 +1,165 @@ |
+library pub.package; |
+import 'dart:io'; |
+import 'package:path/path.dart' as path; |
+import 'package:barback/barback.dart'; |
+import 'io.dart'; |
+import 'git.dart' as git; |
+import 'pubspec.dart'; |
+import 'source_registry.dart'; |
+import 'utils.dart'; |
+import 'version.dart'; |
+final _README_REGEXP = new RegExp(r"^README($|\.)", caseSensitive: false); |
+class Package { |
+ 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); |
+ } |
+ final String dir; |
+ String get name { |
+ if (pubspec.name != null) return pubspec.name; |
+ if (dir != null) return path.basename(dir); |
+ return null; |
+ } |
+ Version get version => pubspec.version; |
+ final Pubspec pubspec; |
+ List<PackageDep> get dependencies => pubspec.dependencies; |
+ List<PackageDep> get devDependencies => pubspec.devDependencies; |
+ List<PackageDep> get dependencyOverrides => pubspec.dependencyOverrides; |
+ Set<PackageDep> get immediateDependencies { |
+ var deps = {}; |
+ addToMap(dep) { |
+ deps[dep.name] = dep; |
+ } |
+ dependencies.forEach(addToMap); |
+ devDependencies.forEach(addToMap); |
+ dependencyOverrides.forEach(addToMap); |
+ return deps.values.toSet(); |
+ } |
+ 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').map((executable) { |
+ return new AssetId( |
+ name, |
+ path.toUri(path.relative(executable, from: dir)).toString()); |
+ }).toList(); |
+ } |
+ String get readmePath { |
+ var readmes = listDir( |
+ dir).map(path.basename).where((entry) => entry.contains(_README_REGEXP)); |
+ if (readmes.isEmpty) return null; |
+ return path.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; |
+ })); |
+ } |
+ Package.load(String name, String packageDir, SourceRegistry sources) |
+ : dir = packageDir, |
+ pubspec = new Pubspec.load(packageDir, sources, expectedName: name); |
+ Package.inMemory(this.pubspec) : dir = null; |
+ Package(this.pubspec, this.dir); |
+ static final _WHITELISTED_FILES = const ['.htaccess']; |
+ static final _blacklistedFiles = createFileFilter(['pubspec.lock']); |
+ static final _blacklistedDirs = createDirectoryFilter(['packages']); |
+ List<String> listFiles({String beneath, recursive: true}) { |
+ if (beneath == null) beneath = dir; |
+ var files; |
+ if (git.isInstalled && dirExists(path.join(dir, '.git'))) { |
+ var relativeBeneath = path.relative(beneath, from: dir); |
+ files = git.runSync( |
+ ["ls-files", "--cached", "--others", "--exclude-standard", relativeBeneath], |
+ workingDir: dir); |
+ if (!recursive) { |
+ var relativeStart = |
+ relativeBeneath == '.' ? 0 : relativeBeneath.length + 1; |
+ files = files.where((file) => !file.contains('/', relativeStart)); |
+ } |
+ files = files.map((file) { |
+ if (Platform.operatingSystem != 'windows') return "$dir/$file"; |
+ return "$dir\\${file.replaceAll("/", "\\")}"; |
+ }).where((file) { |
+ return fileExists(file); |
+ }); |
+ } else { |
+ files = listDir( |
+ beneath, |
+ recursive: recursive, |
+ includeDirs: false, |
+ whitelist: _WHITELISTED_FILES); |
+ } |
+ return files.where((file) { |
+ assert(file.startsWith(beneath)); |
+ file = file.substring(beneath.length); |
+ return !_blacklistedFiles.any(file.endsWith) && |
+ !_blacklistedDirs.any(file.contains); |
+ }).toList(); |
+ } |
+ String toString() => '$name $version ($dir)'; |
+} |
+class _PackageName { |
+ _PackageName(this.name, this.source, this.description); |
+ final String name; |
+ final String source; |
+ final description; |
+ bool get isRoot => source == null; |
+ String toString() { |
+ if (isRoot) return "$name (root)"; |
+ return "$name from $source"; |
+ } |
+ PackageRef toRef() => new PackageRef(name, source, description); |
+ PackageId atVersion(Version version) => |
+ new PackageId(name, source, version, description); |
+ PackageDep withConstraint(VersionConstraint constraint) => |
+ new PackageDep(name, source, constraint, description); |
+} |
+class PackageRef extends _PackageName { |
+ PackageRef(String name, String source, description) |
+ : super(name, source, description); |
+ int get hashCode => name.hashCode ^ source.hashCode; |
+ bool operator ==(other) { |
+ return other is PackageRef && other.name == name && other.source == source; |
+ } |
+} |
+class PackageId extends _PackageName { |
+ final Version version; |
+ PackageId(String name, String source, this.version, description) |
+ : super(name, source, description); |
+ 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) { |
+ return other is PackageId && |
+ other.name == name && |
+ other.source == source && |
+ other.version == version; |
+ } |
+ String toString() { |
+ if (isRoot) return "$name $version (root)"; |
+ return "$name $version from $source"; |
+ } |
+} |
+class PackageDep extends _PackageName { |
+ final VersionConstraint constraint; |
+ PackageDep(String name, String source, this.constraint, description) |
+ : super(name, source, description); |
+ String toString() { |
+ if (isRoot) return "$name $constraint (root)"; |
+ return "$name $constraint from $source ($description)"; |
+ } |
+ int get hashCode => name.hashCode ^ source.hashCode; |
+ bool operator ==(other) { |
+ return other is PackageDep && |
+ other.name == name && |
+ other.source == source && |
+ other.constraint == constraint; |
+ } |
+} |