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\CommandCode
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;
}