From 88d023c2db017385331f0b0b095824b6a7484574 Mon Sep 17 00:00:00 2001 From: "Misha M.-Kupriyanov" Date: Fri, 31 Jul 2026 09:13:17 +0200 Subject: [PATCH] fix(console): write app command loading errors to stderr fix(console): write app command loading errors to stderr When an app fails to load its commands from info.xml, the error was written to stdout, while every other diagnostic in loadCommands() uses $output->getErrorOutput(). The command itself then runs normally and exits 0, so the message silently corrupts machine-readable output: $ ./occ app:list --output=json Connection refused {"enabled":{...},"disabled":{...}} $ echo $? 0 Anything piping `occ --output=json` into a JSON parser breaks, with no non-zero exit code to detect it by. Observed with notify_push on a setup that has the phpredis extension loaded but no Redis configured: RedisFactory::isAvailable() only checks whether the extension is loaded, so constructing the app's console commands ends up calling pconnect() and throws RedisException. --no-warnings is not a workaround for this, as it sets VERBOSITY_QUIET and suppresses the payload too. Route the message to the error output instead. It is still reported via logger->error() exactly as before. Assisted-by: ClaudeCode:claude-opus-5 Signed-off-by: Misha M.-Kupriyanov --- lib/private/Console/Application.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/private/Console/Application.php b/lib/private/Console/Application.php index 4cf1e0da8ca13..67b99310eb6c0 100644 --- a/lib/private/Console/Application.php +++ b/lib/private/Console/Application.php @@ -100,7 +100,7 @@ public function loadCommands( try { $this->loadCommandsFromInfoXml($info['commands']); } catch (\Throwable $e) { - $output->writeln('' . $e->getMessage() . ''); + $output->getErrorOutput()->writeln('' . $e->getMessage() . ''); $this->logger->error($e->getMessage(), [ 'exception' => $e, ]);