#!/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 ) * * Usage: * php version_set_platform.php --path . --version 04.01.00 * php version_set_platform.php --path . --version 04.01.00 --stability alpha * * When --stability is set to anything other than "stable", the suffix is * appended to the version (e.g. 04.01.00-dev, 04.01.00-alpha, 04.01.00-rc). */ declare(strict_types=1); $path = '.'; $version = null; $branch = null; $stability = 'stable'; foreach ($argv as $i => $arg) { if ($arg === '--path' && isset($argv[$i + 1])) $path = $argv[$i + 1]; if ($arg === '--version' && isset($argv[$i + 1])) $version = $argv[$i + 1]; if ($arg === '--branch' && isset($argv[$i + 1])) $branch = $argv[$i + 1]; if ($arg === '--stability' && isset($argv[$i + 1])) $stability = $argv[$i + 1]; } // Auto-detect branch from git or GitHub env if ($branch === null) { $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 === null) { fwrite(STDERR, "Usage: version_set_platform.php --path . --version 04.01.00 [--stability dev]\n"); exit(1); } // 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/.mokostandards"; } 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 !== $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"; } } exit(0);