runStreamingInspected function
Like runStreaming but:
- strips ANSI escape sequences from subprocess output when
headlessis true - scans each line for
[WARNING]patterns whenscanWarningsis true
Returns a record (exitCode, hadWarnings).
Implementation
Future<({int exitCode, bool hadWarnings})> runStreamingInspected(
String executable,
List<String> args, {
String? workingDirectory,
bool headless = false,
bool scanWarnings = false,
}) async {
final process = await Process.start(executable, args, workingDirectory: workingDirectory);
StreamSubscription? sigintSub;
StreamSubscription? sigtermSub;
if (!Platform.isWindows) {
sigintSub = ProcessSignal.sigint.watch().listen((_) {
process.kill(ProcessSignal.sigint);
exit(130);
});
sigtermSub = ProcessSignal.sigterm.watch().listen((_) {
process.kill(ProcessSignal.sigterm);
exit(143);
});
}
var hadWarnings = false;
void handleLine(String line) {
if (scanWarnings && line.contains('[WARNING]')) hadWarnings = true;
stdout.writeln(headless ? stripAnsi(line) : line);
}
await Future.wait([
process.stdout.transform(utf8.decoder).transform(const LineSplitter()).listen(handleLine).asFuture<void>(),
process.stderr.transform(utf8.decoder).transform(const LineSplitter()).listen(handleLine).asFuture<void>(),
]);
await sigintSub?.cancel();
await sigtermSub?.cancel();
return (exitCode: await process.exitCode, hadWarnings: hadWarnings);
}