#!/usr/bin/env php * * This file is part of a Moko Consulting project. * * SPDX-License-Identifier: GPL-3.0-or-later * * FILE INFORMATION * DEFGROUP: MokoStandards.Scripts.Validate * INGROUP: MokoStandards * REPO: https://git.mokoconsulting.tech/MokoConsulting/moko-platform * PATH: /validate/check_joomla_manifest.php * BRIEF: Validates Joomla XML manifest structure and required elements */ declare(strict_types=1); require_once __DIR__ . '/../../vendor/autoload.php'; use MokoEnterprise\CliFramework; /** * Validates that tracked XML files containing a Joomla element * have the required child and the recommended child. */ class CheckJoomlaManifest extends CliFramework { /** * Configure available arguments. */ protected function configure(): void { $this->setDescription('Validates Joomla XML manifest structure'); $this->addArgument('--path', 'Repository path to check', '.'); } /** * Validate all tracked XML manifests. * * @return int Exit code: 0 on pass, 1 on failure. */ protected function run(): int { $path = $this->getArgument('--path'); $output = shell_exec('git -C ' . escapeshellarg($path) . " ls-files '*.xml' 2>/dev/null") ?? ''; $files = array_filter(explode("\n", $output)); $errors = 0; $i = 0; $total = count($files); $this->section('Scanning XML manifests'); foreach ($files as $file) { $fullPath = $path . '/' . $file; if (!is_file($fullPath)) { continue; } if ($total >= 3) { $this->progress(++$i, $total, basename((string) $file)); } $content = (string) file_get_contents($fullPath); if (!str_contains($content, '')) { $this->status(false, 'Missing ', (string) $file); $errors++; } if (!str_contains($content, '')) { $this->warning("Missing in: {$file}"); } } if ($total >= 3) { $this->progress($total, $total, 'done', true); } if ($errors === 0) { $this->status(true, 'Manifest validation passed'); $this->printSummary(1, 0, $this->elapsed()); return 0; } $this->printSummary(0, $errors, $this->elapsed()); return 1; } } $script = new CheckJoomlaManifest('check_joomla_manifest', 'Validates Joomla XML manifest structure'); exit($script->execute());