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 <cmd> --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 <kupriyanov@strato.de>
pull/62718/head
Misha M.-Kupriyanov 3 weeks ago committed by Andy Scherzinger
parent 4999cd8cd2
commit 0cd4ece504
  1. 4
      lib/private/Console/Application.php

@ -96,7 +96,7 @@ class Application {
try {
$this->loadCommandsFromInfoXml($info['commands']);
} catch (\Throwable $e) {
$output->writeln('<error>' . $e->getMessage() . '</error>');
$output->getErrorOutput()->writeln('<error>' . $e->getMessage() . '</error>');
$this->logger->error($e->getMessage(), [
'exception' => $e,
]);
@ -118,7 +118,7 @@ class Application {
try {
$this->loadCommandsFromInfoXml($info['commands']);
} catch (\Throwable $e) {
$output->writeln('<error>' . $e->getMessage() . '</error>');
$output->getErrorOutput()->writeln('<error>' . $e->getMessage() . '</error>');
$this->logger->error($e->getMessage(), [
'exception' => $e,
]);

Loading…
Cancel
Save