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 15, 2023
1 parent ed8d11b commit 4d76194
Show file tree
Hide file tree
Showing 4 changed files with 64 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 @@
"Docs",
"pix"
]
},
{
"in": "vendor/squizlabs/php_codesniffer",
"name": [
"phpcs",
"phpcbf",
"CodeSniffer.conf"
]
}
],
"compactors": "KevinGH\\Box\\Compactor\\Php",
Expand Down
1 change: 1 addition & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ The format of this change log follows the advice given at [Keep a CHANGELOG](htt
## [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
Expand Down
30 changes: 27 additions & 3 deletions src/Command/CodeCheckerCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,23 @@ 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 +88,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 +113,15 @@ 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
31 changes: 28 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,23 @@ 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 +70,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 +79,15 @@ 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 4d76194

Please sign in to comment.