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(
bool canFail = false, // as in, whether failures are ok. False means that they are fatal.
String workingDirectory,
}) async {
final Process process = await startProcess(executable, arguments, environment: environment, workingDirectory: workingDirectory);
await forwardStandardStreams(process);
return _execute(
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;
if (exitCode != 0 && !canFail)
......@@ -335,26 +366,42 @@ Future<int> exec(
}
/// 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.
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> stderrDone = Completer<void>();
process.stdout
.transform<String>(utf8.decoder)
.transform<String>(const LineSplitter())
.listen((String line) {
print('stdout: $line');
if (printStdout) {
print('stdout: $line');
}
output?.writeln(line);
}, onDone: () { stdoutDone.complete(); });
process.stderr
.transform<String>(utf8.decoder)
.transform<String>(const LineSplitter())
.listen((String line) {
print('stderr: $line');
if (printStderr) {
print('stderr: $line');
}
stderr?.writeln(line);
}, 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.
......@@ -370,36 +417,18 @@ Future<String> eval(
bool printStdout = true,
bool printStderr = true,
}) async {
final Process process = await startProcess(executable, arguments, environment: environment, workingDirectory: workingDirectory);
final StringBuffer output = StringBuffer();
final Completer<void> stdoutDone = Completer<void>();
final Completer<void> stderrDone = Completer<void>();
process.stdout
.transform<String>(utf8.decoder)
.transform<String>(const LineSplitter())
.listen((String line) {
if (printStdout) {
print('stdout: $line');
}
output.writeln(line);
}, 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.');
await _execute(
executable,
arguments,
environment: environment,
canFail: canFail,
workingDirectory: workingDirectory,
output: output,
stderr: stderr,
printStdout: printStdout,
printStderr: printStderr,
);
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