Index: package_config/lib/discovery_analysis.dart |
diff --git a/package_config/lib/discovery_analysis.dart b/package_config/lib/discovery_analysis.dart |
deleted file mode 100644 |
index af4df070a4ac7b471caf26b8023fb527afeedf02..0000000000000000000000000000000000000000 |
--- a/package_config/lib/discovery_analysis.dart |
+++ /dev/null |
@@ -1,166 +0,0 @@ |
-// Copyright (c) 2015, 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. |
- |
-/// Analyse a directory structure and find packages resolvers for each |
-/// sub-directory. |
-/// |
-/// The resolvers are generally the same that would be found by using |
-/// the `discovery.dart` library on each sub-directory in turn, |
-/// but more efficiently and with some heuristics for directories that |
-/// wouldn't otherwise have a package resolution strategy, or that are |
-/// determined to be "package directories" themselves. |
-library package_config.discovery_analysis; |
- |
-import "dart:io" show File, Directory; |
-import "dart:collection" show HashMap; |
- |
-import "package:path/path.dart" as path; |
- |
-import "packages.dart"; |
-import "packages_file.dart" as pkgfile; |
-import "src/packages_impl.dart"; |
-import "src/packages_io_impl.dart"; |
- |
-/// Associates a [Packages] package resolution strategy with a directory. |
-/// |
-/// The package resolution applies to the directory and any sub-directory |
-/// that doesn't have its own overriding child [PackageContext]. |
-abstract class PackageContext { |
- /// The directory that introduced the [packages] resolver. |
- Directory get directory; |
- |
- /// A [Packages] resolver that applies to the directory. |
- /// |
- /// Introduced either by a `.packages` file or a `packages/` directory. |
- Packages get packages; |
- |
- /// Child contexts that apply to sub-directories of [directory]. |
- List<PackageContext> get children; |
- |
- /// Look up the [PackageContext] that applies to a specific directory. |
- /// |
- /// The directory must be inside [directory]. |
- PackageContext operator[](Directory directory); |
- |
- /// A map from directory to package resolver. |
- /// |
- /// Has an entry for this package context and for each child context |
- /// contained in this one. |
- Map<Directory, Packages> asMap(); |
- |
- /// Analyze [directory] and sub-directories for package resolution strategies. |
- /// |
- /// Returns a mapping from sub-directories to [Packages] objects. |
- /// |
- /// The analysis assumes that there are no `.packages` files in a parent |
- /// directory of `directory`. If there is, its corresponding `Packages` object |
- /// should be provided as `root`. |
- static PackageContext findAll(Directory directory, |
- {Packages root: Packages.noPackages}) { |
- if (!directory.existsSync()) { |
- throw new ArgumentError("Directory not found: $directory"); |
- } |
- List contexts = []; |
- void findRoots(Directory directory) { |
- Packages packages; |
- List oldContexts; |
- File packagesFile = new File(path.join(directory.path, ".packages")); |
- if (packagesFile.existsSync()) { |
- packages = _loadPackagesFile(packagesFile); |
- oldContexts = contexts; |
- contexts = []; |
- } else { |
- Directory packagesDir = |
- new Directory(path.join(directory.path, "packages")); |
- if (packagesDir.existsSync()) { |
- packages = new FilePackagesDirectoryPackages(packagesDir); |
- oldContexts = contexts; |
- contexts = []; |
- } |
- } |
- for (var entry in directory.listSync()) { |
- if (entry is Directory) { |
- if (packages == null || !entry.path.endsWith("/packages")) { |
- findRoots(entry); |
- } |
- } |
- } |
- if (packages != null) { |
- oldContexts.add(new _PackageContext(directory, packages, contexts)); |
- contexts = oldContexts; |
- } |
- } |
- findRoots(directory); |
- // If the root is not itself context root, add a the wrapper context. |
- if (contexts.length == 1 && |
- contexts[0].directory == directory) { |
- return contexts[0]; |
- } |
- return new _PackageContext(directory, root, contexts); |
- } |
-} |
- |
-class _PackageContext implements PackageContext { |
- final Directory directory; |
- final Packages packages; |
- final List<PackageContext> children; |
- _PackageContext(this.directory, this.packages, List<PackageContext> children) |
- : children = new List<PackageContext>.unmodifiable(children); |
- |
- Map<Directory, Packages> asMap() { |
- var result = new HashMap<Directory, Packages>(); |
- recurse(_PackageContext current) { |
- result[current.directory] = current.packages; |
- for (var child in current.children) { |
- recurse(child); |
- } |
- } |
- recurse(this); |
- return result; |
- } |
- |
- PackageContext operator[](Directory directory) { |
- String path = directory.path; |
- if (!path.startsWith(this.directory.path)) { |
- throw new ArgumentError("Not inside $path: $directory"); |
- } |
- _PackageContext current = this; |
- // The current path is know to agree with directory until deltaIndex. |
- int deltaIndex = current.directory.path.length; |
- List children = current.children; |
- int i = 0; |
- while (i < children.length) { |
- // TODO(lrn): Sort children and use binary search. |
- _PackageContext child = children[i]; |
- String childPath = child.directory.path; |
- if (_stringsAgree(path, childPath, deltaIndex, childPath.length)) { |
- deltaIndex = childPath.length; |
- if (deltaIndex == path.length) { |
- return child; |
- } |
- current = child; |
- children = current.children; |
- i = 0; |
- continue; |
- } |
- i++; |
- } |
- return current; |
- } |
- |
- static bool _stringsAgree(String a, String b, int start, int end) { |
- if (a.length < end || b.length < end) return false; |
- for (int i = start; i < end; i++) { |
- if (a.codeUnitAt(i) != b.codeUnitAt(i)) return false; |
- } |
- return true; |
- } |
-} |
- |
-Packages _loadPackagesFile(File file) { |
- var uri = new Uri.file(file.path); |
- var bytes = file.readAsBytesSync(); |
- var map = pkgfile.parse(bytes, uri); |
- return new MapPackages(map); |
-} |