#!/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 */ declare(strict_types=1); require_once __DIR__ . '/../lib/Enterprise/CliFramework.php'; use MokoEnterprise\CliFramework; class JoomlaCompatCheckCli extends CliFramework { protected function configure(): void { $this->setDescription('Check if extension targetplatform regex matches the latest Joomla version'); $this->addArgument('--path', 'Repository root', '.'); $this->addArgument('--github-output', 'Export results to $GITHUB_OUTPUT', false); } protected function run(): int { $path = $this->getArgument('--path'); $ghOutput = $this->getArgument('--github-output'); $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, 'log('ERROR', 'No manifest with targetplatform found'); return 1; } $xml = file_get_contents($manifest); $relManifest = str_replace($root . '/', '', $manifest); // Extract targetplatform version regex $targetRegex = ''; if (preg_match('/targetplatform[^>]*version="([^"]+)"/', $xml, $m)) { $targetRegex = $m[1]; } if (empty($targetRegex)) { echo "No targetplatform version found in {$relManifest}\n"; return 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"; return 0; } // Sort and get latest usort($joomlaVersions, 'version_compare'); $latestJoomla = end($joomlaVersions); echo "Latest Joomla: {$latestJoomla}\n"; // -- Test compatibility -- $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); } } return $result === 'error' ? 1 : 0; } } $app = new JoomlaCompatCheckCli(); exit($app->execute());