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

Breadcrumb

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

function SearchCommand::execute

Overrides Command::execute

File

vendor/composer/composer/src/Composer/Command/SearchCommand.php, line 56

Class

SearchCommand
@author Robert Schönthal <seroscho@googlemail.com>

Namespace

Composer\Command

Code

protected function execute(InputInterface $input, OutputInterface $output) : int {
    // init repos
    $platformRepo = new PlatformRepository();
    $io = $this->getIO();
    $format = $input->getOption('format');
    if (!in_array($format, [
        'text',
        'json',
    ])) {
        $io->writeError(sprintf('Unsupported format "%s". See help for supported formats.', $format));
        return 1;
    }
    if (!($composer = $this->tryComposer())) {
        $composer = $this->createComposerInstance($input, $this->getIO(), []);
    }
    $localRepo = $composer->getRepositoryManager()
        ->getLocalRepository();
    $installedRepo = new CompositeRepository([
        $localRepo,
        $platformRepo,
    ]);
    $repos = new CompositeRepository(array_merge([
        $installedRepo,
    ], $composer->getRepositoryManager()
        ->getRepositories()));
    $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'search', $input, $output);
    $composer->getEventDispatcher()
        ->dispatch($commandEvent->getName(), $commandEvent);
    $mode = RepositoryInterface::SEARCH_FULLTEXT;
    if ($input->getOption('only-name') === true) {
        if ($input->getOption('only-vendor') === true) {
            throw new \InvalidArgumentException('--only-name and --only-vendor cannot be used together');
        }
        $mode = RepositoryInterface::SEARCH_NAME;
    }
    elseif ($input->getOption('only-vendor') === true) {
        $mode = RepositoryInterface::SEARCH_VENDOR;
    }
    $type = $input->getOption('type');
    $query = implode(' ', $input->getArgument('tokens'));
    if ($mode !== RepositoryInterface::SEARCH_FULLTEXT) {
        $query = preg_quote($query);
    }
    $results = $repos->search($query, $mode, $type);
    if (\count($results) > 0 && $format === 'text') {
        $width = $this->getTerminalWidth();
        $nameLength = 0;
        foreach ($results as $result) {
            $nameLength = max(strlen($result['name']), $nameLength);
        }
        $nameLength += 1;
        foreach ($results as $result) {
            $description = $result['description'] ?? '';
            $warning = !empty($result['abandoned']) ? '<warning>! Abandoned !</warning> ' : '';
            $remaining = $width - $nameLength - strlen($warning) - 2;
            if (strlen($description) > $remaining) {
                $description = substr($description, 0, $remaining - 3) . '...';
            }
            $link = $result['url'] ?? null;
            if ($link !== null) {
                $io->write('<href=' . OutputFormatter::escape($link) . '>' . $result['name'] . '</>' . str_repeat(' ', $nameLength - strlen($result['name'])) . $warning . $description);
            }
            else {
                $io->write(str_pad($result['name'], $nameLength, ' ') . $warning . $description);
            }
        }
    }
    elseif ($format === 'json') {
        $io->write(JsonFile::encode($results));
    }
    return 0;
}
RSS feed
Powered by Drupal