aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Wurst <christoph@winzerhof-wurst.at>2021-01-07 20:04:04 +0100
committerChristoph Wurst <christoph@winzerhof-wurst.at>2021-01-07 20:11:25 +0100
commitf1921364d692a521c5bf5860ce453bae3f9facae (patch)
tree7e52141f0a4d909e95468c3a41b16589561912a6
parent5020c73d15cc58cacfe8bebf87dba2652c7ea5c1 (diff)
downloadnextcloud-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.php22
-rw-r--r--lib/private/Setup.php4
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;