Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 8952155

Browse filesBrowse files
committed
[Console] Fix empty optionnal options with = separator in argv
1 parent b28cd81 commit 8952155
Copy full SHA for 8952155

File tree

Expand file treeCollapse file tree

2 files changed

+43
-2
lines changed
Filter options
Expand file treeCollapse file tree

2 files changed

+43
-2
lines changed

‎src/Symfony/Component/Console/Input/ArgvInput.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Console/Input/ArgvInput.php
+5-2Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,10 @@ private function parseLongOption($token)
145145
$name = substr($token, 2);
146146

147147
if (false !== $pos = strpos($name, '=')) {
148-
$this->addLongOption(substr($name, 0, $pos), substr($name, $pos + 1));
148+
if (0 === strlen($value = substr($name, $pos + 1))) {
149+
array_unshift($this->parsed, null);
150+
}
151+
$this->addLongOption(substr($name, 0, $pos), $value);
149152
} else {
150153
$this->addLongOption($name, null);
151154
}
@@ -232,7 +235,7 @@ private function addLongOption($name, $value)
232235
if (isset($next[0]) && '-' !== $next[0]) {
233236
$value = $next;
234237
} elseif (empty($next)) {
235-
$value = '';
238+
$value = null;
236239
} else {
237240
array_unshift($this->parsed, $next);
238241
}

‎src/Symfony/Component/Console/Tests/Input/ArgvInputTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Console/Tests/Input/ArgvInputTest.php
+38Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,18 @@ public function provideOptions()
7171
array('foo' => 'bar'),
7272
'->parse() parses long options with a required value (with a space separator)',
7373
),
74+
array(
75+
array('cli.php', '--foo='),
76+
array(new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL)),
77+
array('foo' => null),
78+
'->parse() parses long options with optional value which is empty (with a = separator) as null',
79+
),
80+
array(
81+
array('cli.php', '--foo=', 'bar'),
82+
array(new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL), new InputArgument('name', InputArgument::REQUIRED)),
83+
array('foo' => null),
84+
'->parse() parses long options with optional value which is empty (with a = separator) followed by an argument',
85+
),
7486
array(
7587
array('cli.php', '-f'),
7688
array(new InputOption('foo', 'f')),
@@ -324,4 +336,30 @@ public function testParseSingleDashAsArgument()
324336
$input->bind(new InputDefinition(array(new InputArgument('file'))));
325337
$this->assertEquals(array('file' => '-'), $input->getArguments(), '->parse() parses single dash as an argument');
326338
}
339+
340+
public function testParseOptionWithValueOptionalGivenEmptyAndRequiredArgument()
341+
{
342+
$input = new ArgvInput(array('cli.php', '--foo=', 'bar'));
343+
$input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL), new InputArgument('name', InputArgument::REQUIRED))));
344+
$this->assertEquals(array('foo' => null), $input->getOptions(), '->parse() parses optional options with empty value as null');
345+
$this->assertEquals(array('name' => 'bar'), $input->getArguments(), '->parse() parses required arguments');
346+
347+
$input = new ArgvInput(array('cli.php', '--foo=0', 'bar'));
348+
$input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL), new InputArgument('name', InputArgument::REQUIRED))));
349+
$this->assertEquals(array('foo' => '0'), $input->getOptions(), '->parse() parses optional options with empty value as null');
350+
$this->assertEquals(array('name' => 'bar'), $input->getArguments(), '->parse() parses required arguments');
351+
}
352+
353+
public function testParseOptionWithValueOptionalGivenEmptyAndOptionalArgument()
354+
{
355+
$input = new ArgvInput(array('cli.php', '--foo=', 'bar'));
356+
$input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL), new InputArgument('name', InputArgument::OPTIONAL))));
357+
$this->assertEquals(array('foo' => null), $input->getOptions(), '->parse() parses optional options with empty value as null');
358+
$this->assertEquals(array('name' => 'bar'), $input->getArguments(), '->parse() parses optional arguments');
359+
360+
$input = new ArgvInput(array('cli.php', '--foo=0', 'bar'));
361+
$input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::VALUE_OPTIONAL), new InputArgument('name', InputArgument::OPTIONAL))));
362+
$this->assertEquals(array('foo' => '0'), $input->getOptions(), '->parse() parses optional options with empty value as null');
363+
$this->assertEquals(array('name' => 'bar'), $input->getArguments(), '->parse() parses optional arguments');
364+
}
327365
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.