1
0
Fork 0

Always show a stack trace for \Error & LogicException throwables even if output is not verbose

pull/10669/head
Jordi Boggiano 2022-03-30 10:34:38 +02:00
parent d1fa5d1ede
commit af3e67e745
No known key found for this signature in database
GPG Key ID: 7BBD42C429EC80BC
2 changed files with 32 additions and 4 deletions

View File

@ -16,6 +16,7 @@ use Composer\IO\NullIO;
use Composer\Util\Filesystem;
use Composer\Util\Platform;
use Composer\Util\Silencer;
use LogicException;
use Symfony\Component\Console\Application as BaseApplication;
use Symfony\Component\Console\Exception\CommandNotFoundException;
use Symfony\Component\Console\Helper\HelperSet;
@ -23,6 +24,7 @@ use Symfony\Component\Console\Helper\QuestionHelper;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Seld\JsonLint\ParsingException;
use Composer\Command;
@ -343,11 +345,33 @@ class Application extends BaseApplication
return $result;
} catch (ScriptExecutionException $e) {
return $e->getCode();
} catch (\Exception $e) {
} catch (\Throwable $e) {
$ghe = new GithubActionError($this->io);
$ghe->emit($e->getMessage());
$this->hintCommonErrors($e);
$this->hintCommonErrors($e, $output);
// symfony/console does not handle \Error subtypes so we have to renderThrowable ourselves
// instead of rethrowing those for consumption by the parent class
if (!$e instanceof \Exception) {
if ($output instanceof ConsoleOutputInterface) {
$this->renderThrowable($e, $output->getErrorOutput());
} else {
$this->renderThrowable($e, $output);
}
$exitCode = $e->getCode();
if (is_numeric($exitCode)) {
$exitCode = (int) $exitCode;
if (0 === $exitCode) {
$exitCode = 1;
}
} else {
$exitCode = 1;
}
return $exitCode;
}
throw $e;
} finally {
@ -374,10 +398,14 @@ class Application extends BaseApplication
/**
* @return void
*/
private function hintCommonErrors(\Exception $exception): void
private function hintCommonErrors(\Throwable $exception, OutputInterface $output): void
{
$io = $this->getIO();
if ((get_class($exception) === LogicException::class || $exception instanceof \Error) && $output->getVerbosity() < OutputInterface::VERBOSITY_VERBOSE) {
$output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE);
}
Silencer::suppress();
try {
$composer = $this->getComposer(false, true);

View File

@ -479,7 +479,7 @@ class HttpDownloader
*
* @return ?string[]
*/
public static function getExceptionHints(\Exception $e): ?array
public static function getExceptionHints(\Throwable $e): ?array
{
if (!$e instanceof TransportException) {
return null;