runAsync function

Future<String> runAsync (String executable, { List<String> arguments: const [], RunOptions runOptions, bool quiet: false, String workingDirectory })

Asynchronously run an executable.

If quiet is false, logs the stdout as line breaks are encountered. The stderr is always logged.

Returns a future for the stdout.

All other optional parameters are forwarded to Process.start.

Implementation

Future<String> runAsync(String executable,
    {List<String> arguments: const [],
    RunOptions runOptions,
    bool quiet: false,
    String workingDirectory}) {
  runOptions = mergeWorkingDirectory(workingDirectory, runOptions);
  if (!quiet) log("$executable ${arguments.join(' ')}");
  if (runOptions == null) runOptions = new RunOptions();
  List<int> stdout = [], stderr = [];

  return Process
      .start(executable, arguments,
          workingDirectory: runOptions.workingDirectory,
          environment: runOptions.environment,
          includeParentEnvironment: runOptions.includeParentEnvironment,
          runInShell: runOptions.runInShell)
      .then((Process process) {
    // Handle stdout.
    var broadcastStdout = process.stdout.asBroadcastStream();
    var stdoutLines = toLineStream(broadcastStdout, runOptions.stdoutEncoding);
    broadcastStdout.listen((List<int> data) => stdout.addAll(data));
    if (!quiet) {
      stdoutLines.listen(logStdout);
    }

    // Handle stderr.
    var broadcastStderr = process.stderr.asBroadcastStream();
    var stderrLines = toLineStream(broadcastStderr, runOptions.stderrEncoding);
    broadcastStderr.listen((List<int> data) => stderr.addAll(data));
    stderrLines.listen(logStderr);

    var encoding = runOptions.stdoutEncoding != null
        ? runOptions.stdoutEncoding
        : systemEncoding;
    return process.exitCode.then((int code) {
      var stdoutString = encoding.decode(stdout);

      if (code != 0) {
        throw new ProcessException._(
            executable, code, stdoutString, encoding.decode(stderr));
      }

      return stdoutString;
    });
  });
}