Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(13)

Unified Diff: sdk/lib/_internal/pub/lib/src/io.dart

Issue 101523003: Add chain support to barback. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 fa11055a97b952e91d28ffa4549e043896b9eb05..9d798f3f4cc7b4b5018e2575496028f6112e0643 100644
--- a/sdk/lib/_internal/pub/lib/src/io.dart
+++ b/sdk/lib/_internal/pub/lib/src/io.dart
@@ -481,22 +481,23 @@ Future store(Stream stream, EventSink sink,
/// the inherited variables.
Future<PubProcessResult> runProcess(String executable, List<String> args,
{workingDir, Map<String, String> environment}) {
- // TODO(nweiz): use _descriptorPool here.
- return _doProcess(Process.run, executable, args, workingDir, environment)
- .then((result) {
- // TODO(rnystrom): Remove this and change to returning one string.
- List<String> toLines(String output) {
- var lines = splitLines(output);
- if (!lines.isEmpty && lines.last == "") lines.removeLast();
- return lines;
- }
+ return _descriptorPool.withResource(() {
+ return _doProcess(Process.run, executable, args, workingDir, environment)
+ .then((result) {
+ // TODO(rnystrom): Remove this and change to returning one string.
+ List<String> toLines(String output) {
+ var lines = splitLines(output);
+ if (!lines.isEmpty && lines.last == "") lines.removeLast();
+ return lines;
+ }
- var pubResult = new PubProcessResult(toLines(result.stdout),
- toLines(result.stderr),
- result.exitCode);
+ var pubResult = new PubProcessResult(toLines(result.stdout),
+ toLines(result.stderr),
+ result.exitCode);
- log.processResult(executable, pubResult);
- return pubResult;
+ log.processResult(executable, pubResult);
+ return pubResult;
+ });
Bob Nystrom 2013/12/04 17:37:21 Is this intentionally in this patch?
nweiz 2013/12/04 22:41:30 Nope, it's a merge error.
});
}
@@ -508,9 +509,14 @@ Future<PubProcessResult> runProcess(String executable, List<String> args,
/// the inherited variables.
Future<PubProcess> startProcess(String executable, List<String> args,
{workingDir, Map<String, String> environment}) {
- // TODO(nweiz): use _descriptorPool here.
- return _doProcess(Process.start, executable, args, workingDir, environment)
- .then((ioProcess) => new PubProcess(ioProcess));
+ return _descriptorPool.request().then((resource) {
+ return _doProcess(Process.start, executable, args, workingDir, environment)
+ .then((ioProcess) {
+ var process = new PubProcess(ioProcess);
+ process.exitCode.whenComplete(resource.release);
+ return process;
+ });
+ });
}
/// A wrapper around [Process] that exposes `dart:async`-style APIs.
@@ -689,8 +695,7 @@ Future<bool> extractTarGz(Stream<List<int>> stream, String destination) {
throw new Exception("Failed to extract .tar.gz stream to $destination "
"(exit code $exitCode).");
}
- log.fine("Extracted .tar.gz stream to $destination. Exit code "
- "$exitCode.");
+ log.fine("Extracted .tar.gz stream to $destination. Exit code $exitCode.");
});
}
@@ -712,14 +717,6 @@ Future<bool> _extractTarGzWindows(Stream<List<int>> stream,
// Write the archive to a temp file.
var dataFile = path.join(tempDir, 'data.tar.gz');
return createFileFromStream(stream, dataFile).then((_) {
- log.io("Does $dataFile exist? ${fileExists(dataFile)}");
- try {
- readBinaryFile(dataFile);
- log.io("Can read $dataFile.");
- } on IOException catch (e) {
- log.io("Cannot read $dataFile: $e");
- }
-
// 7zip can't unarchive from gzip -> tar -> destination all in one step
// first we un-gzip it to a tar file.
// Note: Setting the working directory instead of passing in a full file
@@ -759,57 +756,58 @@ Future<bool> _extractTarGzWindows(Stream<List<int>> stream,
/// considered to be [baseDir], which defaults to the current working directory.
/// Returns a [ByteStream] that will emit the contents of the archive.
ByteStream createTarGz(List contents, {baseDir}) {
- return new ByteStream(futureStream(_descriptorPool.request().then((resource) {
- return new Future.sync(() {
- var buffer = new StringBuffer();
- buffer.write('Creating .tag.gz stream containing:\n');
- contents.forEach((file) => buffer.write('$file\n'));
- log.fine(buffer.toString());
-
- var controller = new StreamController<List<int>>(sync: true);
-
- if (baseDir == null) baseDir = path.current;
- baseDir = path.absolute(baseDir);
- contents = contents.map((entry) {
- entry = path.absolute(entry);
- if (!isBeneath(entry, baseDir)) {
- throw new ArgumentError('Entry $entry is not inside $baseDir.');
- }
- return path.relative(entry, from: baseDir);
- }).toList();
-
- if (Platform.operatingSystem != "windows") {
- var args = ["--create", "--gzip", "--directory", baseDir];
- args.addAll(contents);
- // TODO(nweiz): It's possible that enough command-line arguments will
- // make the process choke, so at some point we should save the arguments
- // to a file and pass them in via --files-from for tar and -i@filename
- // for 7zip.
- return startProcess("tar", args).then((process) => process.stdout);
+ return new ByteStream(futureStream(new Future.sync(() {
+ var buffer = new StringBuffer();
+ buffer.write('Creating .tag.gz stream containing:\n');
+ contents.forEach((file) => buffer.write('$file\n'));
+ log.fine(buffer.toString());
+
+ var controller = new StreamController<List<int>>(sync: true);
+
+ if (baseDir == null) baseDir = path.current;
+ baseDir = path.absolute(baseDir);
+ contents = contents.map((entry) {
+ entry = path.absolute(entry);
+ if (!isBeneath(entry, baseDir)) {
+ throw new ArgumentError('Entry $entry is not inside $baseDir.');
}
+ return path.relative(entry, from: baseDir);
+ }).toList();
+
+ if (Platform.operatingSystem != "windows") {
+ var args = ["--create", "--gzip", "--directory", baseDir];
+ args.addAll(contents);
+ // TODO(nweiz): It's possible that enough command-line arguments will
+ // make the process choke, so at some point we should save the arguments
+ // to a file and pass them in via --files-from for tar and -i@filename
+ // for 7zip.
+ return startProcess("tar", args).then((process) => process.stdout);
+ }
- return withTempDir((tempDir) {
- // Create the tar file.
- var tarFile = path.join(tempDir, "intermediate.tar");
- var args = ["a", "-w$baseDir", tarFile];
- args.addAll(contents.map((entry) => '-i!$entry'));
-
- // 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(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(pathTo7zip, args);
- }).then((process) => process.stdout);
- });
+ // Don't use [withTempDir] here because we don't want to delete the temp
+ // directory until the returned stream has closed.
+ var tempDir = createSystemTempDir();
+ return new Future.sync(() {
+ // Create the tar file.
+ var tarFile = path.join(tempDir, "intermediate.tar");
+ var args = ["a", "-w$baseDir", tarFile];
+ args.addAll(contents.map((entry) => '-i!$entry'));
+
+ // 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(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(pathTo7zip, args);
+ }).then((process) => process.stdout);
}).then((stream) {
- return stream.transform(onDoneTransformer(() => resource.release()));
+ return stream.transform(onDoneTransformer(() => deleteEntry(tempDir)));
}).catchError((e) {
- resource.release();
+ deleteEntry(tempDir);
throw e;
});
})));

Powered by Google App Engine
This is Rietveld 408576698