diff --git a/cli/version_check.php b/cli/version_check.php new file mode 100644 index 0000000..07bc853 --- /dev/null +++ b/cli/version_check.php @@ -0,0 +1,138 @@ +#!/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_check.php + * VERSION: 05.00.00 + * BRIEF: Validate version consistency across README, manifests, and sub-packages + * + * Usage: + * php version_check.php --path /repo + * php version_check.php --path /repo --strict # exit 1 on mismatch + * php version_check.php --path /repo --fix # fix mismatches to highest version + */ + +declare(strict_types=1); + +$path = '.'; +$strict = false; +$fix = false; + +foreach ($argv as $i => $arg) { + if ($arg === '--path' && isset($argv[$i + 1])) $path = $argv[$i + 1]; + if ($arg === '--strict') $strict = true; + if ($arg === '--fix') $fix = true; +} + +$root = realpath($path) ?: $path; +$errors = 0; +$versions = []; + +// ── Read README.md version ─────────────────────────────────────────────────── +$readme = "{$root}/README.md"; +if (file_exists($readme)) { + $content = file_get_contents($readme); + if (preg_match('/VERSION:\s*(\d{2}\.\d{2}\.\d{2})/m', $content, $m)) { + $versions['README.md'] = $m[1]; + } +} + +// ── Read manifest XML versions ─────────────────────────────────────────────── +$xmlGlobs = [ + "{$root}/src/pkg_*.xml", + "{$root}/src/*.xml", + "{$root}/src/packages/*/*.xml", + "{$root}/*.xml", +]; + +foreach ($xmlGlobs as $glob) { + foreach (glob($glob) ?: [] as $file) { + // Skip updates.xml + if (basename($file) === 'updates.xml') continue; + + $xmlContent = file_get_contents($file); + if (strpos($xmlContent, '(\d{2}\.\d{2}\.\d{2})(?:-[a-z]+)?|', $xmlContent, $xm)) { + $relPath = str_replace($root . '/', '', $file); + $relPath = str_replace($root . '\\', '', $relPath); + $versions[$relPath] = $xm[1]; + } + } +} + +if (empty($versions)) { + fwrite(STDERR, "No version sources found\n"); + exit(1); +} + +// ── Compare versions ───────────────────────────────────────────────────────── +$uniqueVersions = array_unique(array_values($versions)); +$highestVersion = '00.00.00'; +foreach ($versions as $v) { + if (version_compare($v, $highestVersion, '>')) { + $highestVersion = $v; + } +} + +echo "=== Version Consistency Check ===\n"; +foreach ($versions as $source => $ver) { + $status = ($ver === $highestVersion) ? 'OK' : 'MISMATCH'; + if ($status === 'MISMATCH') $errors++; + echo sprintf(" %-50s %s %s\n", $source, $ver, $status === 'OK' ? '' : "** MISMATCH (expected {$highestVersion})"); +} + +if (count($uniqueVersions) === 1) { + echo "\nAll {$ver} — consistent.\n"; +} else { + echo "\n** {$errors} mismatch(es) found. Highest version: {$highestVersion}\n"; + + if ($fix) { + echo "\n=== Fixing mismatches to {$highestVersion} ===\n"; + + // Fix README.md + if (isset($versions['README.md']) && $versions['README.md'] !== $highestVersion) { + $content = file_get_contents($readme); + $content = preg_replace( + '/(VERSION:\s*)\d{2}\.\d{2}\.\d{2}/m', + '${1}' . $highestVersion, + $content, + 1 + ); + file_put_contents($readme, $content); + echo " Fixed: README.md -> {$highestVersion}\n"; + } + + // Fix XML manifests + foreach ($versions as $source => $ver) { + if ($source === 'README.md') continue; + if ($ver === $highestVersion) continue; + + $file = "{$root}/{$source}"; + if (!file_exists($file)) continue; + + $content = file_get_contents($file); + $content = preg_replace( + '|[^<]*|', + "{$highestVersion}", + $content + ); + file_put_contents($file, $content); + echo " Fixed: {$source} -> {$highestVersion}\n"; + } + + echo "Done.\n"; + } +} + +if ($strict && $errors > 0) { + exit(1); +} + +exit(0);