186f3218ed3ffc12ea84f8daebabb2a2f963f608
[yaffs-website] / vendor / drupal / console-extend-plugin / src / Extender.php
1 <?php
2
3 namespace Drupal\Console\Composer\Plugin;
4
5 use Composer\Composer;
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;
13
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';
18
19 class Extender implements PluginInterface, EventSubscriberInterface
20 {
21     /**
22      * @var Composer $composer
23      */
24     protected $composer;
25
26     /**
27      * @var IOInterface $io
28      */
29     protected $io;
30
31     /**
32      * Apply plugin modifications to composer
33      *
34      * @param Composer    $composer
35      * @param IOInterface $io
36      */
37     public function activate(Composer $composer, IOInterface $io)
38     {
39         $this->composer = $composer;
40         $this->io = $io;
41     }
42
43     /**
44      * Returns an array of event names this subscriber wants to listen to.
45      */
46     public static function getSubscribedEvents()
47     {
48         return [
49             ScriptEvents::POST_INSTALL_CMD => "processPackages",
50             ScriptEvents::POST_UPDATE_CMD => "processPackages",
51         ];
52     }
53
54     /**
55      * @param Event $event
56      * @throws \Exception
57      */
58     public function processPackages(Event $event)
59     {
60         $extenderManager = new ExtenderManager();
61
62         $composer = $event->getComposer();
63         $installationManager = $composer->getInstallationManager();
64         $repositoryManager = $composer->getRepositoryManager();
65         $localRepository = $repositoryManager->getLocalRepository();
66
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');
72                 }
73             }
74         }
75
76         if ($consolePackage = $localRepository->findPackage('drupal/console', '*')) {
77             if ($localRepository->hasPackage($consolePackage)) {
78                 $directory = $installationManager->getInstallPath($consolePackage);
79             }
80         }
81         if (empty($directory)) {
82             // cwd should be the project root.  This is the same logic Symfony uses.
83             $directory = getcwd();
84         }
85
86         $configFile = $directory . '/extend.console.config.yml';
87         $servicesFile = $directory . '/extend.console.services.yml';
88         $servicesUninstallFile = $directory . '/extend.console.uninstall.services.yml';
89
90         if (file_exists($configFile)) {
91             unlink($configFile);
92             $this->io->write('<info>Removing config cache file:</info>');
93             $this->io->write($configFile);
94         }
95
96         if (file_exists($servicesFile)) {
97             unlink($servicesFile);
98             $this->io->write('<info>Removing packages services cache file:</info>');
99             $this->io->write($servicesFile);
100         }
101
102         if (file_exists($servicesUninstallFile)) {
103             unlink($servicesUninstallFile);
104             $this->io->write('<info>Removing packages services cache file:</info>');
105             $this->io->write($servicesUninstallFile);
106         }
107
108         if ($configData = $extenderManager->getConfigData()) {
109             file_put_contents(
110                 $configFile,
111                 Yaml::dump($configData, 6, 2)
112             );
113             $this->io->write('<info>Creating packages config cache file:</info>');
114             $this->io->write($configFile);
115         }
116
117         $servicesData = $extenderManager->getServicesData();
118         if ($servicesData && array_key_exists('install', $servicesData)) {
119             file_put_contents(
120                 $servicesFile,
121                 Yaml::dump($servicesData['install'], 4, 2)
122             );
123             $this->io->write('<info>Creating packages services cache file: </info>');
124             $this->io->write($servicesFile);
125         }
126
127         $servicesData = $extenderManager->getServicesData();
128         if ($servicesData && array_key_exists('uninstall', $servicesData)) {
129             file_put_contents(
130                 $servicesUninstallFile,
131                 Yaml::dump($servicesData['uninstall'], 4, 2)
132             );
133             $this->io->write('<info>Creating packages services cache file: </info>');
134             $this->io->write($servicesUninstallFile);
135         }
136
137         $this->removeCacheFiles($directory);
138     }
139
140     protected function removeCacheFiles($directory)
141     {
142         try {
143             $finder = new Finder();
144             $finder->files()
145                 ->in($directory)
146                 ->name('*-console.services.yml')
147                 ->ignoreUnreadableDirs();
148
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());
153             }
154         } catch (\InvalidArgumentException $argumentException) {
155             $this->io->write('<info>Cache file can not be deleted</info>');
156         }
157     }
158 }