Yaffs site version 1.1
[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>' . $configFile);
93         }
94
95         if (file_exists($servicesFile)) {
96             unlink($servicesFile);
97             $this->io->write('<info>Removing services cache file:</info>' . $servicesFile);
98         }
99
100         if (file_exists($servicesUninstallFile)) {
101             unlink($servicesUninstallFile);
102             $this->io->write('<info>Removing services cache file:</info>' . $servicesUninstallFile);
103         }
104
105         if ($configData = $extenderManager->getConfigData()) {
106             file_put_contents(
107                 $configFile,
108                 Yaml::dump($configData, 6, 2)
109             );
110             $this->io->write('<info>Creating config cache file:</info>' . $configFile);
111         }
112
113         $servicesData = $extenderManager->getServicesData();
114         if ($servicesData && array_key_exists('install', $servicesData)) {
115             file_put_contents(
116                 $servicesFile,
117                 Yaml::dump($servicesData['install'], 4, 2)
118             );
119             $this->io->write('<info>Creating services cache file: </info>' . $servicesFile);
120         }
121
122         $servicesData = $extenderManager->getServicesData();
123         if ($servicesData && array_key_exists('uninstall', $servicesData)) {
124             file_put_contents(
125                 $servicesUninstallFile,
126                 Yaml::dump($servicesData['uninstall'], 4, 2)
127             );
128             $this->io->write('<info>Creating services cache file: </info>' . $servicesUninstallFile);
129         }
130
131         $this->removeCacheFiles();
132     }
133
134     protected function removeCacheFiles()
135     {
136         if (is_dir(getcwd().'/console/cache/')) {
137             try {
138                 $finder = new Finder();
139                 $finder->files()
140                     ->in(getcwd() . '/console/cache/')
141                     ->ignoreUnreadableDirs();
142
143                 foreach ($finder as $file) {
144                     unlink($file->getPathName());
145                 }
146
147                 $finder->directories()
148                     ->in(getcwd() . '/console/cache/')
149                     ->ignoreUnreadableDirs();
150
151                 foreach ($finder as $directory) {
152                     rmdir($directory);
153                 }
154
155             } catch (\InvalidArgumentException $argumentException) {
156                 $this->io->write('<info>Cache files can not be deleted</info>');
157             }
158         }
159     }
160 }