You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
2.8 KiB
100 lines
2.8 KiB
<?php |
|
|
|
declare(strict_types=1); |
|
|
|
namespace PhpMyAdmin\Command; |
|
|
|
use RangeException; |
|
use Symfony\Component\Console\Command\Command; |
|
use Symfony\Component\Console\Input\InputArgument; |
|
use Symfony\Component\Console\Input\InputInterface; |
|
use Symfony\Component\Console\Output\OutputInterface; |
|
|
|
use function file_put_contents; |
|
use function preg_match; |
|
use function sprintf; |
|
|
|
final class SetVersionCommand extends Command |
|
{ |
|
/** @var string */ |
|
protected static $defaultName = 'set-version'; |
|
|
|
/** @var string */ |
|
private static $generatedClassTemplate = <<<'PHP' |
|
<?php |
|
|
|
declare(strict_types=1); |
|
|
|
namespace PhpMyAdmin; |
|
|
|
use const VERSION_SUFFIX; |
|
|
|
/** |
|
* This class is generated by scripts/console. |
|
* |
|
* @see \PhpMyAdmin\Command\SetVersionCommand |
|
*/ |
|
final class Version |
|
{ |
|
// The VERSION_SUFFIX constant is defined at libraries/constants.php |
|
public const VERSION = '%1$u.%2$u.%3$u%4$s' . VERSION_SUFFIX; |
|
public const SERIES = '%1$u.%2$u'; |
|
public const MAJOR = %1$u; |
|
public const MINOR = %2$u; |
|
public const PATCH = %3$u; |
|
public const ID = %1$u%2$02u%3$02u; |
|
public const PRE_RELEASE_NAME = '%5$s'; |
|
public const IS_DEV = %6$s; |
|
} |
|
|
|
PHP; |
|
|
|
protected function configure(): void |
|
{ |
|
$this->setDescription('Sets the version number'); |
|
$this->setHelp('This command generates the PhpMyAdmin\Version class based on the version number provided.'); |
|
$this->addArgument('version', InputArgument::REQUIRED, 'The version number'); |
|
} |
|
|
|
protected function execute(InputInterface $input, OutputInterface $output): int |
|
{ |
|
/** @var string $version */ |
|
$version = $input->getArgument('version'); |
|
|
|
$generatedClass = $this->getGeneratedClass($version); |
|
|
|
if (! $this->writeGeneratedClassFile($generatedClass)) { |
|
return Command::FAILURE; |
|
} |
|
|
|
$output->writeln('PhpMyAdmin\Version class successfully generated!'); |
|
|
|
return Command::SUCCESS; |
|
} |
|
|
|
private function getGeneratedClass(string $version): string |
|
{ |
|
// Do not allow any major below 5 |
|
$return = preg_match('/^([5-9]+)\.(\d{1,2})\.(\d{1,2})(-([a-z0-9]+))?$/', $version, $matches); |
|
if ($return === false || $return === 0) { |
|
throw new RangeException('The version number is in the wrong format: ' . $version); |
|
} |
|
|
|
return sprintf( |
|
self::$generatedClassTemplate, |
|
$matches[1], |
|
$matches[2], |
|
$matches[3], |
|
$matches[4] ?? '', |
|
$matches[5] ?? '', |
|
($matches[5] ?? '') === 'dev' ? 'true' : 'false' |
|
); |
|
} |
|
|
|
private function writeGeneratedClassFile(string $generatedClass): bool |
|
{ |
|
$result = file_put_contents(ROOT_PATH . 'libraries/classes/Version.php', $generatedClass); |
|
|
|
return $result !== false; |
|
} |
|
}
|
|
|