diff --git a/cli/joomla_compat_check.php b/cli/joomla_compat_check.php new file mode 100644 index 0000000..87c6d34 --- /dev/null +++ b/cli/joomla_compat_check.php @@ -0,0 +1,136 @@ +#!/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/joomla_compat_check.php + * BRIEF: Check if extension targetplatform regex matches the latest Joomla version + * + * Usage: + * php joomla_compat_check.php --path /repo + * php joomla_compat_check.php --path /repo --github-output + * + * Options: + * --path Repository root (default: .) + * --github-output Export results to $GITHUB_OUTPUT + */ + +declare(strict_types=1); + +$path = '.'; +$ghOutput = false; + +foreach ($argv as $i => $arg) { + if ($arg === '--path' && isset($argv[$i + 1])) $path = $argv[$i + 1]; + if ($arg === '--github-output') $ghOutput = true; +} + +$root = realpath($path) ?: $path; + +// ── Find manifest and extract targetplatform ──────────────────────────── +$manifest = null; +$searchDirs = ["{$root}/src", $root]; +foreach ($searchDirs as $dir) { + if (!is_dir($dir)) continue; + foreach (glob("{$dir}/*.xml") ?: [] as $f) { + $xml = file_get_contents($f); + if (strpos($xml, ']*version="([^"]+)"/', $xml, $m)) { + $targetRegex = $m[1]; +} + +if (empty($targetRegex)) { + echo "No targetplatform version found in {$relManifest}\n"; + exit(1); +} + +echo "Manifest: {$relManifest}\n"; +echo "Target regex: {$targetRegex}\n"; + +// ── Fetch latest Joomla version ───────────────────────────────────────── +$joomlaVersions = []; +$updateUrl = 'https://update.joomla.org/core/sts/list_sts.xml'; +$updateXml = @file_get_contents($updateUrl); + +if ($updateXml === false) { + // Fallback: try the LTS feed + $updateUrl = 'https://update.joomla.org/core/list.xml'; + $updateXml = @file_get_contents($updateUrl); +} + +if ($updateXml !== false) { + // Parse all version entries + preg_match_all('/([^<]+)<\/version>/', $updateXml, $matches); + $joomlaVersions = $matches[1] ?? []; +} + +if (empty($joomlaVersions)) { + echo "WARNING: Could not fetch Joomla versions from update server\n"; + echo "Tested URL: {$updateUrl}\n"; + exit(0); +} + +// Sort and get latest +usort($joomlaVersions, 'version_compare'); +$latestJoomla = end($joomlaVersions); + +echo "Latest Joomla: {$latestJoomla}\n"; + +// ── Test compatibility ────────────────────────────────────────────────── +// The targetplatform regex uses Joomla's regex format +// Common patterns: "5\.[0-9]+" or "((5.[0-9])|(6.[0-9]))" +$compatible = @preg_match("/{$targetRegex}/", $latestJoomla); + +if ($compatible === false) { + echo "ERROR: Invalid regex in targetplatform: {$targetRegex}\n"; + $result = 'error'; +} elseif ($compatible === 1) { + echo "PASS: Joomla {$latestJoomla} matches targetplatform regex\n"; + $result = 'pass'; +} else { + // Check which major versions are supported + $supported = []; + foreach (['5.0', '5.1', '5.2', '5.3', '5.4', '6.0', '6.1', '6.2', '7.0'] as $v) { + if (@preg_match("/{$targetRegex}/", $v)) { + $supported[] = $v; + } + } + + echo "WARN: Joomla {$latestJoomla} does NOT match targetplatform regex\n"; + echo "Supported versions: " . implode(', ', $supported) . "\n"; + echo "Consider updating targetplatform to include Joomla {$latestJoomla}\n"; + $result = 'warn'; +} + +// ── Export ─────────────────────────────────────────────────────────────── +if ($ghOutput) { + $ghFile = getenv('GITHUB_OUTPUT'); + if ($ghFile) { + file_put_contents($ghFile, "compat_result={$result}\n", FILE_APPEND); + file_put_contents($ghFile, "compat_joomla={$latestJoomla}\n", FILE_APPEND); + file_put_contents($ghFile, "compat_regex={$targetRegex}\n", FILE_APPEND); + } +} + +exit($result === 'error' ? 1 : 0);