Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 34 additions & 1 deletion core/Command/SetupChecks.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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('<error>Invalid type specified</error>');
return self::FAILURE;
}

if ($filterByCategory !== '' && $filterByClass !== '') {
$output->writeln('<error>Please specify only one of category or class</error>');
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:
Expand Down
29 changes: 27 additions & 2 deletions lib/private/SetupCheck/SetupCheckManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
20 changes: 20 additions & 0 deletions lib/public/SetupCheck/ISetupCheckManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,28 @@
*/
interface ISetupCheckManager {
/**
* Run all setup checks and return the results.
*
* @since 28.0.0
* @return array<string,array<string,SetupResult>> 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<string,array<string,SetupResult>> 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<string,array<string,SetupResult>> Result of each check, first level key is category, second level key is title
* @since 35.0.0
*/
public function runByClass(string $filterByClass): array;
}
Loading