Added the Search API Synonym module to deal specifically with licence and license...
[yaffs-website] / vendor / drupal / console-extend-plugin / src / Extender.php
index 5685fea13c2239b64247e41cbf8ddec2d32db508..186f3218ed3ffc12ea84f8daebabb2a2f963f608 100644 (file)
@@ -5,10 +5,16 @@ namespace Drupal\Console\Composer\Plugin;
 use Composer\Composer;
 use Composer\IO\IOInterface;
 use Composer\Plugin\PluginInterface;
-use Composer\Installer\PackageEvent;
-use Composer\Installer\PackageEvents;
+use Composer\Script\Event;
+use Composer\Script\ScriptEvents;
 use Composer\EventDispatcher\EventSubscriberInterface;
 use Symfony\Component\Yaml\Yaml;
+use Symfony\Component\Finder\Finder;
+
+// Explicitly require ExtenderManager here.
+// When this package is uninstalled, ExtenderManager needs to be available any
+// time this class is available.
+require_once __DIR__ . '/ExtenderManager.php';
 
 class Extender implements PluginInterface, EventSubscriberInterface
 {
@@ -39,30 +45,42 @@ class Extender implements PluginInterface, EventSubscriberInterface
      */
     public static function getSubscribedEvents()
     {
-        return array(
-            PackageEvents::POST_PACKAGE_INSTALL => "processPackages",
-            PackageEvents::POST_PACKAGE_UPDATE => "processPackages",
-            PackageEvents::POST_PACKAGE_UNINSTALL => "processPackages",
-        );
+        return [
+            ScriptEvents::POST_INSTALL_CMD => "processPackages",
+            ScriptEvents::POST_UPDATE_CMD => "processPackages",
+        ];
     }
 
     /**
-     * @param PackageEvent $event
+     * @param Event $event
      * @throws \Exception
      */
-    public function processPackages(PackageEvent $event)
+    public function processPackages(Event $event)
     {
         $extenderManager = new ExtenderManager();
-        $directory = realpath(__DIR__.'/../../../../');
-        $extenderManager->processProjectPackages($directory);
-
-        if (is_dir($directory.'/vendor/drupal/console')) {
-            $directory = $directory.'/vendor/drupal/console';
-        } else {
-            $configFile = $directory.'/console.config.yml';
-            $servicesFile = $directory.'/console.services.yml';
-            $extenderManager->addConfigFile($configFile);
-            $extenderManager->addServicesFile($servicesFile);
+
+        $composer = $event->getComposer();
+        $installationManager = $composer->getInstallationManager();
+        $repositoryManager = $composer->getRepositoryManager();
+        $localRepository = $repositoryManager->getLocalRepository();
+
+        foreach ($localRepository->getPackages() as $package) {
+            if ($installationManager->isPackageInstalled($localRepository, $package)) {
+                if ($package->getType() === 'drupal-console-library') {
+                    $extenderManager->addServicesFile($installationManager->getInstallPath($package) . '/console.services.yml');
+                    $extenderManager->addConfigFile($installationManager->getInstallPath($package) . '/console.config.yml');
+                }
+            }
+        }
+
+        if ($consolePackage = $localRepository->findPackage('drupal/console', '*')) {
+            if ($localRepository->hasPackage($consolePackage)) {
+                $directory = $installationManager->getInstallPath($consolePackage);
+            }
+        }
+        if (empty($directory)) {
+            // cwd should be the project root.  This is the same logic Symfony uses.
+            $directory = getcwd();
         }
 
         $configFile = $directory . '/extend.console.config.yml';
@@ -71,17 +89,20 @@ class Extender implements PluginInterface, EventSubscriberInterface
 
         if (file_exists($configFile)) {
             unlink($configFile);
-            $this->io->write('<info>Removing config cache file:</info>' . $configFile);
+            $this->io->write('<info>Removing config cache file:</info>');
+            $this->io->write($configFile);
         }
 
         if (file_exists($servicesFile)) {
             unlink($servicesFile);
-            $this->io->write('<info>Removing services cache file:</info>' . $servicesFile);
+            $this->io->write('<info>Removing packages services cache file:</info>');
+            $this->io->write($servicesFile);
         }
 
         if (file_exists($servicesUninstallFile)) {
             unlink($servicesUninstallFile);
-            $this->io->write('<info>Removing services cache file:</info>' . $servicesUninstallFile);
+            $this->io->write('<info>Removing packages services cache file:</info>');
+            $this->io->write($servicesUninstallFile);
         }
 
         if ($configData = $extenderManager->getConfigData()) {
@@ -89,7 +110,8 @@ class Extender implements PluginInterface, EventSubscriberInterface
                 $configFile,
                 Yaml::dump($configData, 6, 2)
             );
-            $this->io->write('<info>Creating config cache file:</info>' . $configFile);
+            $this->io->write('<info>Creating packages config cache file:</info>');
+            $this->io->write($configFile);
         }
 
         $servicesData = $extenderManager->getServicesData();
@@ -98,7 +120,8 @@ class Extender implements PluginInterface, EventSubscriberInterface
                 $servicesFile,
                 Yaml::dump($servicesData['install'], 4, 2)
             );
-            $this->io->write('<info>Creating services cache file: </info>' . $servicesFile);
+            $this->io->write('<info>Creating packages services cache file: </info>');
+            $this->io->write($servicesFile);
         }
 
         $servicesData = $extenderManager->getServicesData();
@@ -107,7 +130,29 @@ class Extender implements PluginInterface, EventSubscriberInterface
                 $servicesUninstallFile,
                 Yaml::dump($servicesData['uninstall'], 4, 2)
             );
-            $this->io->write('<info>Creating services cache file: </info>' . $servicesUninstallFile);
+            $this->io->write('<info>Creating packages services cache file: </info>');
+            $this->io->write($servicesUninstallFile);
+        }
+
+        $this->removeCacheFiles($directory);
+    }
+
+    protected function removeCacheFiles($directory)
+    {
+        try {
+            $finder = new Finder();
+            $finder->files()
+                ->in($directory)
+                ->name('*-console.services.yml')
+                ->ignoreUnreadableDirs();
+
+            foreach ($finder as $file) {
+                $this->io->write('<info>Removing site services cache file:</info>');
+                $this->io->write($file->getPathName());
+                unlink($file->getPathName());
+            }
+        } catch (\InvalidArgumentException $argumentException) {
+            $this->io->write('<info>Cache file can not be deleted</info>');
         }
     }
 }