66e728b078
Platform: moko-platform CI / Gate 2: Unit Tests (8.1) (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 2: Unit Tests (8.2) (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 2: Unit Tests (8.1) (push) Blocked by required conditions
Platform: moko-platform CI / Gate 2: Unit Tests (8.3) (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 2: Unit Tests (8.2) (push) Blocked by required conditions
Platform: moko-platform CI / Gate 3: Self-Health Check (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 2: Unit Tests (8.3) (push) Blocked by required conditions
Platform: moko-platform CI / Gate 4: Governance (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 3: Self-Health Check (push) Blocked by required conditions
Platform: moko-platform CI / Gate 5: Template Integrity (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 4: Governance (push) Blocked by required conditions
Platform: moko-platform CI / CI Summary (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 5: Template Integrity (push) Blocked by required conditions
Platform: moko-platform CI / CI Summary (push) Blocked by required conditions
Generic: Repo Health / Release configuration (push) Blocked by required conditions
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Universal: PR Check / Build RC Package (pull_request) Blocked by required conditions
Generic: Repo Health / Release configuration (pull_request) Blocked by required conditions
Generic: Repo Health / Scripts governance (pull_request) Blocked by required conditions
Generic: Repo Health / Repository health (pull_request) Blocked by required conditions
Generic: Repo Health / Access control (push) Successful in 18s
Generic: Repo Health / Site Health (push) Has been skipped
Universal: PR Check / Branch Policy (pull_request) Successful in 3s
Universal: Auto Version Bump / Version Bump (push) Failing after 27s
Universal: Secret Scanning / Gitleaks Secret Scan (pull_request) Successful in 28s
Universal: PR Check / Validate PR (pull_request) Failing after 6s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Generic: Repo Health / Access control (pull_request) Successful in 3s
Platform: moko-platform CI / Gate 1: Code Quality (pull_request) Failing after 1m7s
Platform: moko-platform CI / Gate 1: Code Quality (push) Failing after 1m7s
Auto-fixed 5006 tab-indent and line-ending errors via phpcbf, then manually broke 100 lines exceeding 150-char limit. All 74 files in cli/, automation/, maintenance/, deploy/ now pass PHPCS PSR-12 clean. Authored-by: Moko Consulting Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
145 lines
4.8 KiB
PHP
145 lines
4.8 KiB
PHP
#!/usr/bin/env php
|
|
<?php
|
|
|
|
/* Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
|
*
|
|
* 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, '<extension') !== false && strpos($xml, 'targetplatform') !== false) {
|
|
$manifest = $f;
|
|
break 2;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($manifest === null) {
|
|
$this->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>([^<]+)<\/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());
|