Index: sdk/lib/_internal/pub/lib/src/io.dart |
diff --git a/sdk/lib/_internal/pub/lib/src/io.dart b/sdk/lib/_internal/pub/lib/src/io.dart |
index fef43ec81cd3b33ceb3c35a2752094a5392c0a78..9b9076f3be3f91de9f06d514a06e533304c25e95 100644 |
--- a/sdk/lib/_internal/pub/lib/src/io.dart |
+++ b/sdk/lib/_internal/pub/lib/src/io.dart |
@@ -252,9 +252,30 @@ void createPackageSymlink(String name, String target, String symlink, |
} |
} |
-/// Resolves [target] relative to the root directory of pub. |
-String relativeToPub(String target) => path.normalize(path.join( |
- path.dirname(libraryPath('pub.io')), '..', '..', target)); |
+/// Whether pub is running from within the Dart SDK, as opposed to from the Dart |
+/// source repository. |
+bool get runningFromSdk => path.extension(new Options().script) == 'snapshot'; |
+ |
+/// Resolves [target] relative to the path to pub's `resource` directory. |
+String resourcePath(String target) { |
+ if (runningFromSdk) { |
+ return path.join( |
+ sdk.rootDirectory, 'lib', '_internal', 'pub', 'resource', target); |
+ } else { |
+ return path.join( |
+ path.dirname(libraryPath('pub.io')), '..', '..', 'resource', target); |
+ } |
+} |
+ |
+/// Returns the path to the root of the Dart repository. This will throw a |
+/// [StateError] if it's called when running pub from the SDK. |
+String get repoRoot { |
+ if (runningFromSdk) { |
+ throw new StateError("Can't get the repo root from the SDK."); |
+ } |
+ return path.join( |
+ path.dirname(libraryPath('pub.io')), '..', '..', '..', '..', '..', '..'); |
+} |
/// A line-by-line stream of standard input. |
final Stream<String> stdinLines = streamToLines( |
@@ -538,6 +559,11 @@ Future<bool> extractTarGz(Stream<List<int>> stream, String destination) { |
}); |
} |
+String get pathTo7zip { |
+ if (runningFromSdk) return resourcePath(path.join('7zip', '7za.exe')); |
+ return join(repoRoot, 'third_party', '7zip', '7za.exe'); |
+} |
+ |
Future<bool> _extractTarGzWindows(Stream<List<int>> stream, |
String destination) { |
// TODO(rnystrom): In the repo's history, there is an older implementation of |
@@ -547,11 +573,6 @@ Future<bool> _extractTarGzWindows(Stream<List<int>> stream, |
// read from stdin instead of a file. Consider resurrecting that version if |
// we can figure out why it fails. |
- // Note: This line of code gets munged by create_sdk.py to be the correct |
- // relative path to 7zip in the SDK. |
- var pathTo7zip = '../../../../third_party/7zip/7za.exe'; |
- var command = relativeToPub(pathTo7zip); |
- |
return withTempDir((tempDir) { |
// Write the archive to a temp file. |
var dataFile = path.join(tempDir, 'data.tar.gz'); |
@@ -560,7 +581,7 @@ Future<bool> _extractTarGzWindows(Stream<List<int>> stream, |
// first we un-gzip it to a tar file. |
// Note: Setting the working directory instead of passing in a full file |
// path because 7zip says "A full path is not allowed here." |
- return runProcess(command, ['e', 'data.tar.gz'], workingDir: tempDir); |
+ return runProcess(pathTo7zip, ['e', 'data.tar.gz'], workingDir: tempDir); |
}).then((result) { |
if (result.exitCode != 0) { |
throw new Exception('Could not un-gzip (exit code ${result.exitCode}). ' |
@@ -577,7 +598,7 @@ Future<bool> _extractTarGzWindows(Stream<List<int>> stream, |
}); |
// Untar the archive into the destination directory. |
- return runProcess(command, ['x', tarFile], workingDir: destination); |
+ return runProcess(pathTo7zip, ['x', tarFile], workingDir: destination); |
}).then((result) { |
if (result.exitCode != 0) { |
throw new Exception('Could not un-tar (exit code ${result.exitCode}). ' |
@@ -635,20 +656,15 @@ ByteStream createTarGz(List contents, {baseDir}) { |
var args = ["a", "-w$baseDir", tarFile]; |
args.addAll(contents.map((entry) => '-i!"$entry"')); |
- // Note: This line of code gets munged by create_sdk.py to be the correct |
- // relative path to 7zip in the SDK. |
- var pathTo7zip = '../../../../third_party/7zip/7za.exe'; |
- var command = relativeToPub(pathTo7zip); |
- |
// We're passing 'baseDir' both as '-w' and setting it as the working |
// directory explicitly here intentionally. The former ensures that the |
// files added to the archive have the correct relative path in the archive. |
// The latter enables relative paths in the "-i" args to be resolved. |
- return runProcess(command, args, workingDir: baseDir).then((_) { |
+ return runProcess(pathTo7zip, args, workingDir: baseDir).then((_) { |
// GZIP it. 7zip doesn't support doing both as a single operation. Send |
// the output to stdout. |
args = ["a", "unused", "-tgzip", "-so", tarFile]; |
- return startProcess(command, args); |
+ return startProcess(pathTo7zip, args); |
}).then((process) { |
// Ignore 7zip's stderr. 7zip writes its normal output to stderr. We don't |
// want to show that since it's meaningless. |