| Index: utils/pub/io.dart
|
| diff --git a/utils/pub/io.dart b/utils/pub/io.dart
|
| index bef2b2ae37e5f7d648c3203e3ad66e9c6cafec23..4a338177d5e2536fec7b609093c7a3dbfedd2ff7 100644
|
| --- a/utils/pub/io.dart
|
| +++ b/utils/pub/io.dart
|
| @@ -495,48 +495,51 @@ Future<PubProcessResult> runProcess(String executable, List<String> args,
|
| }
|
| options.environment = environment;
|
|
|
| - final process = Process.start(executable, args, options);
|
| -
|
| - final outStream = new StringInputStream(process.stdout);
|
| - final processStdout = <String>[];
|
| -
|
| - final errStream = new StringInputStream(process.stderr);
|
| - final processStderr = <String>[];
|
| -
|
| final completer = new Completer<PubProcessResult>();
|
|
|
| - checkComplete() {
|
| - // Wait until the process is done and its output streams are closed.
|
| - if (!pipeStdout && !outStream.closed) return;
|
| - if (!pipeStderr && !errStream.closed) return;
|
| - if (exitCode == null) return;
|
| + var processFuture = Process.start(executable, args, options);
|
| + processFuture.then((process) {
|
| + final outStream = new StringInputStream(process.stdout);
|
| + final processStdout = <String>[];
|
|
|
| - completer.complete(new PubProcessResult(
|
| - processStdout, processStderr, exitCode));
|
| - }
|
| + final errStream = new StringInputStream(process.stderr);
|
| + final processStderr = <String>[];
|
|
|
| - if (pipeStdout) {
|
| - process.stdout.pipe(stdout, close: false);
|
| - } else {
|
| - outStream.onLine = () => processStdout.add(outStream.readLine());
|
| - outStream.onClosed = checkComplete;
|
| - outStream.onError = (error) => completer.completeException(error);
|
| - }
|
| + checkComplete() {
|
| + // Wait until the process is done and its output streams are closed.
|
| + if (!pipeStdout && !outStream.closed) return;
|
| + if (!pipeStderr && !errStream.closed) return;
|
| + if (exitCode == null) return;
|
|
|
| - if (pipeStderr) {
|
| - process.stderr.pipe(stderr, close: false);
|
| - } else {
|
| - errStream.onLine = () => processStderr.add(errStream.readLine());
|
| - errStream.onClosed = checkComplete;
|
| - errStream.onError = (error) => completer.completeException(error);
|
| - }
|
| + completer.complete(new PubProcessResult(
|
| + processStdout, processStderr, exitCode));
|
| + }
|
|
|
| - process.onExit = (actualExitCode) {
|
| - exitCode = actualExitCode;
|
| - checkComplete();
|
| - };
|
| + if (pipeStdout) {
|
| + process.stdout.pipe(stdout, close: false);
|
| + } else {
|
| + outStream.onLine = () => processStdout.add(outStream.readLine());
|
| + outStream.onClosed = checkComplete;
|
| + outStream.onError = (error) => completer.completeException(error);
|
| + }
|
|
|
| - process.onError = (error) => completer.completeException(error);
|
| + if (pipeStderr) {
|
| + process.stderr.pipe(stderr, close: false);
|
| + } else {
|
| + errStream.onLine = () => processStderr.add(errStream.readLine());
|
| + errStream.onClosed = checkComplete;
|
| + errStream.onError = (error) => completer.completeException(error);
|
| + }
|
| +
|
| + process.onExit = (actualExitCode) {
|
| + exitCode = actualExitCode;
|
| + checkComplete();
|
| + };
|
| + });
|
| + processFuture.handleException((error) {
|
| + completer.completeException(error);
|
| + return true;
|
| + });
|
|
|
| return completer.future;
|
| }
|
| @@ -640,20 +643,19 @@ Future<bool> extractTarGz(InputStream stream, destination) {
|
| return _extractTarGzWindows(stream, destination);
|
| }
|
|
|
| - var process = Process.start("tar",
|
| - ["--extract", "--gunzip", "--directory", destination]);
|
| var completer = new Completer<int>();
|
| -
|
| - process.onExit = completer.complete;
|
| - process.onError = completer.completeException;
|
| -
|
| - // Wait for the process to be fully started before writing to its
|
| - // stdin stream.
|
| - process.onStart = () {
|
| + var processFuture = Process.start("tar",
|
| + ["--extract", "--gunzip", "--directory", destination]);
|
| + processFuture.then((process) {
|
| + process.onExit = completer.complete;
|
| stream.pipe(process.stdin);
|
| process.stdout.pipe(stdout, close: false);
|
| process.stderr.pipe(stderr, close: false);
|
| - };
|
| + });
|
| + processFuture.handleException((error) {
|
| + completer.completeException(error);
|
| + return true;
|
| + });
|
|
|
| return completer.future.transform((exitCode) => exitCode == 0);
|
| }
|
|
|