101 lines
2.8 KiB
PHP
101 lines
2.8 KiB
PHP
|
<?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;
|
||
|
}
|
||
|
}
|