From b42fbab94d40b98e74d357ed67b58dc05244e229 Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 27 Dec 2024 12:22:54 -0500 Subject: [PATCH 1/2] feat: Run setup checks by category or class Signed-off-by: Josh --- lib/private/SetupCheck/SetupCheckManager.php | 29 ++++++++++++++++++-- lib/public/SetupCheck/ISetupCheckManager.php | 20 ++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/lib/private/SetupCheck/SetupCheckManager.php b/lib/private/SetupCheck/SetupCheckManager.php index 6ce4094f616ed..36ff25b481b17 100644 --- a/lib/private/SetupCheck/SetupCheckManager.php +++ b/lib/private/SetupCheck/SetupCheckManager.php @@ -18,18 +18,43 @@ class SetupCheckManager implements ISetupCheckManager { public function __construct( - private Coordinator $coordinator, - private LoggerInterface $logger, + readonly private Coordinator $coordinator, + readonly private LoggerInterface $logger, ) { } + #[\Override] + public function runByClass(string $filterByClass): array { + if (str_starts_with($filterByClass, '\\')) { + $filterByClass = substr($filterByClass, 1); + } + return $this->run(filterByClass: $filterByClass); + } + + #[\Override] + public function runByCategory(string $filterByCategory): array { + return $this->run(filterByCategory: $filterByCategory); + } + #[\Override] public function runAll(): array { + return $this->run(); + } + + private function run(?string $filterByCategory = null, ?string $filterByClass = null): array { $results = []; $setupChecks = $this->coordinator->getRegistrationContext()->getSetupChecks(); foreach ($setupChecks as $setupCheck) { /** @var ISetupCheck $setupCheckObject */ $setupCheckObject = Server::get($setupCheck->getService()); + if ($filterByCategory !== null && $filterByCategory !== $setupCheckObject->getCategory()) { + continue; + } + + if ($filterByClass !== null && $filterByClass !== get_class($setupCheckObject)) { + continue; + } + $this->logger->debug('Running check ' . get_class($setupCheckObject)); try { $setupResult = $setupCheckObject->run(); diff --git a/lib/public/SetupCheck/ISetupCheckManager.php b/lib/public/SetupCheck/ISetupCheckManager.php index 6245be3933a6f..f0b18ea942e8b 100644 --- a/lib/public/SetupCheck/ISetupCheckManager.php +++ b/lib/public/SetupCheck/ISetupCheckManager.php @@ -14,8 +14,28 @@ */ interface ISetupCheckManager { /** + * Run all setup checks and return the results. + * * @since 28.0.0 * @return array> Result of each check, first level key is category, second level key is title */ public function runAll(): array; + + /** + * Run all tests from one specific category and return the results. + * + * @param string $filterByCategory - The id of the category to run. + * @return array> Result of each check, first level key is category, second level key is title + * @since 35.0.0 + */ + public function runByCategory(string $filterByCategory): array; + + /** + * Run all tests from one specific class and return the results. + * + * @param string $filterByClass - The class to run. + * @return array> Result of each check, first level key is category, second level key is title + * @since 35.0.0 + */ + public function runByClass(string $filterByClass): array; } From 69e3b94594ac865b286653f75a7863c6d9d3ddfd Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 27 Dec 2024 12:31:40 -0500 Subject: [PATCH 2/2] chore: Add category/class type parameter to setupchecks cmd Signed-off-by: Josh --- core/Command/SetupChecks.php | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/core/Command/SetupChecks.php b/core/Command/SetupChecks.php index c8f7aa4c51d26..e655222d7d9ba 100644 --- a/core/Command/SetupChecks.php +++ b/core/Command/SetupChecks.php @@ -11,6 +11,7 @@ use OCP\RichObjectStrings\IRichTextFormatter; use OCP\SetupCheck\ISetupCheckManager; +use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -29,12 +30,44 @@ protected function configure(): void { $this ->setName('setupchecks') ->setDescription('Run setup checks and output the results') + ->addArgument( + 'category', + InputArgument::OPTIONAL, + 'Category of setup checks to run ' . "\n" . '(e.g. "network" to run all the network-related checks)', + '' + ) + ->addArgument( + 'class', + InputArgument::OPTIONAL, + 'Class of setup checks to run ' . "\n" . '(e.g. "OCA\\Settings\\SetupChecks\\InternetConnectivity" to run only the InternetConnectivity check)', + '' + ) ; } #[\Override] protected function execute(InputInterface $input, OutputInterface $output): int { - $results = $this->setupCheckManager->runAll(); + $filterByCategory = $input->getArgument('category'); + $filterByClass = $input->getArgument('class'); + + if (!is_string($filterByCategory) || !is_string($filterByClass)) { + $output->writeln('Invalid type specified'); + return self::FAILURE; + } + + if ($filterByCategory !== '' && $filterByClass !== '') { + $output->writeln('Please specify only one of category or class'); + return self::FAILURE; + } + + if ($filterByCategory !== '') { + $results = $this->setupCheckManager->runByCategory($filterByCategory); + } elseif ($filterByClass !== '') { + $results = $this->setupCheckManager->runByClass($filterByClass); + } else { + $results = $this->setupCheckManager->runAll(); + } + switch ($input->getOption('output')) { case self::OUTPUT_FORMAT_JSON: case self::OUTPUT_FORMAT_JSON_PRETTY: