diff --git a/script/tool/lib/src/publish_check_command.dart b/script/tool/lib/src/publish_check_command.dart index 3f90465d4f..7a080f4420 100644 --- a/script/tool/lib/src/publish_check_command.dart +++ b/script/tool/lib/src/publish_check_command.dart @@ -175,7 +175,10 @@ class PublishCheckCommand extends PluginCommand { (List event) { final String output = String.fromCharCodes(event); if (output.isNotEmpty) { - _printImportantStatusMessage(output, isError: true); + // The final result is always printed on stderr, whether success or + // failure. + final bool isError = !output.contains('has 0 warnings'); + _printImportantStatusMessage(output, isError: isError); outputBuffer.write(output); } }, diff --git a/script/tool/test/publish_check_command_test.dart b/script/tool/test/publish_check_command_test.dart index 8c34b3313a..38e8504fa0 100644 --- a/script/tool/test/publish_check_command_test.dart +++ b/script/tool/test/publish_check_command_test.dart @@ -132,6 +132,26 @@ void main() { expect(runner.run(['publish-check']), throwsA(isA())); }); + test('Success message on stderr is not printed as an error', () async { + createFakePlugin('d'); + + const String publishOutput = 'Package has 0 warnings.'; + + final MockProcess process = MockProcess(); + process.stderrController.add(publishOutput.codeUnits); + process.stdoutController.close(); // ignore: unawaited_futures + process.stderrController.close(); // ignore: unawaited_futures + + process.exitCodeCompleter.complete(0); + + processRunner.processesToReturn.add(process); + + final List output = await runCapturingPrint( + runner, ['publish-check']); + + expect(output, isNot(contains(contains('ERROR:')))); + }); + test( '--machine: Log JSON with status:no-publish and correct human message, if there are no packages need to be published. ', () async {