*/ 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)); } } }