Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add --strict-psr flag to dump-autoload to fail the process if psr violations were detected #10886

Merged
merged 1 commit into from Jun 20, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions doc/03-cli.md
Expand Up @@ -921,6 +921,8 @@ performance.
* **--ignore-platform-req:** ignore a specific platform requirement (`php`, `hhvm`,
`lib-*` and `ext-*`) and skip the [platform check](07-runtime.md#platform-check) for it.
Multiple requirements can be ignored via wildcard.
* **--strict-psr:** Return a failed status code (1) if PSR-4 or PSR-0 mapping errors
are present. Requires --optimize to work.

## clear-cache / clearcache / cc

Expand Down
5 changes: 3 additions & 2 deletions src/Composer/Autoload/AutoloadGenerator.php
Expand Up @@ -12,6 +12,7 @@

namespace Composer\Autoload;

use Composer\ClassMapGenerator\ClassMap;
use Composer\ClassMapGenerator\ClassMapGenerator;
use Composer\Config;
use Composer\EventDispatcher\EventDispatcher;
Expand Down Expand Up @@ -161,7 +162,7 @@ public function setPlatformRequirementFilter(PlatformRequirementFilterInterface
/**
* @param string $targetDir
* @param bool $scanPsrPackages
* @return int
* @return ClassMap
* @throws \Seld\JsonLint\ParsingException
* @throws \RuntimeException
*/
Expand Down Expand Up @@ -445,7 +446,7 @@ public static function autoload(\$class)
));
}

return \count($classMap);
return $classMap;
}

/**
Expand Down
12 changes: 11 additions & 1 deletion src/Composer/Command/DumpAutoloadCommand.php
Expand Up @@ -41,6 +41,7 @@ protected function configure()
new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables autoload-dev rules. Composer will by default infer this automatically according to the last install or update --no-dev state.'),
new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages).'),
new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages).'),
new InputOption('strict-psr', null, InputOption::VALUE_NONE, 'Return a failed status code (1) if PSR-4 or PSR-0 mapping errors are present. Requires --optimize to work.'),
))
->setHelp(
<<<EOT
Expand Down Expand Up @@ -69,6 +70,10 @@ protected function execute(InputInterface $input, OutputInterface $output)
$apcuPrefix = $input->getOption('apcu-prefix');
$apcu = $apcuPrefix !== null || $input->getOption('apcu') || $config->get('apcu-autoloader');

if ($input->getOption('strict-psr') && !$optimize) {
throw new \InvalidArgumentException('--strict-psr mode only works with optimized autoloader, use --optimize if you want a strict return value.');
}

if ($authoritative) {
$this->getIO()->write('<info>Generating optimized autoload files (authoritative)</info>');
} elseif ($optimize) {
Expand All @@ -91,7 +96,8 @@ protected function execute(InputInterface $input, OutputInterface $output)
$generator->setRunScripts(true);
$generator->setApcu($apcu, $apcuPrefix);
$generator->setPlatformRequirementFilter($this->getPlatformRequirementFilter($input));
$numberOfClasses = $generator->dump($config, $localRepo, $package, $installationManager, 'composer', $optimize);
$classMap = $generator->dump($config, $localRepo, $package, $installationManager, 'composer', $optimize);
$numberOfClasses = count($classMap);

if ($authoritative) {
$this->getIO()->write('<info>Generated optimized autoload files (authoritative) containing '. $numberOfClasses .' classes</info>');
Expand All @@ -101,6 +107,10 @@ protected function execute(InputInterface $input, OutputInterface $output)
$this->getIO()->write('<info>Generated autoload files</info>');
}

if ($input->getOption('strict-psr') && count($classMap->getPsrViolations()) > 0) {
return 1;
}

return 0;
}
}