f8c872127d
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>
139 lines
3.7 KiB
Bash
Executable File
139 lines
3.7 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
test_description='test git rev-parse --parseopt'
|
|
. ./test-lib.sh
|
|
|
|
cat > expect <<\END_EXPECT
|
|
cat <<\EOF
|
|
usage: some-command [options] <args>...
|
|
|
|
some-command does foo and bar!
|
|
|
|
-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
|
|
|
|
EOF
|
|
END_EXPECT
|
|
|
|
cat > optionspec << EOF
|
|
some-command [options] <args>...
|
|
|
|
some-command does foo and bar!
|
|
--
|
|
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
|
|
EOF
|
|
|
|
test_expect_success 'test --parseopt help output' '
|
|
test_expect_code 129 git rev-parse --parseopt -- -h > output < optionspec &&
|
|
test_i18ncmp expect output
|
|
'
|
|
|
|
cat > expect <<EOF
|
|
set -- --foo --bar 'ham' -b -- 'arg'
|
|
EOF
|
|
|
|
test_expect_success 'test --parseopt' '
|
|
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 --baz < optionspec > output &&
|
|
test_cmp expect output
|
|
'
|
|
|
|
cat > expect <<EOF
|
|
set -- --foo -- 'arg' '--bar=ham'
|
|
EOF
|
|
|
|
test_expect_success 'test --parseopt with --' '
|
|
git rev-parse --parseopt -- --foo -- arg --bar=ham < optionspec > output &&
|
|
test_cmp expect output
|
|
'
|
|
|
|
test_expect_success 'test --parseopt --stop-at-non-option' '
|
|
git rev-parse --parseopt --stop-at-non-option -- --foo arg --bar=ham < optionspec > output &&
|
|
test_cmp expect output
|
|
'
|
|
|
|
cat > expect <<EOF
|
|
set -- --foo -- '--' 'arg' '--bar=ham'
|
|
EOF
|
|
|
|
test_expect_success 'test --parseopt --keep-dashdash' '
|
|
git rev-parse --parseopt --keep-dashdash -- --foo -- arg --bar=ham < optionspec > output &&
|
|
test_cmp expect output
|
|
'
|
|
|
|
cat >expect <<EOF
|
|
set -- --foo -- '--' 'arg' '--spam=ham'
|
|
EOF
|
|
|
|
test_expect_success 'test --parseopt --keep-dashdash --stop-at-non-option with --' '
|
|
git rev-parse --parseopt --keep-dashdash --stop-at-non-option -- --foo -- arg --spam=ham <optionspec >output &&
|
|
test_cmp expect output
|
|
'
|
|
|
|
cat > expect <<EOF
|
|
set -- --foo -- 'arg' '--spam=ham'
|
|
EOF
|
|
|
|
test_expect_success 'test --parseopt --keep-dashdash --stop-at-non-option without --' '
|
|
git rev-parse --parseopt --keep-dashdash --stop-at-non-option -- --foo arg --spam=ham <optionspec >output &&
|
|
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
|