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

Breadcrumb

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

function CheckPlatformReqsCommand::execute

Overrides Command::execute

File

vendor/composer/composer/src/Composer/Command/CheckPlatformReqsCommand.php, line 48

Class

CheckPlatformReqsCommand

Namespace

Composer\Command

Code

protected function execute(InputInterface $input, OutputInterface $output) : int {
    $composer = $this->requireComposer();
    $requires = [];
    $removePackages = [];
    if ($input->getOption('lock')) {
        $this->getIO()
            ->writeError('<info>Checking ' . ($input->getOption('no-dev') ? 'non-dev ' : '') . 'platform requirements using the lock file</info>');
        $installedRepo = $composer->getLocker()
            ->getLockedRepository(!$input->getOption('no-dev'));
    }
    else {
        $installedRepo = $composer->getRepositoryManager()
            ->getLocalRepository();
        // fallback to lockfile if installed repo is empty
        if (!$installedRepo->getPackages()) {
            $this->getIO()
                ->writeError('<warning>No vendor dir present, checking ' . ($input->getOption('no-dev') ? 'non-dev ' : '') . 'platform requirements from the lock file</warning>');
            $installedRepo = $composer->getLocker()
                ->getLockedRepository(!$input->getOption('no-dev'));
        }
        else {
            if ($input->getOption('no-dev')) {
                $removePackages = $installedRepo->getDevPackageNames();
            }
            $this->getIO()
                ->writeError('<info>Checking ' . ($input->getOption('no-dev') ? 'non-dev ' : '') . 'platform requirements for packages in the vendor dir</info>');
        }
    }
    if (!$input->getOption('no-dev')) {
        foreach ($composer->getPackage()
            ->getDevRequires() as $require => $link) {
            $requires[$require] = [
                $link,
            ];
        }
    }
    $installedRepo = new InstalledRepository([
        $installedRepo,
        new RootPackageRepository(clone $composer->getPackage()),
    ]);
    foreach ($installedRepo->getPackages() as $package) {
        if (in_array($package->getName(), $removePackages, true)) {
            continue;
        }
        foreach ($package->getRequires() as $require => $link) {
            $requires[$require][] = $link;
        }
    }
    ksort($requires);
    $installedRepo->addRepository(new PlatformRepository([], []));
    $results = [];
    $exitCode = 0;
    
    /**
     * @var Link[] $links
     */
    foreach ($requires as $require => $links) {
        if (PlatformRepository::isPlatformPackage($require)) {
            $candidates = $installedRepo->findPackagesWithReplacersAndProviders($require);
            if ($candidates) {
                $reqResults = [];
                foreach ($candidates as $candidate) {
                    $candidateConstraint = null;
                    if ($candidate->getName() === $require) {
                        $candidateConstraint = new Constraint('=', $candidate->getVersion());
                        $candidateConstraint->setPrettyString($candidate->getPrettyVersion());
                    }
                    else {
                        foreach (array_merge($candidate->getProvides(), $candidate->getReplaces()) as $link) {
                            if ($link->getTarget() === $require) {
                                $candidateConstraint = $link->getConstraint();
                                break;
                            }
                        }
                    }
                    // safety check for phpstan, but it should not be possible to get a candidate out of findPackagesWithReplacersAndProviders without a constraint matching $require
                    if (!$candidateConstraint) {
                        continue;
                    }
                    foreach ($links as $link) {
                        if (!$link->getConstraint()
                            ->matches($candidateConstraint)) {
                            $reqResults[] = [
                                $candidate->getName() === $require ? $candidate->getPrettyName() : $require,
                                $candidateConstraint->getPrettyString(),
                                $link,
                                '<error>failed</error>',
                                $candidate->getName() === $require ? '' : '<comment>provided by ' . $candidate->getPrettyName() . '</comment>',
                            ];
                            // skip to next candidate
                            continue 2;
                        }
                    }
                    $results[] = [
                        $candidate->getName() === $require ? $candidate->getPrettyName() : $require,
                        $candidateConstraint->getPrettyString(),
                        null,
                        '<info>success</info>',
                        $candidate->getName() === $require ? '' : '<comment>provided by ' . $candidate->getPrettyName() . '</comment>',
                    ];
                    // candidate matched, skip to next requirement
                    continue 2;
                }
                // show the first error from every failed candidate
                $results = array_merge($results, $reqResults);
                $exitCode = max($exitCode, 1);
                continue;
            }
            $results[] = [
                $require,
                'n/a',
                $links[0],
                '<error>missing</error>',
                '',
            ];
            $exitCode = max($exitCode, 2);
        }
    }
    $this->printTable($output, $results, $input->getOption('format'));
    return $exitCode;
}
RSS feed
Powered by Drupal