Unverified Commit b5d0b912 authored by Ming Lyu (CareF)'s avatar Ming Lyu (CareF) Committed by GitHub

Cleanup devicelab framework duplicate (#59046)

* combine forwardStandardStreams

* combine exec and eval
parent e13b44d9
...@@ -324,8 +324,39 @@ Future<int> exec( ...@@ -324,8 +324,39 @@ Future<int> exec(
bool canFail = false, // as in, whether failures are ok. False means that they are fatal. bool canFail = false, // as in, whether failures are ok. False means that they are fatal.
String workingDirectory, String workingDirectory,
}) async { }) async {
final Process process = await startProcess(executable, arguments, environment: environment, workingDirectory: workingDirectory); return _execute(
await forwardStandardStreams(process); executable,
arguments,
environment: environment,
canFail : canFail,
workingDirectory: workingDirectory,
);
}
Future<int> _execute(
String executable,
List<String> arguments, {
Map<String, String> environment,
bool canFail = false, // as in, whether failures are ok. False means that they are fatal.
String workingDirectory,
StringBuffer output, // if not null, the stdout will be written here
StringBuffer stderr, // if not null, the stderr will be written here
bool printStdout = true,
bool printStderr = true,
}) async {
final Process process = await startProcess(
executable,
arguments,
environment: environment,
workingDirectory: workingDirectory,
);
await forwardStandardStreams(
process,
output: output,
stderr: stderr,
printStdout: printStdout,
printStderr: printStderr,
);
final int exitCode = await process.exitCode; final int exitCode = await process.exitCode;
if (exitCode != 0 && !canFail) if (exitCode != 0 && !canFail)
...@@ -335,26 +366,42 @@ Future<int> exec( ...@@ -335,26 +366,42 @@ Future<int> exec(
} }
/// Forwards standard out and standard error from [process] to this process' /// Forwards standard out and standard error from [process] to this process'
/// respective outputs. /// respective outputs. Also writes stdout to [output] and stderr to [stderr]
/// if they are not null.
/// ///
/// Returns a future that completes when both out and error streams a closed. /// Returns a future that completes when both out and error streams a closed.
Future<void> forwardStandardStreams(Process process) { Future<void> forwardStandardStreams(
Process process, {
StringBuffer output,
StringBuffer stderr,
bool printStdout = true,
bool printStderr = true,
}) {
final Completer<void> stdoutDone = Completer<void>(); final Completer<void> stdoutDone = Completer<void>();
final Completer<void> stderrDone = Completer<void>(); final Completer<void> stderrDone = Completer<void>();
process.stdout process.stdout
.transform<String>(utf8.decoder) .transform<String>(utf8.decoder)
.transform<String>(const LineSplitter()) .transform<String>(const LineSplitter())
.listen((String line) { .listen((String line) {
if (printStdout) {
print('stdout: $line'); print('stdout: $line');
}
output?.writeln(line);
}, onDone: () { stdoutDone.complete(); }); }, onDone: () { stdoutDone.complete(); });
process.stderr process.stderr
.transform<String>(utf8.decoder) .transform<String>(utf8.decoder)
.transform<String>(const LineSplitter()) .transform<String>(const LineSplitter())
.listen((String line) { .listen((String line) {
if (printStderr) {
print('stderr: $line'); print('stderr: $line');
}
stderr?.writeln(line);
}, onDone: () { stderrDone.complete(); }); }, onDone: () { stderrDone.complete(); });
return Future.wait<void>(<Future<void>>[stdoutDone.future, stderrDone.future]); return Future.wait<void>(<Future<void>>[
stdoutDone.future,
stderrDone.future,
]);
} }
/// Executes a command and returns its standard output as a String. /// Executes a command and returns its standard output as a String.
...@@ -370,36 +417,18 @@ Future<String> eval( ...@@ -370,36 +417,18 @@ Future<String> eval(
bool printStdout = true, bool printStdout = true,
bool printStderr = true, bool printStderr = true,
}) async { }) async {
final Process process = await startProcess(executable, arguments, environment: environment, workingDirectory: workingDirectory);
final StringBuffer output = StringBuffer(); final StringBuffer output = StringBuffer();
final Completer<void> stdoutDone = Completer<void>(); await _execute(
final Completer<void> stderrDone = Completer<void>(); executable,
process.stdout arguments,
.transform<String>(utf8.decoder) environment: environment,
.transform<String>(const LineSplitter()) canFail: canFail,
.listen((String line) { workingDirectory: workingDirectory,
if (printStdout) { output: output,
print('stdout: $line'); stderr: stderr,
} printStdout: printStdout,
output.writeln(line); printStderr: printStderr,
}, onDone: () { stdoutDone.complete(); }); );
process.stderr
.transform<String>(utf8.decoder)
.transform<String>(const LineSplitter())
.listen((String line) {
if (printStderr) {
print('stderr: $line');
}
stderr?.writeln(line);
}, onDone: () { stderrDone.complete(); });
await Future.wait<void>(<Future<void>>[stdoutDone.future, stderrDone.future]);
final int exitCode = await process.exitCode;
if (exitCode != 0 && !canFail)
fail('Executable "$executable" failed with exit code $exitCode.');
return output.toString().trimRight(); return output.toString().trimRight();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment