Skip to content

Commit

Permalink
Enable phpcs and phpcbf checks to run from phar
Browse files Browse the repository at this point in the history
We need the 2 CLI scripts and the CodeSniffer.conf file
to be added to the phar, so we can "include" the scripts
for execution and copy the conf file temporarily to
be together with the phar (that's the way CodeSniffer
expects it).

Note this will reduce a little bit code-coverage but in
a future PR I want to add some integration tests to cover
the execution from phar, hardly can be done from unit tests.
  • Loading branch information
stronk7 committed Sep 11, 2023
1 parent bfa22ca commit 47c7143
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 6 deletions.
8 changes: 8 additions & 0 deletions box.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,14 @@
"node_modules",
"pix"
]
},
{
"in": "vendor/squizlabs/php_codesniffer",
"name": [
"phpcs",
"phpcbf",
"CodeSniffer.conf"
]
}
],
"compactors": "KevinGH\\Box\\Compactor\\Php",
Expand Down
4 changes: 4 additions & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
28 changes: 25 additions & 3 deletions src/Command/CodeCheckerCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand All @@ -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).
Expand All @@ -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;
Expand Down
29 changes: 26 additions & 3 deletions src/Command/CodeFixerCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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',
Expand All @@ -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) {
Expand All @@ -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;
}
}

0 comments on commit 47c7143

Please sign in to comment.