mirror of
https://github.com/crazywhalecc/static-php-cli.git
synced 2026-03-18 21:04:52 +08:00
* add initial windows runtime setup * add cool console output * doctor support windows base * add `add-path` and `remove-path` for bin/setup-runtime * fix composer.ps1 path * add windows system util * add windows cmd and doctor base check * add windows fallback for laravel/prompts * cd fix [skip ci] * dir separator and typo fix [skip ci]
87 lines
3.3 KiB
PHP
87 lines
3.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace SPC\command;
|
|
|
|
use SPC\doctor\CheckListHandler;
|
|
use SPC\doctor\CheckResult;
|
|
use SPC\exception\RuntimeException;
|
|
use Symfony\Component\Console\Attribute\AsCommand;
|
|
|
|
use function Laravel\Prompts\confirm;
|
|
|
|
#[AsCommand('doctor', 'Diagnose whether the current environment can compile normally')]
|
|
class DoctorCommand extends BaseCommand
|
|
{
|
|
public function configure(): void
|
|
{
|
|
$this->addOption('auto-fix', null, null, 'Automatically fix failed items (if possible)');
|
|
}
|
|
|
|
public function handle(): int
|
|
{
|
|
try {
|
|
$checker = new CheckListHandler();
|
|
|
|
$fix_policy = $this->input->getOption('auto-fix') ? FIX_POLICY_AUTOFIX : FIX_POLICY_PROMPT;
|
|
foreach ($checker->runChecks() as $check) {
|
|
if ($check->limit_os !== null && $check->limit_os !== PHP_OS_FAMILY) {
|
|
continue;
|
|
}
|
|
|
|
$this->output->write('Checking <comment>' . $check->item_name . '</comment> ... ');
|
|
|
|
$result = call_user_func($check->callback);
|
|
if ($result === null) {
|
|
$this->output->writeln('skipped');
|
|
} elseif ($result instanceof CheckResult) {
|
|
if ($result->isOK()) {
|
|
$this->output->writeln($result->getMessage() ?? 'ok');
|
|
|
|
continue;
|
|
}
|
|
|
|
// Failed
|
|
$this->output->writeln('<error>' . $result->getMessage() . '</error>');
|
|
switch ($fix_policy) {
|
|
case FIX_POLICY_DIE:
|
|
throw new RuntimeException('Some check items can not be fixed !');
|
|
case FIX_POLICY_PROMPT:
|
|
if ($result->getFixItem() !== '') {
|
|
$question = confirm('Do you want to fix it?');
|
|
if ($question) {
|
|
$checker->emitFix($this->output, $result);
|
|
} else {
|
|
throw new RuntimeException('You cancelled fix');
|
|
}
|
|
} else {
|
|
throw new RuntimeException('Some check items can not be fixed !');
|
|
}
|
|
break;
|
|
case FIX_POLICY_AUTOFIX:
|
|
if ($result->getFixItem() !== '') {
|
|
$this->output->writeln('Automatically fixing ' . $result->getFixItem() . ' ...');
|
|
$checker->emitFix($this->output, $result);
|
|
} else {
|
|
throw new RuntimeException('Some check items can not be fixed !');
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
$this->output->writeln('<info>Doctor check complete !</info>');
|
|
} catch (\Throwable $e) {
|
|
$this->output->writeln('<error>' . $e->getMessage() . '</error>');
|
|
|
|
if (extension_loaded('pcntl')) {
|
|
pcntl_signal(SIGINT, SIG_IGN);
|
|
}
|
|
return static::FAILURE;
|
|
}
|
|
|
|
return static::SUCCESS;
|
|
}
|
|
}
|