From 058beef20a0131546eb448ba097eea9244a2bd29 Mon Sep 17 00:00:00 2001 From: Jellyfrog Date: Tue, 16 Aug 2022 14:19:53 +0200 Subject: [PATCH] CheckPlatformReqs: Add json format output (#10979) Co-authored-by: Jordi Boggiano --- doc/03-cli.md | 6 +++ .../Command/CheckPlatformReqsCommand.php | 52 ++++++++++++++----- 2 files changed, 45 insertions(+), 13 deletions(-) diff --git a/doc/03-cli.md b/doc/03-cli.md index 04a3db408e63..fb6d03bf2018 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -413,6 +413,12 @@ Unlike update/install, this command will ignore config.platform settings and check the real platform packages so you can be certain you have the required platform dependencies. +### Options + +* **--lock:** Checks requirements only from the lock file, not from installed packages. +* **--no-dev:** Disables checking of require-dev packages requirements. +* **--format (-f):** Format of the output: text (default) or json + ## global The global command allows you to run other commands like `install`, `remove`, `require` diff --git a/src/Composer/Command/CheckPlatformReqsCommand.php b/src/Composer/Command/CheckPlatformReqsCommand.php index e8f13d5c91db..d7108e91ddd8 100644 --- a/src/Composer/Command/CheckPlatformReqsCommand.php +++ b/src/Composer/Command/CheckPlatformReqsCommand.php @@ -15,11 +15,12 @@ use Composer\Package\Link; use Composer\Semver\Constraint\Constraint; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; +use Composer\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Composer\Repository\PlatformRepository; use Composer\Repository\RootPackageRepository; use Composer\Repository\InstalledRepository; +use Composer\Json\JsonFile; class CheckPlatformReqsCommand extends BaseCommand { @@ -33,6 +34,7 @@ protected function configure(): void ->setDefinition(array( new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables checking of require-dev packages requirements.'), new InputOption('lock', null, InputOption::VALUE_NONE, 'Checks requirements only from the lock file, not from installed packages.'), + new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text', ['json', 'text']), )) ->setHelp( <<getName() === $require ? $candidate->getPrettyName() : $require, $candidateConstraint->getPrettyString(), $link, - 'failed'.($candidate->getName() === $require ? '' : ' provided by '.$candidate->getPrettyName().''), + 'failed', + $candidate->getName() === $require ? '' : 'provided by '.$candidate->getPrettyName().'', ); // skip to next candidate @@ -139,7 +142,8 @@ protected function execute(InputInterface $input, OutputInterface $output): int $candidate->getName() === $require ? $candidate->getPrettyName() : $require, $candidateConstraint->getPrettyString(), null, - 'success'.($candidate->getName() === $require ? '' : ' provided by '.$candidate->getPrettyName().''), + 'success', + $candidate->getName() === $require ? '' : 'provided by '.$candidate->getPrettyName().'', ); // candidate matched, skip to next requirement @@ -158,13 +162,14 @@ protected function execute(InputInterface $input, OutputInterface $output): int 'n/a', $links[0], 'missing', + '', ); $exitCode = max($exitCode, 2); } } - $this->printTable($output, $results); + $this->printTable($output, $results, $input->getOption('format')); return $exitCode; } @@ -174,22 +179,43 @@ protected function execute(InputInterface $input, OutputInterface $output): int * * @return void */ - protected function printTable(OutputInterface $output, array $results): void + protected function printTable(OutputInterface $output, array $results, string $format): void { $rows = array(); foreach ($results as $result) { /** * @var Link|null $link */ - list($platformPackage, $version, $link, $status) = $result; - $rows[] = array( - $platformPackage, - $version, - $link ? sprintf('%s %s %s (%s)', $link->getSource(), $link->getDescription(), $link->getTarget(), $link->getPrettyConstraint()) : '', - $status, - ); + list($platformPackage, $version, $link, $status, $provider) = $result; + + if ('json' === $format) { + $rows[] = array( + "name" => $platformPackage, + "version" => $version, + "status" => strip_tags($status), + "failed_requirement" => $link instanceof Link ? [ + 'source' => $link->getSource(), + 'type' => $link->getDescription(), + 'target' => $link->getTarget(), + 'constraint' => $link->getPrettyConstraint(), + ] : null, + "provider" => $provider === '' ? null : strip_tags($provider), + ); + } else { + $rows[] = array( + $platformPackage, + $version, + $link, + $link ? sprintf('%s %s %s (%s)', $link->getSource(), $link->getDescription(), $link->getTarget(), $link->getPrettyConstraint()) : '', + rtrim($status.' '.$provider), + ); + } } - $this->renderTable($rows, $output); + if ('json' === $format) { + $this->getIO()->write(JsonFile::encode($rows)); + } else { + $this->renderTable($rows, $output); + } } }