scc_pg_admission_2025/pma/libraries/classes/Command/WriteGitRevisionCommand.php

162 lines
4.6 KiB
PHP

<?php
declare(strict_types=1);
namespace PhpMyAdmin\Command;
use PhpMyAdmin\Git;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use function addcslashes;
use function explode;
use function file_put_contents;
use function is_string;
use function shell_exec;
use function sprintf;
use function str_replace;
use function trim;
class WriteGitRevisionCommand extends Command
{
/** @var string */
protected static $defaultName = 'write-revision-info';
/** @var string */
private static $generatedClassTemplate = <<<'PHP'
<?php
declare(strict_types=1);
/**
* This file is generated by scripts/console.
*
* @see \PhpMyAdmin\Command\WriteGitRevisionCommand
*/
return [
'revision' => '%s',
'revisionHash' => '%s',
'revisionUrl' => '%s',
'branch' => '%s',
'branchUrl' => '%s',
'message' => '%s',
'author' => [
'name' => '%s',
'email' => '%s',
'date' => '%s',
],
'committer' => [
'name' => '%s',
'email' => '%s',
'date' => '%s',
],
];
PHP;
protected function configure(): void
{
$this->setDescription('Write Git revision');
$this->addOption(
'remote-commit-url',
null,
InputOption::VALUE_OPTIONAL,
'The remote URL to a commit',
'https://github.com/phpmyadmin/phpmyadmin/commit/%s'
);
$this->addOption(
'remote-branch-url',
null,
InputOption::VALUE_OPTIONAL,
'The remote URL to a branch',
'https://github.com/phpmyadmin/phpmyadmin/tree/%s'
);
$this->setHelp('This command generates the revision-info.php file from Git data.');
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
/** @var string $commitUrlFormat */
$commitUrlFormat = $input->getOption('remote-commit-url');
/** @var string $branchUrlFormat */
$branchUrlFormat = $input->getOption('remote-branch-url');
$generatedClass = $this->getRevisionInfo($commitUrlFormat, $branchUrlFormat);
if ($generatedClass === null) {
$output->writeln('No revision information detected.');
return Command::SUCCESS;
}
if (! $this->writeGeneratedFile($generatedClass)) {
return Command::FAILURE;
}
$output->writeln('revision-info.php successfully generated!');
return Command::SUCCESS;
}
private function getRevisionInfo(string $commitUrlFormat, string $branchUrlFormat): ?string
{
$revisionText = $this->gitCli('describe --always');
if ($revisionText === null) {
return null;
}
$commitHash = $this->gitCli('log -1 --format="%H"');
if ($commitHash === null) {
return null;
}
$branchName = $this->gitCli('symbolic-ref -q HEAD') ?? $this->gitCli('name-rev --name-only HEAD 2>/dev/null');
if ($branchName === null) {
return null;
}
$commitDetails = $this->gitCli(
'show -s --pretty="tree %T%nparent %P%nauthor %an <%ae> %at%ncommitter %cn <%ce> %ct%n%n%B"'
);
if ($commitDetails === null) {
return null;
}
$branchName = addcslashes(trim(str_replace('refs/heads/', '', $branchName)), "'");
[$author, $committer, $message] = Git::extractDataFormTextBody(explode("\n", $commitDetails));
return sprintf(
self::$generatedClassTemplate,
trim($revisionText),
trim($commitHash),
sprintf($commitUrlFormat, trim($commitHash)),
$branchName,
sprintf($branchUrlFormat, $branchName),
addcslashes(trim($message), "'"), // Commit message
addcslashes($author['name'], "'"), // Author name
addcslashes($author['email'], "'"), // Author email
$author['date'], // Author date
addcslashes($committer['name'], "'"), // Committer name
addcslashes($committer['email'], "'"), // Committer email
$committer['date'] // Committer date
);
}
protected function gitCli(string $command): ?string
{
/** @psalm-suppress ForbiddenCode */
$output = shell_exec('git ' . $command);
return is_string($output) ? $output : null;
}
private function writeGeneratedFile(string $generatedClass): bool
{
$result = file_put_contents(ROOT_PATH . 'revision-info.php', $generatedClass);
return $result !== false;
}
}