Skip to content

Commit

Permalink
bug #22244 [Console] Fix passing options with defaultCommand (Jakub S…
Browse files Browse the repository at this point in the history
…acha)

This PR was merged into the 2.7 branch.

Discussion
----------

[Console] Fix passing options with defaultCommand

| Q             | A
| ------------- | ---
| Branch?       | 2.7
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets |
| License       | MIT
| Doc PR        |

Seems like overwriting input for the default command is not needed (anymore?). I don't know where the removed comment comes from originally.

Use case: i want to call default command and use options at the same time:
app/console --abc=true

Commits
-------

761de99 Fix passing options with defaultCommand
  • Loading branch information
fabpot committed Jul 29, 2017
2 parents ae7e2cd + 761de99 commit 8f5141d
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 6 deletions.
7 changes: 6 additions & 1 deletion src/Symfony/Component/Console/Application.php
Expand Up @@ -189,7 +189,12 @@ public function doRun(InputInterface $input, OutputInterface $output)

if (!$name) {
$name = $this->defaultCommand;
$input = new ArrayInput(array('command' => $this->defaultCommand));
$this->definition->setArguments(array_merge(
$this->definition->getArguments(),
array(
'command' => new InputArgument('command', InputArgument::OPTIONAL, $this->definition->getArgument('command')->getDescription(), $name),
)
));
}

$this->runningCommand = null;
Expand Down
24 changes: 20 additions & 4 deletions src/Symfony/Component/Console/Tests/ApplicationTest.php
Expand Up @@ -39,6 +39,7 @@ public static function setUpBeforeClass()
{
self::$fixturesPath = realpath(__DIR__.'/Fixtures/');
require_once self::$fixturesPath.'/FooCommand.php';
require_once self::$fixturesPath.'/FooOptCommand.php';
require_once self::$fixturesPath.'/Foo1Command.php';
require_once self::$fixturesPath.'/Foo2Command.php';
require_once self::$fixturesPath.'/Foo3Command.php';
Expand Down Expand Up @@ -1116,16 +1117,31 @@ public function testSetRunCustomDefaultCommand()
$application->setDefaultCommand($command->getName());

$tester = new ApplicationTester($application);
$tester->run(array());
$this->assertEquals('interact called'.PHP_EOL.'called'.PHP_EOL, $tester->getDisplay(), 'Application runs the default set command if different from \'list\' command');
$tester->run(array(), array('interactive' => false));
$this->assertEquals('called'.PHP_EOL, $tester->getDisplay(), 'Application runs the default set command if different from \'list\' command');

$application = new CustomDefaultCommandApplication();
$application->setAutoExit(false);

$tester = new ApplicationTester($application);
$tester->run(array());
$tester->run(array(), array('interactive' => false));

$this->assertEquals('interact called'.PHP_EOL.'called'.PHP_EOL, $tester->getDisplay(), 'Application runs the default set command if different from \'list\' command');
$this->assertEquals('called'.PHP_EOL, $tester->getDisplay(), 'Application runs the default set command if different from \'list\' command');
}

public function testSetRunCustomDefaultCommandWithOption()
{
$command = new \FooOptCommand();

$application = new Application();
$application->setAutoExit(false);
$application->add($command);
$application->setDefaultCommand($command->getName());

$tester = new ApplicationTester($application);
$tester->run(array('--fooopt' => 'opt'), array('interactive' => false));

$this->assertEquals('called'.PHP_EOL.'opt'.PHP_EOL, $tester->getDisplay(), 'Application runs the default set command if different from \'list\' command');
}

/**
Expand Down
36 changes: 36 additions & 0 deletions src/Symfony/Component/Console/Tests/Fixtures/FooOptCommand.php
@@ -0,0 +1,36 @@
<?php

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

class FooOptCommand extends Command
{
public $input;
public $output;

protected function configure()
{
$this
->setName('foo:bar')
->setDescription('The foo:bar command')
->setAliases(array('afoobar'))
->addOption('fooopt', 'fo', InputOption::VALUE_OPTIONAL, 'fooopt description')
;
}

protected function interact(InputInterface $input, OutputInterface $output)
{
$output->writeln('interact called');
}

protected function execute(InputInterface $input, OutputInterface $output)
{
$this->input = $input;
$this->output = $output;

$output->writeln('called');
$output->writeln($this->input->getOption('fooopt'));
}
}
Expand Up @@ -2,7 +2,7 @@ Usage:
help [options] [--] [<command_name>]

Arguments:
command The command to execute
command The command to execute [default: "list"]
command_name The command name [default: "help"]

Options:
Expand Down

0 comments on commit 8f5141d

Please sign in to comment.