parse-options: show negatability of options in short help

Add a "[no-]" prefix to options without the flag PARSE_OPT_NONEG to
document the fact that you can negate them.

This looks a bit strange for options that already start with "no-", e.g.
for the option --no-name of git show-branch:

    --[no-]no-name        suppress naming strings

You can actually use --no-no-name as an alias of --name, so the short
help is not wrong.  If we strip off any of the "no-"s, we lose either
the ability to see if the remaining one belongs to the documented
variant or to see if it can be negated.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
René Scharfe
2023-08-05 16:40:59 +02:00
committed by Junio C Hamano
parent d5dc68f730
commit e8e5d294dc
7 changed files with 58 additions and 45 deletions

View File

@ -424,10 +424,10 @@ usage: some-command [<options>] <args>...
some-command does foo and bar! some-command does foo and bar!
-h, --help show the help -h, --help show the help
--foo some nifty option --foo --[no-]foo some nifty option --foo
--bar ... some cool option --bar with an argument --[no-]bar ... some cool option --bar with an argument
--baz <arg> another cool option --baz with a named argument --[no-]baz <arg> another cool option --baz with a named argument
--qux[=<path>] qux may take a path argument but has meaning by itself --[no-]qux[=<path>] qux may take a path argument but has meaning by itself
An option group Header An option group Header
-C[...] option C with an optional argument -C[...] option C with an optional argument

View File

@ -71,7 +71,7 @@ test_expect_success 'shows short help text for -h' '
test_expect_code 129 git subtree -h >out 2>err && test_expect_code 129 git subtree -h >out 2>err &&
test_must_be_empty err && test_must_be_empty err &&
grep -e "^ *or: git subtree pull" out && grep -e "^ *or: git subtree pull" out &&
grep -e --annotate out grep -F -e "--[no-]annotate" out
' '
# #

View File

@ -1137,8 +1137,14 @@ static enum parse_opt_result usage_with_options_internal(struct parse_opt_ctx_t
} }
if (opts->long_name && opts->short_name) if (opts->long_name && opts->short_name)
pos += fprintf(outfile, ", "); pos += fprintf(outfile, ", ");
if (opts->long_name) if (opts->long_name) {
pos += fprintf(outfile, "--%s", opts->long_name); const char *long_name = opts->long_name;
if (opts->flags & PARSE_OPT_NONEG)
pos += fprintf(outfile, "--%s", long_name);
else
pos += fprintf(outfile, "--[no-]%s", long_name);
}
if (opts->type == OPTION_NUMBER) if (opts->type == OPTION_NUMBER)
pos += utf8_fprintf(outfile, _("-NUM")); pos += utf8_fprintf(outfile, _("-NUM"));

View File

