#!/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_xml_wellformed.php * BRIEF: Validates that all tracked XML files are well-formed */ declare(strict_types=1); require_once __DIR__ . '/../../vendor/autoload.php'; use MokoEnterprise\CliFramework; /** * Runs `xmllint --noout` against all tracked *.xml files and reports errors. */ class CheckXmlWellformed extends CliFramework { /** * Configure available arguments. */ protected function configure(): void { $this->setDescription('Validates that all tracked XML files are well-formed'); $this->addArgument('--path', 'Repository path to check', '.'); } /** * Validate XML well-formedness for all tracked XML files. * * @return int Exit code: 0 if all files pass, 1 if any are malformed. */ protected function run(): int { $path = $this->getArgument('--path'); $output = shell_exec('git -C ' . escapeshellarg($path) . " ls-files '*.xml' 2>/dev/null") ?? ''; $files = array_values(array_filter(explode("\n", $output))); $total = count($files); $passed = 0; $errors = 0; $this->section('Validating XML well-formedness'); if ($total === 0) { $this->log('INFO', 'No tracked XML files found'); $this->printSummary(0, 0, $this->elapsed()); return 0; } foreach ($files as $i => $file) { $this->progress($i + 1, $total, $file); $fullPath = $path . '/' . $file; if (!is_file($fullPath)) { continue; } $out = []; $code = 0; exec('xmllint --noout ' . escapeshellarg($fullPath) . ' 2>&1', $out, $code); if ($code !== 0) { $this->progress($i + 1, $total, '', true); $this->status(false, $file, implode('; ', array_slice($out, 0, 2))); } else { $passed++; } $errors += ($code !== 0) ? 1 : 0; } $this->progress($total, $total, '', true); $this->printSummary($passed, $errors, $this->elapsed()); return $errors === 0 ? 0 : 1; } } $script = new CheckXmlWellformed('check_xml_wellformed', 'Validates that all tracked XML files are well-formed'); exit($script->execute());