Index: lib/src/io.dart |
diff --git a/lib/src/io.dart b/lib/src/io.dart |
index ed9625164066c12d3c7f4401e7dd9765bcd0dbea..ff02921f256cbe7558f4b7dc71d6b2012b0496c4 100644 |
--- a/lib/src/io.dart |
+++ b/lib/src/io.dart |
@@ -475,39 +475,81 @@ void createPackageSymlink(String name, String target, String symlink, |
createSymlink(target, symlink, relative: relative); |
} |
+/// Whether the current process is one of pub's test files. |
+/// |
+/// This works because an actual pub executable that imports this will always |
+/// start with "pub". |
+final bool runningAsTest = |
+ !path.url.basename(Platform.script.path).startsWith('pub.'); |
+ |
+/// Whether the current process is a pub subprocess being run from a test. |
+/// |
+/// This works because when running from tests, pub always uses a snapshot named |
+/// "pub.test.snapshot", which is not used outside of tests. |
+final bool runningFromTest = Platform.script.path.endsWith('.test.snapshot'); |
+ |
/// Whether pub is running from within the Dart SDK, as opposed to from the Dart |
/// source repository. |
-final bool runningFromSdk = Platform.script.path.endsWith('.dart.snapshot'); |
+final bool runningFromSdk = |
+ !runningFromTest && Platform.script.path.endsWith('.snapshot'); |
+ |
+/// Whether pub is running from source in the Dart repo. |
+/// |
+/// This can happen when building Observatory, for example. |
+final bool runningFromDartRepo = |
+ Platform.script.path.endsWith('/third_party/pkg/pub/bin/pub.dart'); |
/// Resolves [target] relative to the path to pub's `asset` directory. |
-String assetPath(String target) { |
- if (runningFromSdk) { |
- return path.join( |
- sdk.rootDirectory, 'lib', '_internal', 'pub', 'asset', target); |
- } else { |
- return path.join(pubRoot, 'asset', target); |
+String assetPath(String target) => runningFromSdk |
+ ? sdkAssetPath(target) |
+ : path.join(pubRoot, 'lib', 'src', 'asset', target); |
+ |
+/// Resolves [target] relative to the Dart SDK's `asset` directory. |
+/// |
+/// Throws a [StateError] if called from within the Dart repo. |
+String sdkAssetPath(String target) { |
+ if (runningFromDartRepo) { |
+ throw new StateError("Can't get SDK assets from within the Dart repo."); |
} |
-} |
-/// Returns the path to the root of pub's sources in the Dart repo. |
-String get pubRoot => path.join(repoRoot, 'sdk', 'lib', '_internal', 'pub'); |
+ return path.join( |
+ sdk.rootDirectory, 'lib', '_internal', 'pub', 'asset', target); |
+} |
-/// Returns the path to the root of the Dart repository. |
+/// The path to the root of pub's sources in the pub repo. |
/// |
/// This throws a [StateError] if it's called when running pub from the SDK. |
-String get repoRoot { |
+final String pubRoot = (() { |
if (runningFromSdk) { |
- throw new StateError("Can't get the repo root from the SDK."); |
+ throw new StateError("Can't get pub's root from the SDK."); |
} |
- // Get the path to the directory containing this very file. |
- var libDir = path.dirname(libraryPath('pub.io')); |
+ var script = path.fromUri(Platform.script); |
+ if (runningAsTest) { |
+ // Running from "test/../some_test.dart". |
+ var components = path.split(script); |
+ var testIndex = components.indexOf("test"); |
+ if (testIndex == -1) throw new StateError("Can't find pub's root."); |
+ return path.joinAll(components.take(testIndex)); |
+ } |
- // Assume we're running directly from the source location in the repo: |
- // |
- // <repo>/sdk/lib/_internal/pub/lib/src |
- return path.normalize(path.join(libDir, '..', '..', '..', '..', '..', '..')); |
-} |
+ // Pub is either run from ".pub/pub.test.snapshot" or "bin/pub.dart". |
+ return path.dirname(path.dirname(script)); |
+})(); |
+ |
+/// The path to the root of the Dart repo. |
+/// |
+/// This throws a [StateError] if it's called when not running pub from source |
+/// in the Dart repo. |
+final String dartRepoRoot = (() { |
+ if (!runningFromDartRepo) { |
+ throw new StateError("Not running from source in the Dart repo."); |
+ } |
+ |
+ // In the Dart repo, the script is in "third_party/pkg/pub/bin". |
+ return path.dirname(path.dirname(path.dirname(path.dirname(path.dirname( |
+ path.fromUri(Platform.script)))))); |
+})(); |
/// A line-by-line stream of standard input. |
final Stream<String> stdinLines = streamToLines( |
@@ -873,10 +915,10 @@ bool _computeNoUnknownKeyword() { |
return major >= 2 || (major == 1 && minor >= 23); |
} |
-String get pathTo7zip { |
- if (runningFromSdk) return assetPath(path.join('7zip', '7za.exe')); |
- return path.join(repoRoot, 'third_party', '7zip', '7za.exe'); |
-} |
+final String pathTo7zip = (() { |
+ if (!runningFromDartRepo) return sdkAssetPath(path.join('7zip', '7za.exe')); |
+ return path.join(dartRepoRoot, 'third_party', '7zip', '7za.exe'); |
+})(); |
Future<bool> _extractTarGzWindows(Stream<List<int>> stream, |
String destination) { |