*/
class SearchCommand extends BaseCommand
{
protected function configure(): void
{
$this
->setName('search')
->setDescription('Searches for packages')
->setDefinition([
new InputOption('only-name', 'N', InputOption::VALUE_NONE, 'Search only in package names'),
new InputOption('only-vendor', 'O', InputOption::VALUE_NONE, 'Search only for vendor / organization names, returns only "vendor" as result'),
new InputOption('type', 't', InputOption::VALUE_REQUIRED, 'Search for a specific package type'),
new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text', ['json', 'text']),
new InputArgument('tokens', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'tokens to search for'),
])
->setHelp(
"The search command searches for packages by its name\nphp composer.phar search symfony composer\n\nRead more at https://getcomposer.org/doc/03-cli.md#search"
)
;
}
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 = Factory::create($this->getIO(), [], $input->hasParameterOption('--no-plugins'));
}
$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']) ? '! Abandoned ! ' : '';
$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(''.$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;
}
}
__halt_compiler();----SIGNATURE:----kS/VBx3GtJu4r/8VC3r/Bi9HYjWs4adp0tMLt+io/N1IRXJzJ/MAXQ58mC0TFn01jH74T4mpMq89X1ORJuTXimWqNTdw7R8OZS8FIPsF4OUMVmd1lQNS3e1wJTzYlcLl4PzOa7Rkf+0jsilisjhNfLgNNK3rhJncA8NiOuD6J9WTrXrgpaPeDuR6VaVK6SyAjmFxh0YzQdbWXWXwet7bTUv9nNG/crahpkJgxHzejfcbFfUNXJd61zVOOY4e7Gqg+a/sz9r+weU8yp5LTEpcp0KdXPnBPUJrw51mOiYckJCCVE/oICdRsbAKbYOXVWYS2TmFU1DGD5J2oI50SMBMhDnm6Wo3F9qQZtWUlcb3x9SE9mkgcK2reNMLPVUck6Y7eGqMU932hdfz0xel5XrXT77Qdko8l3jmByX64f4dUPjbC96NW594R+3ITTEZCvksVzPaZUYfwvAOBCW9NLfRYmH8i1r7bLom7dddB4nY34y/dx6e149ELYPYwGC0PEkE8m8kfhQ1tepq8mKXuRNJND+lsFs7uGA+vP+MOjAAmxgTeErn0+aVc81PBV/weoOTXkJNe2cJqe5PewlK5Tc/yb+0E0TWHNc+mmRF3e7t7VqUOLPdi7xYzElkGoW4/za3zm/MSa/QaNt4POTdPzZsu4iiLNMoNkZZU0Nz0vyOve0=----ATTACHMENT:----MjA0MTkzNjgwNDg3ODAwMyA5NDExNDg4NDMyNTE5Njk4IDMxNzkwOTYwMjc2NzIyMTc=