|
3 | 3 | // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
|
5 | 5 | import 'dart:async'; |
6 | | -import 'dart:convert' show JsonUtf8Encoder, utf8; |
| 6 | +import 'dart:convert' show JsonUtf8Encoder, LineSplitter, utf8; |
7 | 7 | import 'dart:io' |
8 | 8 | show Directory, File, IOException, Platform, Process, ProcessSignal, gzip; |
9 | 9 | import 'dart:isolate' show Isolate; |
@@ -152,12 +152,28 @@ Future<void> _analyzePackage( |
152 | 152 | await pana.stdin.close(); |
153 | 153 |
|
154 | 154 | await Future.wait<void>([ |
155 | | - pana.stderr.forEach(log.add), |
156 | | - pana.stdout.forEach(log.add), |
| 155 | + pana.stderr |
| 156 | + .transform(utf8.decoder) |
| 157 | + .transform(LineSplitter()) |
| 158 | + .forEach(log.writeln), |
| 159 | + pana.stdout |
| 160 | + .transform(utf8.decoder) |
| 161 | + .transform(LineSplitter()) |
| 162 | + .forEach(log.writeln), |
157 | 163 | pana.exitOrTimeout(_panaTimeout, () { |
158 | 164 | log.writeln('TIMEOUT: pana sending SIGTERM/SIGKILL'); |
159 | 165 | }), |
160 | | - ]).catchError((e) => const [/* ignore */]); |
| 166 | + ]).catchError((e, st) { |
| 167 | + log.writeln('Error waiting for pana process: $e'); |
| 168 | + log.writeln(st); |
| 169 | + // kill the process if not already killed |
| 170 | + try { |
| 171 | + pana.kill(ProcessSignal.sigkill); |
| 172 | + } finally { |
| 173 | + // ignore |
| 174 | + } |
| 175 | + return const []; |
| 176 | + }); |
161 | 177 | final exitCode = await pana.exitCode; |
162 | 178 |
|
163 | 179 | log.writeln('### Execution of pana exited $exitCode'); |
|
0 commit comments