@ -13,30 +13,34 @@ usage: test-tool parse-options <options>
A helper function for the parse-options API. A helper function for the parse-options API.
--yes get a boolean --[no-]yes get a boolean
-D, --no-doubt begins with 'no-' -D, --[no-]no-doubt begins with 'no-'
-B, --no-fear be brave -B, --no-fear be brave
-b, --boolean increment by one -b, --[no-]boolean increment by one
-4, --or4 bitwise-or boolean with ...0100 -4, --[no-]or4 bitwise-or boolean with ...0100
--neg-or4 same as --no-or4 --[no-]neg-or4 same as --no-or4
-i, --integer <n> get a integer -i, --[no-]integer <n>
get a integer
-j <n> get a integer, too -j <n> get a integer, too
-m, --magnitude <n> get a magnitude -m, --magnitude <n> get a magnitude
--set23 set integer to 23 --[no-]set23 set integer to 23
--mode1 set integer to 1 (cmdmode option) --mode1 set integer to 1 (cmdmode option)
--mode2 set integer to 2 (cmdmode option) --mode2 set integer to 2 (cmdmode option)
-L, --length <str> get length of <str> -L, --[no-]length <str>
-F, --file <file> set file to <file> get length of <str>
-F, --[no-]file <file>
set file to <file>
String options String options
-s, --string <string> get a string -s, --[no-]string <string>
--string2 <str> get another string get a string
--st <st> get another string (pervert ordering) --[no-]string2 <str> get another string
--[no-]st <st> get another string (pervert ordering)
-o <str> get another string -o <str> get another string
--longhelp help text of this entry --longhelp help text of this entry
spans multiple lines spans multiple lines
--list <str> add str to list --[no-]list <str> add str to list
Magic arguments Magic arguments
-NUM set integer to NUM -NUM set integer to NUM
@ -45,16 +49,17 @@ Magic arguments
--no-ambiguous negative ambiguity --no-ambiguous negative ambiguity
Standard options Standard options
--abbrev[=<n>] use <n> digits to display object names --[no-]abbrev[=<n>] use <n> digits to display object names
-v, --verbose be verbose -v, --[no-]verbose be verbose
-n, --dry-run dry run -n, --[no-]dry-run dry run
-q, --quiet be quiet -q, --[no-]quiet be quiet
--expect <string> expected output in the variable dump --[no-]expect <string>
expected output in the variable dump
Alias Alias
-A, --alias-source <string> -A, --[no-]alias-source <string>
get a string get a string
-Z, --alias-target <string> -Z, --[no-]alias-target <string>
alias of --alias-source alias of --alias-source
EOF EOF

View File

@ -111,7 +111,7 @@ test_expect_success 'test --parseopt help-all output hidden switches' '
| |
| some-command does foo and bar! | some-command does foo and bar!
| |
| --hidden1 A hidden switch | --[no-]hidden1 A hidden switch
| |
|EOF |EOF
END_EXPECT END_EXPECT

View File

@ -3,8 +3,8 @@ usage: some-command [options] <args>...
some-command does foo and bar! some-command does foo and bar!
--foo can be negated --[no-]foo can be negated
--no-bar can be positivated --[no-]no-bar can be positivated
--positive-only cannot be negated --positive-only cannot be negated
--no-negative cannot be positivated --no-negative cannot be positivated

View File

@ -4,31 +4,33 @@ usage: some-command [options] <args>...
some-command does foo and bar! some-command does foo and bar!
-h, --help show the help -h, --help show the help
--foo some nifty option --foo --[no-]foo some nifty option --foo
--bar ... some cool option --bar with an argument --[no-]bar ... some cool option --bar with an argument
-b, --baz a short and long option -b, --[no-]baz a short and long option
An option group Header An option group Header
-C[...] option C with an optional argument -C[...] option C with an optional argument
-d, --data[=...] short and long option with an optional argument -d, --[no-]data[=...] short and long option with an optional argument
Argument hints Argument hints
-B <arg> short option required argument -B <arg> short option required argument
--bar2 <arg> long option required argument --[no-]bar2 <arg> long option required argument
-e, --fuz <with-space> -e, --[no-]fuz <with-space>
short and long option required argument short and long option required argument
-s[<some>] short option optional argument -s[<some>] short option optional argument
--long[=<data>] long option optional argument --[no-]long[=<data>] long option optional argument
-g, --fluf[=<path>] short and long option optional argument -g, --[no-]fluf[=<path>]
--longest <very-long-argument-hint> short and long option optional argument
--[no-]longest <very-long-argument-hint>
a very long argument hint a very long argument hint
--pair <key=value> with an equals sign in the hint --[no-]pair <key=value>
--aswitch help te=t contains? fl*g characters!` with an equals sign in the hint
--bswitch <hint> hint has trailing tab character --[no-]aswitch help te=t contains? fl*g characters!`
--cswitch switch has trailing tab character --[no-]bswitch <hint> hint has trailing tab character
--short-hint <a> with a one symbol hint --[no-]cswitch switch has trailing tab character
--[no-]short-hint <a> with a one symbol hint
Extras Extras
--extra1 line above used to cause a segfault but no longer does --[no-]extra1 line above used to cause a segfault but no longer does
EOF EOF