From e794b1240ef69178e36d55a1d544535ff2c061a1 Mon Sep 17 00:00:00 2001 From: Loic Sharma Date: Fri, 23 Feb 2024 13:40:06 -0800 Subject: [PATCH] [Pigeon] Fix tool hangs on verbose sub-processes --- .../pigeon/tool/shared/process_utils.dart | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/pigeon/tool/shared/process_utils.dart b/packages/pigeon/tool/shared/process_utils.dart index 28c816f18b1..e38a4af777f 100644 --- a/packages/pigeon/tool/shared/process_utils.dart +++ b/packages/pigeon/tool/shared/process_utils.dart @@ -16,13 +16,29 @@ Future runProcess(String command, List arguments, mode: streamOutput ? ProcessStartMode.inheritStdio : ProcessStartMode.normal, ); + + if (streamOutput) { + return process.exitCode; + } + + final List stdoutBuffer = []; + final List stderrBuffer = []; + final Future stdoutFuture = process.stdout.forEach(stdoutBuffer.addAll); + final Future stderrFuture = process.stderr.forEach(stderrBuffer.addAll); final int exitCode = await process.exitCode; + await Future.wait(>[ + stdoutFuture, + stderrFuture, + ]); + if (exitCode != 0 && logFailure) { // ignore: avoid_print print('$command $arguments failed:'); + stdout.add(stdoutBuffer); + stderr.add(stderrBuffer); await Future.wait(>[ - process.stdout.pipe(stdout), - process.stderr.pipe(stderr), + stdout.flush(), + stderr.flush(), ]); } return exitCode;