#!/usr/bin/env php * * SPDX-License-Identifier: GPL-3.0-or-later * * FILE INFORMATION * DEFGROUP: moko-platform.CLI * INGROUP: moko-platform * REPO: https://git.mokoconsulting.tech/MokoConsulting/moko-platform * PATH: /cli/version_set_platform.php * BRIEF: Set version in platform-specific files (Dolibarr $this->version, Joomla ) */ declare(strict_types=1); require_once __DIR__ . '/../lib/Enterprise/CliFramework.php'; use MokoEnterprise\CliFramework; class VersionSetPlatformCli extends CliFramework { protected function configure(): void { $this->setDescription('Set version in platform-specific files (Dolibarr $this->version, Joomla )'); $this->addArgument('--path', 'Repository root path', '.'); $this->addArgument('--version', 'Version string XX.YY.ZZ', ''); $this->addArgument('--branch', 'Git branch name', ''); $this->addArgument('--stability', 'Stability level (stable, dev, alpha, beta, rc)', 'stable'); } protected function run(): int { $path = $this->getArgument('--path'); $version = $this->getArgument('--version'); $branch = $this->getArgument('--branch'); $stability = $this->getArgument('--stability'); // Auto-detect branch from git or GitHub env if ($branch === '') { $branch = trim((string) @shell_exec('git rev-parse --abbrev-ref HEAD 2>/dev/null')); if (empty($branch) || $branch === 'HEAD') { $branch = getenv('GITHUB_REF_NAME') ?: 'main'; } } if ($version === '') { $this->log('ERROR', 'Usage: version_set_platform.php --path . --version 04.01.00 [--stability dev]'); return 1; } // Strip any existing suffix(es) before applying the correct one $version = preg_replace('/(-(dev|alpha|beta|rc))+$/', '', $version); // Append stability suffix for non-stable releases $stabilitySuffixMap = [ 'stable' => '', 'development' => '-dev', 'dev' => '-dev', 'alpha' => '-alpha', 'beta' => '-beta', 'rc' => '-rc', 'release-candidate' => '-rc', ]; $suffix = $stabilitySuffixMap[$stability] ?? ''; if ($suffix !== '' && !str_ends_with($version, $suffix)) { $version .= $suffix; echo "Version with stability suffix: {$version}\n"; } $root = realpath($path) ?: $path; // Detect platform — check manifest.xml first, then legacy .mokostandards $platform = ''; // New format: .mokogitea/manifest.xml (XML with tag) $manifestXml = "{$root}/.mokogitea/manifest.xml"; if (file_exists($manifestXml)) { $xml = @simplexml_load_file($manifestXml); if ($xml && isset($xml->governance->platform)) { $platform = (string) $xml->governance->platform; } } // Legacy: .mokostandards YAML file if (empty($platform)) { $mokoStandards = "{$root}/.github/.mokostandards"; if (!file_exists($mokoStandards)) { $mokoStandards = "{$root}/.mokogitea/manifest.xml"; } if (!file_exists($mokoStandards)) { $mokoStandards = "{$root}/.mokostandards"; } if (file_exists($mokoStandards)) { $content = file_get_contents($mokoStandards); if (preg_match('/^platform:\s*(.+)/m', $content, $m)) { $platform = trim($m[1], " \t\n\r\"'"); } } } $changed = 0; // Dolibarr: $this->version + $this->url_last_version in mod*.class.php if ($platform === 'crm-module') { $pattern = "{$root}/src/core/modules/mod*.class.php"; foreach (glob($pattern) ?: [] as $file) { $content = file_get_contents($file); // Set $this->version $updated = preg_replace( '/(\$this->version\s*=\s*)[\'"][^\'"]*[\'"]/', "\${1}'{$version}'", $content ); // Rewrite $this->url_last_version to point to current branch if (preg_match('/\$this->url_last_version\s*=\s*[\'"]([^\'"]+)[\'"]/', $updated, $urlMatch)) { $oldUrl = $urlMatch[1]; // Replace the branch segment: .../BRANCH/update.txt $newUrl = preg_replace( '#(raw\.githubusercontent\.com/[^/]+/[^/]+/)[^/]+(/update\.json)#', "\${1}{$branch}\${2}", $oldUrl ); if ($newUrl !== $oldUrl) { $updated = str_replace($oldUrl, $newUrl, $updated); echo "Dolibarr: url_last_version → {$branch}/update.txt\n"; } } if ($updated !== $content) { file_put_contents($file, $updated); echo "Dolibarr: " . basename($file) . " → version={$version}, branch={$branch}\n"; $changed++; } } } // Joomla: in XML manifests (top-level + sub-packages) if (in_array($platform, ['waas-component', 'joomla'], true)) { $xmlFiles = array_merge( glob("{$root}/src/*.xml") ?: [], glob("{$root}/src/packages/*/*.xml") ?: [], glob("{$root}/*.xml") ?: [] ); if (empty($xmlFiles)) { $xmlFiles = glob("{$root}/*.xml") ?: []; } foreach ($xmlFiles as $file) { $content = file_get_contents($file); if (!str_contains($content, '[^<]*|', "{$version}", $content ); if ($updated !== null && $updated !== $content) { file_put_contents($file, $updated); $relPath = str_replace($root . '/', '', $file); echo "Joomla: {$relPath} → {$version}\n"; $changed++; } } } if ($changed === 0) { if (empty($platform)) { echo "No .mokostandards file — skipping platform version set\n"; } else { echo "No platform-specific version files found for {$platform}\n"; } } return 0; } } $app = new VersionSetPlatformCli(); exit($app->execute());