diff --git a/box.json b/box.json index 6d59f39d..b1faa3d9 100644 --- a/box.json +++ b/box.json @@ -36,6 +36,14 @@ "node_modules", "pix" ] + }, + { + "in": "vendor/squizlabs/php_codesniffer", + "name": [ + "phpcs", + "phpcbf", + "CodeSniffer.conf" + ] } ], "compactors": "KevinGH\\Box\\Compactor\\Php", diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 91d43b25..566ed1b0 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -9,6 +9,10 @@ This project adheres to [Semantic Versioning](http://semver.org/). The format of this change log follows the advice given at [Keep a CHANGELOG](http://keepachangelog.com). ## [Unreleased] +### Fixed +- Fix the `mustache` command to work from within the PHAR archive. +- Fix the `phpcs` and `phpcbf` commands to work from within the PHAR archive. + ## [4.1.3] - 2023-09-08 ### Changed - Updated project dependencies to current [moodle-cs](https://github.com/moodlehq/moodle-cs), [moodle-local_moodlecheck](https://github.com/moodlehq/moodle-local_moodlecheck) and [moodle-local_ci](https://github.com/moodlehq/moodle-local_ci) versions. Also, to various internal / development tools. diff --git a/src/Command/CodeCheckerCommand.php b/src/Command/CodeCheckerCommand.php index 8fc34fdb..6984051d 100644 --- a/src/Command/CodeCheckerCommand.php +++ b/src/Command/CodeCheckerCommand.php @@ -61,8 +61,22 @@ protected function execute(InputInterface $input, OutputInterface $output): int return $this->outputSkip($output); } - $cmd = [ - 'php', __DIR__ . '/../../vendor/squizlabs/php_codesniffer/bin/phpcs', + $filesystem = new Filesystem(); + $pathToPHPCS = __DIR__ . '/../../vendor/squizlabs/php_codesniffer/bin/phpcs'; + $pathToConf = __DIR__ . '/../../vendor/squizlabs/php_codesniffer/CodeSniffer.conf'; + $basicCMD = ['php', $pathToPHPCS]; + // If we are running phpcs within a PHAR, the command is different, and we need also to copy the .conf file. + // @codeCoverageIgnoreStart - This is not executed when running tests, only when within a PHAR. + if (\Phar::running() !== '') { + // Invoke phpcs from the PHAR (via include, own params after --). + $basicCMD = ['php', '-r', 'include "' . $pathToPHPCS . '";', '--']; + // Copy the .conf file to the directory where the PHAR is running. That way phpcs will find it. + $targetPathToConf = dirname(\Phar::running(false)) . '/CodeSniffer.conf'; + $filesystem->copy($pathToConf, $targetPathToConf, true); + } + // @codeCoverageIgnoreEnd + + $cmd = array_merge($basicCMD, [ '--standard=' . ($input->getOption('standard') ?: 'moodle'), '--extensions=php', '-p', @@ -73,7 +87,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int '--report-full', '--report-width=132', '--encoding=utf-8', - ]; + ]); // If we aren't using the max-warnings option, then we can forget about warnings and tell phpcs // to ignore them for exit-code purposes (still they will be reported in the output). @@ -98,6 +112,14 @@ protected function execute(InputInterface $input, OutputInterface $output): int $process = $this->execute->passThroughProcess(new Process($cmd, $this->plugin->directory, null, null, null)); + // If we are running phpcs within a PHAR, we need to remove the previously copied conf file. + // @codeCoverageIgnoreStart - This is not executed when running tests, only when within a PHAR. + if (\Phar::running() !== '') { + $targetPathToConf = dirname(\Phar::running(false)) . '/CodeSniffer.conf'; + $filesystem->remove($targetPathToConf); + } + // @codeCoverageIgnoreEnd + // If we aren't using the max-warnings option, process exit code is enough for us. if ($input->getOption('max-warnings') < 0) { return $process->isSuccessful() ? 0 : 1; diff --git a/src/Command/CodeFixerCommand.php b/src/Command/CodeFixerCommand.php index 0b0da88e..113e2996 100644 --- a/src/Command/CodeFixerCommand.php +++ b/src/Command/CodeFixerCommand.php @@ -15,6 +15,7 @@ use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Finder\Finder; use Symfony\Component\Process\Process; @@ -42,8 +43,22 @@ protected function execute(InputInterface $input, OutputInterface $output): int return $this->outputSkip($output); } - $cmd = [ - 'php', __DIR__ . '/../../vendor/squizlabs/php_codesniffer/bin/phpcbf', + $filesystem = new Filesystem(); + $pathToPHPCBF = __DIR__ . '/../../vendor/squizlabs/php_codesniffer/bin/phpcbf'; + $pathToConf = __DIR__ . '/../../vendor/squizlabs/php_codesniffer/CodeSniffer.conf'; + $basicCMD = ['php', $pathToPHPCBF]; + // If we are running phpcs within a PHAR, the command is different, and we need also to copy the .conf file. + // @codeCoverageIgnoreStart - This is not executed when running tests, only when within a PHAR. + if (\Phar::running() !== '') { + // Invoke phpcbf from the PHAR (via include, own params after --). + $basicCMD = ['php', '-r', 'include "' . $pathToPHPCBF . '";', '--']; + // Copy the .conf file to the directory where the PHAR is running. That way phpcbf will find it. + $targetPathToConf = dirname(\Phar::running(false)) . '/CodeSniffer.conf'; + $filesystem->copy($pathToConf, $targetPathToConf, true); + } + // @codeCoverageIgnoreEnd + + $cmd = array_merge($basicCMD, [ '--standard=' . ($input->getOption('standard') ?: 'moodle'), '--extensions=php', '-p', @@ -54,7 +69,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int '--report-full', '--report-width=132', '--encoding=utf-8', - ]; + ]); // Add the files to process. foreach ($files as $file) { @@ -63,6 +78,14 @@ protected function execute(InputInterface $input, OutputInterface $output): int $this->execute->passThroughProcess(new Process($cmd, $this->plugin->directory, null, null, null)); + // If we are running phpcbf within a PHAR, we need to remove the previously copied conf file. + // @codeCoverageIgnoreStart - This is not executed when running tests, only when within a PHAR. + if (\Phar::running() !== '') { + $targetPathToConf = dirname(\Phar::running(false)) . '/CodeSniffer.conf'; + $filesystem->remove($targetPathToConf); + } + // @codeCoverageIgnoreEnd + return 0; } }