diff options
author | Christoph Wurst <christoph@winzerhof-wurst.at> | 2021-01-07 20:04:04 +0100 |
---|---|---|
committer | Christoph Wurst <christoph@winzerhof-wurst.at> | 2021-01-07 20:11:25 +0100 |
commit | f1921364d692a521c5bf5860ce453bae3f9facae (patch) | |
tree | 7e52141f0a4d909e95468c3a41b16589561912a6 | |
parent | 5020c73d15cc58cacfe8bebf87dba2652c7ea5c1 (diff) | |
download | nextcloud-server-f1921364d692a521c5bf5860ce453bae3f9facae.tar.gz nextcloud-server-f1921364d692a521c5bf5860ce453bae3f9facae.zip |
Print an exception trace for setup exceptions
Right now any setup error will just result in the exception message
being printed. In some cases this doesn't give any insights into what
went wrong. This adds some dedicated logic to print the exception trace
and any previous exceptions to the CLI.
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
-rw-r--r-- | core/Command/Maintenance/Install.php | 22 | ||||
-rw-r--r-- | lib/private/Setup.php | 4 |
2 files changed, 23 insertions, 3 deletions
diff --git a/core/Command/Maintenance/Install.php b/core/Command/Maintenance/Install.php index dffbbd03382..ed1aeeff922 100644 --- a/core/Command/Maintenance/Install.php +++ b/core/Command/Maintenance/Install.php @@ -43,6 +43,8 @@ use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Question\Question; +use Throwable; +use function get_class; class Install extends Command { @@ -201,11 +203,25 @@ class Install extends Command { protected function printErrors(OutputInterface $output, $errors) { foreach ($errors as $error) { if (is_array($error)) { - $output->writeln('<error>' . (string)$error['error'] . '</error>'); - $output->writeln('<info> -> ' . (string)$error['hint'] . '</info>'); + $output->writeln('<error>' . $error['error'] . '</error>'); + if (isset($error['hint']) && !empty($error['hint'])) { + $output->writeln('<info> -> ' . $error['hint'] . '</info>'); + } + if (isset($error['exception']) && $error['exception'] instanceof Throwable) { + $this->printThrowable($output, $error['exception']); + } } else { - $output->writeln('<error>' . (string)$error . '</error>'); + $output->writeln('<error>' . $error . '</error>'); } } } + + private function printThrowable(OutputInterface $output, Throwable $t): void { + $output->write('<info>Trace: ' . $t->getTraceAsString() . '</info>'); + if ($t->getPrevious() !== null) { + $output->writeln(''); + $output->writeln('<info>Previous: ' . get_class($t->getPrevious()) . ': ' . $t->getPrevious()->getMessage() . '</info>'); + $this->printThrowable($output, $t->getPrevious()); + } + } } diff --git a/lib/private/Setup.php b/lib/private/Setup.php index 873e82e55de..98cf11e3a87 100644 --- a/lib/private/Setup.php +++ b/lib/private/Setup.php @@ -236,6 +236,7 @@ class Setup { } catch (\OC\HintException $e) { $errors[] = [ 'error' => $e->getMessage(), + 'exception' => $e, 'hint' => $e->getHint(), ]; $htAccessWorking = false; @@ -360,12 +361,14 @@ class Setup { } catch (\OC\DatabaseSetupException $e) { $error[] = [ 'error' => $e->getMessage(), + 'exception' => $e, 'hint' => $e->getHint(), ]; return $error; } catch (Exception $e) { $error[] = [ 'error' => 'Error while trying to create admin user: ' . $e->getMessage(), + 'exception' => $e, 'hint' => '', ]; return $error; @@ -376,6 +379,7 @@ class Setup { } catch (Exception $e) { $error[] = [ 'error' => 'Error while trying to initialise the database: ' . $e->getMessage(), + 'exception' => $e, 'hint' => '', ]; return $error; |