\n"); } $result = ['comments' => []]; $extension = pathinfo($path ?? '', PATHINFO_EXTENSION); // Whitelist of extensions to check (default phpcs list) if (in_array($extension, ['php', 'js', 'inc', 'css'])) { // Run each sniff // phpcs --encoding=utf-8 --standard=framework/tests/phpcs/tabs.xml run_sniff('tabs.xml', $path, $result); // phpcs --encoding=utf-8 --tab-width=4 --standard=framework/tests/phpcs/ruleset.xml run_sniff('ruleset.xml', $path, $result, '--tab-width=4'); } echo json_encode($result); function run_sniff($standard, $path, array &$result, $extraFlags = '') { $sniffPath = escapeshellarg(__DIR__ . '/phpcs/' . $standard); $checkPath = escapeshellarg($path ?? ''); exec("phpcs --encoding=utf-8 $extraFlags --standard=$sniffPath --report=xml $checkPath", $output); // We can't check the return code as it's non-zero if the sniff finds an error if ($output) { $xml = implode("\n", $output); $xml = simplexml_load_string($xml ?? ''); $errors = $xml->xpath('/phpcs/file/error'); if ($errors) { $sanePath = str_replace('/', '_', $path ?? ''); foreach ($errors as $error) { $attributes = $error->attributes(); $result['comments'][] = [ 'line' => (int)strval($attributes->line), 'id' => $standard . '-' . $sanePath . '-' . $attributes->line . '-' . $attributes->column, 'message' => strval($error) ]; } } } }