[Console] Fix filtering out identical alternatives when there is a command loader

This commit is contained in:
Thomas Calvet 2019-12-23 21:21:28 +01:00
parent 135c6f7d9d
commit 589e93e3b7
2 changed files with 10 additions and 6 deletions

View File

@ -645,8 +645,13 @@ class Application
// filter out aliases for commands which are already on the list // filter out aliases for commands which are already on the list
if (\count($commands) > 1) { if (\count($commands) > 1) {
$commandList = $this->commandLoader ? array_merge(array_flip($this->commandLoader->getNames()), $this->commands) : $this->commands; $commandList = $this->commandLoader ? array_merge(array_flip($this->commandLoader->getNames()), $this->commands) : $this->commands;
$commands = array_unique(array_filter($commands, function ($nameOrAlias) use ($commandList, $commands, &$aliases) { $commands = array_unique(array_filter($commands, function ($nameOrAlias) use (&$commandList, $commands, &$aliases) {
$commandName = $commandList[$nameOrAlias] instanceof Command ? $commandList[$nameOrAlias]->getName() : $nameOrAlias; if (!$commandList[$nameOrAlias] instanceof Command) {
$commandList[$nameOrAlias] = $this->commandLoader->get($nameOrAlias);
}
$commandName = $commandList[$nameOrAlias]->getName();
$aliases[$nameOrAlias] = $commandName; $aliases[$nameOrAlias] = $commandName;
return $commandName === $nameOrAlias || !\in_array($commandName, $commands); return $commandName === $nameOrAlias || !\in_array($commandName, $commands);
@ -662,10 +667,6 @@ class Application
$maxLen = max(Helper::strlen($abbrev), $maxLen); $maxLen = max(Helper::strlen($abbrev), $maxLen);
} }
$abbrevs = array_map(function ($cmd) use ($commandList, $usableWidth, $maxLen) { $abbrevs = array_map(function ($cmd) use ($commandList, $usableWidth, $maxLen) {
if (!$commandList[$cmd] instanceof Command) {
$commandList[$cmd] = $this->commandLoader->get($cmd);
}
if ($commandList[$cmd]->isHidden()) { if ($commandList[$cmd]->isHidden()) {
return false; return false;
} }

View File

@ -568,6 +568,9 @@ class ApplicationTest extends TestCase
$fooCommand->setAliases(['foo2']); $fooCommand->setAliases(['foo2']);
$application = new Application(); $application = new Application();
$application->setCommandLoader(new FactoryCommandLoader([
'foo3' => static function () use ($fooCommand) { return $fooCommand; },
]));
$application->add($fooCommand); $application->add($fooCommand);
$result = $application->find('foo'); $result = $application->find('foo');