[Console] Fix merging of application definition, fixes #7068, replaces #7158

This commit is contained in:
Jordi Boggiano 2013-04-12 15:15:07 +02:00
parent 3c44d487f2
commit 46909faff0
2 changed files with 29 additions and 1 deletions

View File

@ -36,6 +36,7 @@ class Command
private $description; private $description;
private $ignoreValidationErrors; private $ignoreValidationErrors;
private $applicationDefinitionMerged; private $applicationDefinitionMerged;
private $applicationDefinitionMergedWithArgs;
private $code; private $code;
private $synopsis; private $synopsis;
private $helperSet; private $helperSet;
@ -54,6 +55,7 @@ class Command
$this->definition = new InputDefinition(); $this->definition = new InputDefinition();
$this->ignoreValidationErrors = false; $this->ignoreValidationErrors = false;
$this->applicationDefinitionMerged = false; $this->applicationDefinitionMerged = false;
$this->applicationDefinitionMergedWithArgs = false;
$this->aliases = array(); $this->aliases = array();
if (null !== $name) { if (null !== $name) {
@ -277,7 +279,7 @@ class Command
*/ */
private function mergeApplicationDefinition($mergeArgs = true) private function mergeApplicationDefinition($mergeArgs = true)
{ {
if (null === $this->application || true === $this->applicationDefinitionMerged) { if (null === $this->application || (true === $this->applicationDefinitionMerged && ($this->applicationDefinitionMergedWithArgs || !$mergeArgs))) {
return; return;
} }
@ -290,6 +292,9 @@ class Command
$this->definition->addOptions($this->application->getDefinition()->getOptions()); $this->definition->addOptions($this->application->getDefinition()->getOptions());
$this->applicationDefinitionMerged = true; $this->applicationDefinitionMerged = true;
if ($mergeArgs) {
$this->applicationDefinitionMergedWithArgs = true;
}
} }
/** /**

View File

@ -193,6 +193,29 @@ class CommandTest extends \PHPUnit_Framework_TestCase
$this->assertEquals(3, $command->getDefinition()->getArgumentCount(), '->mergeApplicationDefinition() does not try to merge twice the application arguments and options'); $this->assertEquals(3, $command->getDefinition()->getArgumentCount(), '->mergeApplicationDefinition() does not try to merge twice the application arguments and options');
} }
public function testMergeApplicationDefinitionWithoutArgsThenWithArgsAddsArgs()
{
$application1 = new Application();
$application1->getDefinition()->addArguments(array(new InputArgument('foo')));
$application1->getDefinition()->addOptions(array(new InputOption('bar')));
$command = new \TestCommand();
$command->setApplication($application1);
$command->setDefinition($definition = new InputDefinition(array()));
$r = new \ReflectionObject($command);
$m = $r->getMethod('mergeApplicationDefinition');
$m->setAccessible(true);
$m->invoke($command, false);
$this->assertTrue($command->getDefinition()->hasOption('bar'), '->mergeApplicationDefinition(false) merges the application and the commmand options');
$this->assertFalse($command->getDefinition()->hasArgument('foo'), '->mergeApplicationDefinition(false) does not merge the application arguments');
$m->invoke($command, true);
$this->assertTrue($command->getDefinition()->hasArgument('foo'), '->mergeApplicationDefinition(true) merges the application arguments and the command arguments');
$m->invoke($command);
$this->assertEquals(2, $command->getDefinition()->getArgumentCount(), '->mergeApplicationDefinition() does not try to merge twice the application arguments');
}
public function testRun() public function testRun()
{ {
$command = new \TestCommand(); $command = new \TestCommand();