#!/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_tabs.php * BRIEF: Validates that no literal tab characters exist in source files */ declare(strict_types=1); require_once __DIR__ . '/../../vendor/autoload.php'; use MokoEnterprise\CliFramework; /** * Checks that none of the tracked PHP, JS, CSS, XML, YAML and Markdown files * contain literal tab characters. */ class CheckTabs extends CliFramework { /** * Configure available arguments. */ protected function configure(): void { $this->setDescription('Validates that no literal tab characters exist in source files'); $this->addArgument('--path', 'Repository path to check', '.'); } /** * Scan for tab characters in tracked source files. * * @return int Exit code: 0 if no tabs found, 1 if tabs are present. */ protected function run(): int { $path = $this->getArgument('--path'); $patterns = ['*.php', '*.js', '*.css', '*.xml', '*.yml', '*.yaml', '*.md']; $quoted = implode(' ', array_map('escapeshellarg', $patterns)); $output = shell_exec('git -C ' . escapeshellarg($path) . " ls-files {$quoted} 2>/dev/null") ?? ''; $files = array_values(array_filter(explode("\n", $output))); $total = count($files); $passed = 0; $tabFiles = 0; $this->section('Scanning for tab characters'); foreach ($files as $i => $file) { $this->progress($i + 1, $total, $file); $fullPath = $path . '/' . $file; if (!is_file($fullPath)) { continue; } if (str_contains((string) file_get_contents($fullPath), "\t")) { $this->progress($i + 1, $total, '', true); $this->status(false, $file, 'contains tab characters — use spaces'); $tabFiles++; } else { $passed++; } } $this->progress($total, $total, '', true); $this->printSummary($passed, $tabFiles, $this->elapsed()); return $tabFiles === 0 ? 0 : 1; } } $script = new CheckTabs('check_tabs', 'Validates that no literal tab characters exist in source files'); exit($script->execute());