Plugin.php 2.59 KB
Newer Older
Ketan's avatar
Ketan committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
declare(strict_types=1);

namespace Magento\InventoryComposerInstaller;

use Composer\Autoload\ClassLoader;
use Composer\Composer;
use Composer\DependencyResolver\Operation\InstallOperation;
use Composer\DependencyResolver\Operation\UpdateOperation;
use Composer\EventDispatcher\EventSubscriberInterface;
use Composer\Installer\PackageEvent;
use Composer\IO\IOInterface;
use Composer\Plugin\PluginInterface;
use Magento\Framework\App\Bootstrap;
use Magento\Framework\App\DeploymentConfig;
use Magento\Framework\Autoload\AutoloaderRegistry;
use Magento\Framework\Autoload\ClassLoaderWrapper;

class Plugin implements PluginInterface, EventSubscriberInterface
{
    /**
     * @var Composer
     */
    private $composer;
    /**
     * @var IOInterface
     */
    private $io;

    /**
     * @var InventoryModuleDeployment
     */
    private $moduleDeployment;

    public function activate(Composer $composer, IOInterface $io)
    {
        $this->composer = $composer;
        $this->io = $io;
    }

    public static function getSubscribedEvents()
    {
        return [
            'pre-install-cmd' => 'initModuleDeployment',
            'pre-update-cmd' => 'initModuleDeployment',
            'post-package-install' => 'onPackageChange',
            'post-package-update' => 'onPackageChange',
        ];
    }

    public function initModuleDeployment(): void
    {
        try {
            if (!defined('BP')) {
                define('BP', getcwd());
            }
            AutoloaderRegistry::registerAutoloader(new ClassLoaderWrapper(new ClassLoader()));

            $configurator = (new InventoryConfiguratorFactory($this->io))->createConfigurator(BP);
        } catch (\Throwable $e) {
            $configurator = new NoChangesConfigurator($this->io);
        }

        $this->moduleDeployment = new InventoryModuleDeployment($configurator, $this->io);
    }

    public function onPackageChange(PackageEvent $event): void
    {
        $operation = $event->getOperation();
        if ($operation instanceof InstallOperation) {
            $package = $operation->getPackage();
        } elseif ($operation instanceof UpdateOperation) {
            $package = $operation->getTargetPackage();
        } else {
            return;
        }

        $this->getModuleDeployment()->deploy($package);
    }

    private function getModuleDeployment(): InventoryModuleDeployment
    {
        if (!isset($this->moduleDeployment)) {
            $this->initModuleDeployment();
        }
        return $this->moduleDeployment;
    }
}