setName('help') ->setAliases(['?']) ->setDefinition([ new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', null), ]) ->setDescription('Show a list of commands. Type `help [foo]` for information about [foo].'); } /** * Helper for setting a subcommand to retrieve help for. * * @param \Symfony\Component\Console\Command\Command $command */ public function setCommand(Command $command) { $this->command = $command; } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { if ($this->command !== null) { // Help for an individual command. $output->page($this->command->asText()); $this->command = null; } elseif ($name = $input->getArgument('command_name')) { // Help for an individual command. $output->page($this->getApplication()->get($name)->asText()); } else { $namespaces = []; // List available commands. $commands = $this->getApplication()->all(); // Find the alignment width. $width = 0; foreach ($commands as $command) { $width = strlen($command->getName()) > $width ? strlen($command->getName()) : $width; } $width += 2; foreach ($commands as $name => $command) { if ($name !== $command->getName()) { continue; } if ($command->getAliases()) { $aliases = sprintf(' Aliases: %s', implode(', ', $command->getAliases())); } else { $aliases = ''; } $namespace = ''; if ($command instanceof DrushCommand) { $namespace = $command->getNamespace(); } if (empty($namespace)) { $namespace = static::PSYSH_CATEGORY; } if (!isset($namespaces[$namespace])) { $namespaces[$namespace] = []; } $namespaces[$namespace][] = sprintf(" %-${width}s %s%s", $name, $command->getDescription(), $aliases); } $messages = []; foreach ($namespaces as $namespace => $command_messages) { $messages[] = ''; $messages[] = sprintf('%s', OutputFormatter::escape($namespace)); foreach ($command_messages as $command_message) { $messages[] = $command_message; } } $output->page($messages); } } }