Index: package_config/lib/discovery.dart |
diff --git a/package_config/lib/discovery.dart b/package_config/lib/discovery.dart |
deleted file mode 100644 |
index 8e42af79d78fe213b9ec5d1f4ae9d034e99eb0d0..0000000000000000000000000000000000000000 |
--- a/package_config/lib/discovery.dart |
+++ /dev/null |
@@ -1,228 +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. |
- |
-library package_config.discovery; |
- |
-import "dart:async"; |
-import "dart:io"; |
-import "dart:typed_data" show Uint8List; |
- |
-import "package:path/path.dart" as path; |
- |
-import "packages.dart"; |
-import "packages_file.dart" as pkgfile show parse; |
-import "src/packages_impl.dart"; |
-import "src/packages_io_impl.dart"; |
- |
-/// Reads a package resolution file and creates a [Packages] object from it. |
-/// |
-/// The [packagesFile] must exist and be loadable. |
-/// Currently that means the URI must have a `file`, `http` or `https` scheme, |
-/// and that the file can be loaded and its contents parsed correctly. |
-/// |
-/// If the [loader] is provided, it is used to fetch non-`file` URIs, and |
-/// it can support other schemes or set up more complex HTTP requests. |
-/// |
-/// This function can be used to load an explicitly configured package |
-/// resolution file, for example one specified using a `--packages` |
-/// command-line parameter. |
-Future<Packages> loadPackagesFile(Uri packagesFile, |
- {Future<List<int>> loader(Uri uri)}) { |
- Packages parseBytes(List<int> bytes) { |
- Map<String, Uri> packageMap = pkgfile.parse(bytes, packagesFile); |
- return new MapPackages(packageMap); |
- } |
- if (packagesFile.scheme == "file") { |
- File file = new File.fromUri(packagesFile); |
- return file.readAsBytes().then(parseBytes); |
- } |
- if (loader == null) { |
- return _httpGet(packagesFile).then(parseBytes); |
- } |
- return loader(packagesFile).then(parseBytes); |
-} |
- |
- |
-/// Create a [Packages] object for a package directory. |
-/// |
-/// The [packagesDir] URI should refer to a directory. |
-/// Package names are resolved as relative to sub-directories of the |
-/// package directory. |
-/// |
-/// This function can be used for explicitly configured package directories, |
-/// for example one specified using a `--package-root` comand-line parameter. |
-Packages getPackagesDirectory(Uri packagesDir) { |
- if (packagesDir.scheme == "file") { |
- Directory directory = new Directory.fromUri(packagesDir); |
- return new FilePackagesDirectoryPackages(directory); |
- } |
- if (!packagesDir.path.endsWith('/')) { |
- packagesDir = packagesDir.replace(path: packagesDir.path + '/'); |
- } |
- return new NonFilePackagesDirectoryPackages(packagesDir); |
-} |
- |
- |
-/// Discover the package configuration for a Dart script. |
-/// |
-/// The [baseUri] points to either the Dart script or its directory. |
-/// A package resolution strategy is found by going through the following steps, |
-/// and stopping when something is found. |
-/// |
-/// * Check if a `.packages` file exists in the same directory. |
-/// * If `baseUri`'s scheme is not `file`, then assume a `packages` directory |
-/// in the same directory, and resolve packages relative to that. |
-/// * If `baseUri`'s scheme *is* `file`: |
-/// * Check if a `packages` directory exists. |
-/// * Otherwise check each successive parent directory of `baseUri` for a |
-/// `.packages` file. |
-/// |
-/// If any of these tests succeed, a `Packages` class is returned. |
-/// Returns the constant [noPackages] if no resolution strategy is found. |
-/// |
-/// This function currently only supports `file`, `http` and `https` URIs. |
-/// It needs to be able to load a `.packages` file from the URI, so only |
-/// recognized schemes are accepted. |
-/// |
-/// To support other schemes, or more complex HTTP requests, |
-/// an optional [loader] function can be supplied. |
-/// It's called to load the `.packages` file for a non-`file` scheme. |
-/// The loader function returns the *contents* of the file |
-/// identified by the URI it's given. |
-/// The content should be a UTF-8 encoded `.packages` file, and must return an |
-/// error future if loading fails for any reason. |
-Future<Packages> findPackages(Uri baseUri, |
- {Future<List<int>> loader(Uri unsupportedUri)}) { |
- if (baseUri.scheme == "file") { |
- return new Future<Packages>.sync(() => findPackagesFromFile(baseUri)); |
- } else if (loader != null) { |
- return findPackagesFromNonFile(baseUri, loader: loader); |
- } else if (baseUri.scheme == "http" || baseUri.scheme == "https") { |
- return findPackagesFromNonFile(baseUri, loader: _httpGet); |
- } else { |
- return new Future<Packages>.value(Packages.noPackages); |
- } |
-} |
- |
-/// Find the location of the package resolution file/directory for a Dart file. |
-/// |
-/// Checks for a `.packages` file in the [workingDirectory]. |
-/// If not found, checks for a `packages` directory in the same directory. |
-/// If still not found, starts checking parent directories for |
-/// `.packages` until reaching the root directory. |
-/// |
-/// Returns a [File] object of a `.packages` file if one is found, or a |
-/// [Directory] object for the `packages/` directory if that is found. |
-FileSystemEntity _findPackagesFile(String workingDirectory) { |
- var dir = new Directory(workingDirectory); |
- if (!dir.isAbsolute) dir = dir.absolute; |
- if (!dir.existsSync()) { |
- throw new ArgumentError.value( |
- workingDirectory, "workingDirectory", "Directory does not exist."); |
- } |
- File checkForConfigFile(Directory directory) { |
- assert(directory.isAbsolute); |
- var file = new File(path.join(directory.path, ".packages")); |
- if (file.existsSync()) return file; |
- return null; |
- } |
- // Check for $cwd/.packages |
- var packagesCfgFile = checkForConfigFile(dir); |
- if (packagesCfgFile != null) return packagesCfgFile; |
- // Check for $cwd/packages/ |
- var packagesDir = new Directory(path.join(dir.path, "packages")); |
- if (packagesDir.existsSync()) return packagesDir; |
- // Check for cwd(/..)+/.packages |
- var parentDir = dir.parent; |
- while (parentDir.path != dir.path) { |
- packagesCfgFile = checkForConfigFile(parentDir); |
- if (packagesCfgFile != null) break; |
- dir = parentDir; |
- parentDir = dir.parent; |
- } |
- return packagesCfgFile; |
-} |
- |
-/// Finds a package resolution strategy for a local Dart script. |
-/// |
-/// The [fileBaseUri] points to either a Dart script or the directory of the |
-/// script. The `fileBaseUri` must be a `file:` URI. |
-/// |
-/// This function first tries to locate a `.packages` file in the `fileBaseUri` |
-/// directory. If that is not found, it instead checks for the presence of |
-/// a `packages/` directory in the same place. |
-/// If that also fails, it starts checking parent directories for a `.packages` |
-/// file, and stops if it finds it. |
-/// Otherwise it gives up and returns [Packages.noPackages]. |
-Packages findPackagesFromFile(Uri fileBaseUri) { |
- Uri baseDirectoryUri = fileBaseUri; |
- if (!fileBaseUri.path.endsWith('/')) { |
- baseDirectoryUri = baseDirectoryUri.resolve("."); |
- } |
- String baseDirectoryPath = baseDirectoryUri.toFilePath(); |
- FileSystemEntity location = _findPackagesFile(baseDirectoryPath); |
- if (location == null) return Packages.noPackages; |
- if (location is File) { |
- List<int> fileBytes = location.readAsBytesSync(); |
- Map<String, Uri> map = |
- pkgfile.parse(fileBytes, new Uri.file(location.path)); |
- return new MapPackages(map); |
- } |
- assert(location is Directory); |
- return new FilePackagesDirectoryPackages(location); |
-} |
- |
-/// Finds a package resolution strategy for a Dart script. |
-/// |
-/// The [nonFileUri] points to either a Dart script or the directory of the |
-/// script. |
-/// The [nonFileUri] should not be a `file:` URI since the algorithm for |
-/// finding a package resolution strategy is more elaborate for `file:` URIs. |
-/// In that case, use [findPackagesFromFile]. |
-/// |
-/// This function first tries to locate a `.packages` file in the [nonFileUri] |
-/// directory. If that is not found, it instead assumes a `packages/` directory |
-/// in the same place. |
-/// |
-/// By default, this function only works for `http:` and `https:` URIs. |
-/// To support other schemes, a loader must be provided, which is used to |
-/// try to load the `.packages` file. The loader should return the contents |
-/// of the requested `.packages` file as bytes, which will be assumed to be |
-/// UTF-8 encoded. |
-Future<Packages> findPackagesFromNonFile(Uri nonFileUri, |
- {Future<List<int>> loader(Uri name)}) { |
- if (loader == null) loader = _httpGet; |
- Uri packagesFileUri = nonFileUri.resolve(".packages"); |
- return loader(packagesFileUri).then((List<int> fileBytes) { |
- Map<String, Uri> map = pkgfile.parse(fileBytes, packagesFileUri); |
- return new MapPackages(map); |
- }, onError: (_) { |
- // Didn't manage to load ".packages". Assume a "packages/" directory. |
- Uri packagesDirectoryUri = nonFileUri.resolve("packages/"); |
- return new NonFilePackagesDirectoryPackages(packagesDirectoryUri); |
- }); |
-} |
- |
-/// Fetches a file over http. |
-Future<List<int>> _httpGet(Uri uri) async { |
- HttpClient client = new HttpClient(); |
- HttpClientRequest request = await client.getUrl(uri); |
- HttpClientResponse response = await request.close(); |
- if (response.statusCode != HttpStatus.OK) { |
- throw 'Failure getting $uri: ' |
- '${response.statusCode} ${response.reasonPhrase}'; |
- } |
- List<List<int>> splitContent = await response.toList(); |
- int totalLength = 0; |
- for (var list in splitContent) { |
- totalLength += list.length; |
- } |
- Uint8List result = new Uint8List(totalLength); |
- int offset = 0; |
- for (List<int> contentPart in splitContent) { |
- result.setRange(offset, offset + contentPart.length, contentPart); |
- offset += contentPart.length; |
- } |
- return result; |
-} |