*/
public static function getSubscribedEvents(): array
{
return [
ScriptEvents::POST_INSTALL_CMD => 'process',
ScriptEvents::POST_UPDATE_CMD => 'process',
];
}
public function process(Event $event): void
{
$io = $event->getIO();
if (!file_exists(__DIR__)) {
$io->write('phpstan/extension-installer: Package not found (probably scheduled for removal); extensions installation skipped.');
return;
}
$composer = $event->getComposer();
$installationManager = $composer->getInstallationManager();
$generatedConfigFilePath = __DIR__ . '/GeneratedConfig.php';
$oldGeneratedConfigFileHash = null;
if (is_file($generatedConfigFilePath)) {
$oldGeneratedConfigFileHash = md5_file($generatedConfigFilePath);
}
$notInstalledPackages = [];
$installedPackages = [];
$data = [];
$fs = new Filesystem();
foreach ($composer->getRepositoryManager()->getLocalRepository()->getPackages() as $package) {
if (
$package->getType() !== 'phpstan-extension'
&& !isset($package->getExtra()['phpstan'])
) {
if (
strpos($package->getName(), 'phpstan') !== false
&& !in_array($package->getName(), [
'phpstan/phpstan',
'phpstan/phpstan-shim',
'phpstan/phpdoc-parser',
'phpstan/extension-installer',
], true)
) {
$notInstalledPackages[$package->getName()] = $package->getFullPrettyVersion();
}
continue;
}
$installPath = $installationManager->getInstallPath($package);
$absoluteInstallPath = $fs->isAbsolutePath($installPath)
? $installPath
: getcwd() . DIRECTORY_SEPARATOR . $installPath;
$data[$package->getName()] = [
'install_path' => $absoluteInstallPath,
'relative_install_path' => $fs->findShortestPath(dirname($generatedConfigFilePath), $absoluteInstallPath, true),
'extra' => $package->getExtra()['phpstan'] ?? null,
'version' => $package->getFullPrettyVersion(),
];
$installedPackages[$package->getName()] = true;
}
ksort($data);
ksort($installedPackages);
ksort($notInstalledPackages);
$generatedConfigFileContents = sprintf(self::$generatedFileTemplate, var_export($data, true), var_export($notInstalledPackages, true));
file_put_contents($generatedConfigFilePath, $generatedConfigFileContents);
$io->write('phpstan/extension-installer: Extensions installed');
if ($oldGeneratedConfigFileHash === md5($generatedConfigFileContents)) {
return;
}
foreach (array_keys($installedPackages) as $name) {
$io->write(sprintf('> %s: installed', $name));
}
foreach (array_keys($notInstalledPackages) as $name) {
$io->write(sprintf('> %s: not supported', $name));
}
}
}