Yaffs site version 1.1
[yaffs-website] / vendor / drupal / console-extend-plugin / src / Extender.php
index 5685fea13c2239b64247e41cbf8ddec2d32db508..84e8a4fe6fee74e6e61ff37f14a8e8d71c986608 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';
@@ -109,5 +127,34 @@ class Extender implements PluginInterface, EventSubscriberInterface
             );
             $this->io->write('<info>Creating services cache file: </info>' . $servicesUninstallFile);
         }
+
+        $this->removeCacheFiles();
+    }
+
+    protected function removeCacheFiles()
+    {
+        if (is_dir(getcwd().'/console/cache/')) {
+            try {
+                $finder = new Finder();
+                $finder->files()
+                    ->in(getcwd() . '/console/cache/')
+                    ->ignoreUnreadableDirs();
+
+                foreach ($finder as $file) {
+                    unlink($file->getPathName());
+                }
+
+                $finder->directories()
+                    ->in(getcwd() . '/console/cache/')
+                    ->ignoreUnreadableDirs();
+
+                foreach ($finder as $directory) {
+                    rmdir($directory);
+                }
+
+            } catch (\InvalidArgumentException $argumentException) {
+                $this->io->write('<info>Cache files can not be deleted</info>');
+            }
+        }
     }
 }