3 namespace Drupal\Console\Composer\Plugin;
6 use Composer\IO\IOInterface;
7 use Composer\Plugin\PluginInterface;
8 use Composer\Script\Event;
9 use Composer\Script\ScriptEvents;
10 use Composer\EventDispatcher\EventSubscriberInterface;
11 use Symfony\Component\Yaml\Yaml;
12 use Symfony\Component\Finder\Finder;
14 // Explicitly require ExtenderManager here.
15 // When this package is uninstalled, ExtenderManager needs to be available any
16 // time this class is available.
17 require_once __DIR__ . '/ExtenderManager.php';
19 class Extender implements PluginInterface, EventSubscriberInterface
22 * @var Composer $composer
27 * @var IOInterface $io
32 * Apply plugin modifications to composer
34 * @param Composer $composer
35 * @param IOInterface $io
37 public function activate(Composer $composer, IOInterface $io)
39 $this->composer = $composer;
44 * Returns an array of event names this subscriber wants to listen to.
46 public static function getSubscribedEvents()
49 ScriptEvents::POST_INSTALL_CMD => "processPackages",
50 ScriptEvents::POST_UPDATE_CMD => "processPackages",
58 public function processPackages(Event $event)
60 $extenderManager = new ExtenderManager();
62 $composer = $event->getComposer();
63 $installationManager = $composer->getInstallationManager();
64 $repositoryManager = $composer->getRepositoryManager();
65 $localRepository = $repositoryManager->getLocalRepository();
67 foreach ($localRepository->getPackages() as $package) {
68 if ($installationManager->isPackageInstalled($localRepository, $package)) {
69 if ($package->getType() === 'drupal-console-library') {
70 $extenderManager->addServicesFile($installationManager->getInstallPath($package) . '/console.services.yml');
71 $extenderManager->addConfigFile($installationManager->getInstallPath($package) . '/console.config.yml');
76 if ($consolePackage = $localRepository->findPackage('drupal/console', '*')) {
77 if ($localRepository->hasPackage($consolePackage)) {
78 $directory = $installationManager->getInstallPath($consolePackage);
81 if (empty($directory)) {
82 // cwd should be the project root. This is the same logic Symfony uses.
83 $directory = getcwd();
86 $configFile = $directory . '/extend.console.config.yml';
87 $servicesFile = $directory . '/extend.console.services.yml';
88 $servicesUninstallFile = $directory . '/extend.console.uninstall.services.yml';
90 if (file_exists($configFile)) {
92 $this->io->write('<info>Removing config cache file:</info>');
93 $this->io->write($configFile);
96 if (file_exists($servicesFile)) {
97 unlink($servicesFile);
98 $this->io->write('<info>Removing packages services cache file:</info>');
99 $this->io->write($servicesFile);
102 if (file_exists($servicesUninstallFile)) {
103 unlink($servicesUninstallFile);
104 $this->io->write('<info>Removing packages services cache file:</info>');
105 $this->io->write($servicesUninstallFile);
108 if ($configData = $extenderManager->getConfigData()) {
111 Yaml::dump($configData, 6, 2)
113 $this->io->write('<info>Creating packages config cache file:</info>');
114 $this->io->write($configFile);
117 $servicesData = $extenderManager->getServicesData();
118 if ($servicesData && array_key_exists('install', $servicesData)) {
121 Yaml::dump($servicesData['install'], 4, 2)
123 $this->io->write('<info>Creating packages services cache file: </info>');
124 $this->io->write($servicesFile);
127 $servicesData = $extenderManager->getServicesData();
128 if ($servicesData && array_key_exists('uninstall', $servicesData)) {
130 $servicesUninstallFile,
131 Yaml::dump($servicesData['uninstall'], 4, 2)
133 $this->io->write('<info>Creating packages services cache file: </info>');
134 $this->io->write($servicesUninstallFile);
137 $this->removeCacheFiles($directory);
140 protected function removeCacheFiles($directory)
143 $finder = new Finder();
146 ->name('*-console.services.yml')
147 ->ignoreUnreadableDirs();
149 foreach ($finder as $file) {
150 $this->io->write('<info>Removing site services cache file:</info>');
151 $this->io->write($file->getPathName());
152 unlink($file->getPathName());
154 } catch (\InvalidArgumentException $argumentException) {
155 $this->io->write('<info>Cache file can not be deleted</info>');