rev-parse --parseopt: add the --stuck-long mode

Add the --stuck-long option to output the options in their long form
if available, and with their arguments stuck.

Contrary to the default form (non stuck arguments and short options),
this can be parsed unambiguously when using options with optional
arguments :

 - in the non stuck form, when an option is taking an optional argument
   you cannot know if the next argument is its optional argument, or the
   next option.

 - the long options form allows to differentiate between an empty argument
   '--option=' and an unset argument '--option', which is not possible
   with short options.

Signed-off-by: Nicolas Vigier <boklm@mars-attacks.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Nicolas Vigier
2013-10-31 12:08:29 +01:00
committed by Junio C Hamano
parent b0d12fc9b2
commit f8c872127d
3 changed files with 55 additions and 6 deletions

View File

@ -12,9 +12,11 @@ usage: some-command [options] <args>...
-h, --help show the help
--foo some nifty option --foo
--bar ... some cool option --bar with an argument
-b, --baz a short and long option
An option group Header
-C[...] option C with an optional argument
-d, --data[=...] short and long option with an optional argument
Extras
--extra1 line above used to cause a segfault but no longer does
@ -31,9 +33,11 @@ h,help show the help
foo some nifty option --foo
bar= some cool option --bar with an argument
b,baz a short and long option
An option group Header
C? option C with an optional argument
d,data? short and long option with an optional argument
Extras
extra1 line above used to cause a segfault but no longer does
@ -45,16 +49,16 @@ test_expect_success 'test --parseopt help output' '
'
cat > expect <<EOF
set -- --foo --bar 'ham' -- 'arg'
set -- --foo --bar 'ham' -b -- 'arg'
EOF
test_expect_success 'test --parseopt' '
git rev-parse --parseopt -- --foo --bar=ham arg < optionspec > output &&
git rev-parse --parseopt -- --foo --bar=ham --baz arg < optionspec > output &&
test_cmp expect output
'
test_expect_success 'test --parseopt with mixed options and arguments' '
git rev-parse --parseopt -- --foo arg --bar=ham < optionspec > output &&
git rev-parse --parseopt -- --foo arg --bar=ham --baz < optionspec > output &&
test_cmp expect output
'
@ -99,4 +103,36 @@ test_expect_success 'test --parseopt --keep-dashdash --stop-at-non-option withou
test_cmp expect output
'
cat > expect <<EOF
set -- --foo --bar='z' --baz -C'Z' --data='A' -- 'arg'
EOF
test_expect_success 'test --parseopt --stuck-long' '
git rev-parse --parseopt --stuck-long -- --foo --bar=z -b arg -CZ -dA <optionspec >output &&
test_cmp expect output
'
cat > expect <<EOF
set -- --data='' -C --baz -- 'arg'
EOF
test_expect_success 'test --parseopt --stuck-long and empty optional argument' '
git rev-parse --parseopt --stuck-long -- --data= arg -C -b <optionspec >output &&
test_cmp expect output
'
cat > expect <<EOF
set -- --data --baz -- 'arg'
EOF
test_expect_success 'test --parseopt --stuck-long and long option with unset optional argument' '
git rev-parse --parseopt --stuck-long -- --data arg -b <optionspec >output &&
test_cmp expect output
'
test_expect_success 'test --parseopt --stuck-long and short option with unset optional argument' '
git rev-parse --parseopt --stuck-long -- -d arg -b <optionspec >output &&
test_cmp expect output
'
test_done