Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. Plugin.php

function Plugin::postUpdate

File

vendor/php-http/discovery/src/Composer/Plugin.php, line 145

Class

Plugin
Auto-installs missing implementations.

Namespace

Http\Discovery\Composer

Code

public function postUpdate(Event $event) {
    $composer = $event->getComposer();
    $repo = $composer->getRepositoryManager()
        ->getLocalRepository();
    $requires = [
        $composer->getPackage()
            ->getRequires(),
        $composer->getPackage()
            ->getDevRequires(),
    ];
    $pinnedAbstractions = [];
    $pinned = $composer->getPackage()
        ->getExtra()['discovery'] ?? [];
    foreach (self::INTERFACE_MAP as $abstraction => $interfaces) {
        foreach (isset($pinned[$abstraction]) ? [] : $interfaces as $interface) {
            if (!isset($pinned[$interface])) {
                continue 2;
            }
        }
        $pinnedAbstractions[$abstraction] = true;
    }
    $missingRequires = $this->getMissingRequires($repo, $requires, 'project' === $composer->getPackage()
        ->getType(), $pinnedAbstractions);
    $missingRequires = [
        'require' => array_fill_keys(array_merge([], ...array_values($missingRequires[0])), '*'),
        'require-dev' => array_fill_keys(array_merge([], ...array_values($missingRequires[1])), '*'),
        'remove' => array_fill_keys(array_merge([], ...array_values($missingRequires[2])), '*'),
    ];
    if (!($missingRequires = array_filter($missingRequires))) {
        return;
    }
    $composerJsonContents = file_get_contents(Factory::getComposerFile());
    $this->updateComposerJson($missingRequires, $composer->getConfig()
        ->get('sort-packages'));
    $installer = null;
    // Find the composer installer, hack borrowed from symfony/flex
    foreach (debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT) as $trace) {
        if (isset($trace['object']) && $trace['object'] instanceof Installer) {
            $installer = $trace['object'];
            break;
        }
    }
    if (!$installer) {
        return;
    }
    $event->stopPropagation();
    $dispatcher = $composer->getEventDispatcher();
    $disableScripts = !method_exists($dispatcher, 'setRunScripts') || !((array) $dispatcher)["\x00*\x00runScripts"];
    $composer = Factory::create($event->getIO(), null, false, $disableScripts);
    
    /** @var Installer $installer */
    $installer = clone $installer;
    if (method_exists($installer, 'setAudit')) {
        $trace['object']->setAudit(false);
    }
    // we need a clone of the installer to preserve its configuration state but with our own service objects
    $installer->__construct($event->getIO(), $composer->getConfig(), $composer->getPackage(), $composer->getDownloadManager(), $composer->getRepositoryManager(), $composer->getLocker(), $composer->getInstallationManager(), $composer->getEventDispatcher(), $composer->getAutoloadGenerator());
    if (method_exists($installer, 'setPlatformRequirementFilter')) {
        $installer->setPlatformRequirementFilter(((array) $trace['object'])["\x00*\x00platformRequirementFilter"]);
    }
    if (0 !== $installer->run()) {
        file_put_contents(Factory::getComposerFile(), $composerJsonContents);
        return;
    }
    $versionSelector = new VersionSelector(ClassDiscovery::safeClassExists(RepositorySet::class) ? new RepositorySet() : new Pool());
    $updateComposerJson = false;
    foreach ($composer->getRepositoryManager()
        ->getLocalRepository()
        ->getPackages() as $package) {
        foreach ([
            'require',
            'require-dev',
        ] as $key) {
            if (!isset($missingRequires[$key][$package->getName()])) {
                continue;
            }
            $updateComposerJson = true;
            $missingRequires[$key][$package->getName()] = $versionSelector->findRecommendedRequireVersion($package);
        }
    }
    if ($updateComposerJson) {
        $this->updateComposerJson($missingRequires, $composer->getConfig()
            ->get('sort-packages'));
        $this->updateComposerLock($composer, $event->getIO());
    }
}

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal