git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 5/5] parse-options: show negatability of options in short help

From
René Scharfe <l.s.r@web.de>
Date
Jul 24, 2023, 12:40 UTC
Message-ID
<eac754dd-0821-cfcb-7f6e-a00a76fde5b2@web.de>
In-Reply-To
<4d01e971-07cb-4f11-3cc6-9d9f21e590c1@web.de>

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>
---
 Documentation/git-rev-parse.txt    |  8 +++---
 contrib/subtree/t/t7900-subtree.sh |  2 +-
 parse-options.c                    | 10 +++++--
 t/t0040-parse-options.sh           | 44 ++++++++++++++++--------------
 t/t1502-rev-parse-parseopt.sh      |  2 +-
 t/t1502/optionspec-neg.help        |  4 +--
 t/t1502/optionspec.help            | 35 ++++++++++++++----------
 7 files changed, 60 insertions(+), 45 deletions(-)
diff --git a/Documentation/git-rev-parse.txt b/Documentation/git-rev-parse.txt
index 6e8ff9ace1..6a4968f68a 100644
--- a/Documentation/git-rev-parse.txt
+++ b/Documentation/git-rev-parse.txt
@@ -424,10 +424,10 @@ 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
-    --baz <arg>           another cool option --baz with a named argument
-    --qux[=<path>]        qux may take a path argument but has meaning by itself
+    --[no-]foo            some nifty option --foo
+    --[no-]bar ...        some cool option --bar with an argument
+    --[no-]baz <arg>      another cool option --baz with a named argument
+    --[no-]qux[=<path>]   qux may take a path argument but has meaning by itself

 An option group Header
     -C[...]               option C with an optional argument
diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh
index 341c169eca..49a21dd7c9 100755
--- a/contrib/subtree/t/t7900-subtree.sh
+++ b/contrib/subtree/t/t7900-subtree.sh
@@ -71,7 +71,7 @@ test_expect_success 'shows short help text for -h' '
 	test_expect_code 129 git subtree -h >out 2>err &&
 	test_must_be_empty err &&
 	grep -e "^ *or: git subtree pull" out &&
-	grep -e --annotate out
+	grep -F -e "--[no-]annotate" out
 '

 #
diff --git a/parse-options.c b/parse-options.c
index f8a155ee13..6323ca191d 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -1136,8 +1136,14 @@ static enum parse_opt_result usage_with_options_internal(struct parse_opt_ctx_t
 		}
 		if (opts->long_name && opts->short_name)
 			pos += fprintf(outfile, ", ");
-		if (opts->long_name)
-			pos += fprintf(outfile, "--%s", opts->long_name);
+		if (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)
 			pos += utf8_fprintf(outfile, _("-NUM"));

diff --git a/t/t0040-parse-options.sh b/t/t0040-parse-options.sh
index 7d7ecfd571..f39758d2ef 100755
--- a/t/t0040-parse-options.sh
+++ b/t/t0040-parse-options.sh
@@ -13,29 +13,32 @@ usage: test-tool parse-options <options>

     A helper function for the parse-options API.

-    --yes                 get a boolean
-    -D, --no-doubt        begins with 'no-'
+    --[no-]yes            get a boolean
+    -D, --[no-]no-doubt   begins with 'no-'
     -B, --no-fear         be brave
-    -b, --boolean         increment by one
-    -4, --or4             bitwise-or boolean with ...0100
-    --neg-or4             same as --no-or4
+    -b, --[no-]boolean    increment by one
+    -4, --[no-]or4        bitwise-or boolean with ...0100
+    --[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
     -m, --magnitude <n>   get a magnitude
-    --set23               set integer to 23
+    --[no-]set23          set integer to 23
     --mode1               set integer to 1 (cmdmode option)
     --mode2               set integer to 2 (cmdmode option)
-    -L, --length <str>    get length of <str>
-    -F, --file <file>     set file to <file>
+    -L, --[no-]length <str>
+                          get length of <str>
+    -F, --[no-]file <file>
+                          set file to <file>

 String options
-    -s, --string <string>
+    -s, --[no-]string <string>
                           get a string
-    --string2 <str>       get another 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
-    --list <str>          add str to list
+    --[no-]list <str>     add str to list

 Magic arguments
     -NUM                  set integer to NUM
@@ -44,16 +47,17 @@ Magic arguments
     --no-ambiguous        negative ambiguity

 Standard options
-    --abbrev[=<n>]        use <n> digits to display object names
-    -v, --verbose         be verbose
-    -n, --dry-run         dry run
-    -q, --quiet           be quiet
-    --expect <string>     expected output in the variable dump
+    --[no-]abbrev[=<n>]   use <n> digits to display object names
+    -v, --[no-]verbose    be verbose
+    -n, --[no-]dry-run    dry run
+    -q, --[no-]quiet      be quiet
+    --[no-]expect <string>
+                          expected output in the variable dump

 Alias
-    -A, --alias-source <string>
+    -A, --[no-]alias-source <string>
                           get a string
-    -Z, --alias-target <string>
+    -Z, --[no-]alias-target <string>
                           alias of --alias-source

 EOF
diff --git a/t/t1502-rev-parse-parseopt.sh b/t/t1502-rev-parse-parseopt.sh
index 0f7c2db4c0..f0737593c3 100755
--- a/t/t1502-rev-parse-parseopt.sh
+++ b/t/t1502-rev-parse-parseopt.sh
@@ -111,7 +111,7 @@ test_expect_success 'test --parseopt help-all output hidden switches' '
 |
 |    some-command does foo and bar!
 |
-|    --hidden1             A hidden switch
+|    --[no-]hidden1        A hidden switch
 |
 |EOF
 END_EXPECT
diff --git a/t/t1502/optionspec-neg.help b/t/t1502/optionspec-neg.help
index 591f4dcd9f..156e5f0ed9 100644
--- a/t/t1502/optionspec-neg.help
+++ b/t/t1502/optionspec-neg.help
@@ -3,8 +3,8 @@ usage: some-command [options] <args>...

     some-command does foo and bar!

-    --foo                 can be negated
-    --no-bar              can be positivated
+    --[no-]foo            can be negated
+    --[no-]no-bar         can be positivated
     --positive-only       cannot be negated
     --no-negative         cannot be positivated

diff --git a/t/t1502/optionspec.help b/t/t1502/optionspec.help
index 844eac6704..64e8ce9f98 100755
--- a/t/t1502/optionspec.help
+++ b/t/t1502/optionspec.help
@@ -4,31 +4,36 @@ 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
+    --[no-]foo            some nifty option --foo
+    --[no-]bar ...        some cool option --bar with an argument
+    -b, --[no-]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
+    -d, --[no-]data[=...]
+                          short and long option with an optional argument

 Argument hints
     -B <arg>              short option required argument
-    --bar2 <arg>          long option required argument
-    -e, --fuz <with-space>
+    --[no-]bar2 <arg>     long option required argument
+    -e, --[no-]fuz <with-space>
                           short and long option required argument
     -s[<some>]            short option optional argument
-    --long[=<data>]       long option optional argument
-    -g, --fluf[=<path>]   short and long option optional argument
-    --longest <very-long-argument-hint>
+    --[no-]long[=<data>]  long option optional argument
+    -g, --[no-]fluf[=<path>]
+                          short and long option optional argument
+    --[no-]longest <very-long-argument-hint>
                           a very long argument hint
-    --pair <key=value>    with an equals sign in the hint
-    --aswitch             help te=t contains? fl*g characters!`
-    --bswitch <hint>      hint has trailing tab character
-    --cswitch             switch has trailing tab character
-    --short-hint <a>      with a one symbol hint
+    --[no-]pair <key=value>
+                          with an equals sign in the hint
+    --[no-]aswitch        help te=t contains? fl*g characters!`
+    --[no-]bswitch <hint>
+                          hint has trailing tab character
+    --[no-]cswitch        switch has trailing tab character
+    --[no-]short-hint <a>
+                          with a one symbol hint

 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
--
2.41.0
Previous: René ScharfeNext: René Scharfe
Message 26 of 66 in “ls-tree: fix --no-full-name”
  1. ls-tree: fix --no-full-nameRené Scharfe, Jul 18, 2023
  2. Junio C HamanoJul 18, 2023
  3. Junio C HamanoJul 18, 2023
  4. René ScharfeJul 21, 2023
  5. René ScharfeJul 21, 2023
  6. Junio C HamanoJul 21, 2023
  7. René ScharfeJul 21, 2023
  8. Junio C HamanoJul 21, 2023
  9. Junio C HamanoJul 21, 2023
  10. René ScharfeJul 24, 2023
  11. Junio C HamanoJul 24, 2023
  12. René ScharfeJul 24, 2023
  13. Junio C HamanoJul 24, 2023
  14. René ScharfeJul 28, 2023
  15. Phillip WoodJul 28, 2023
  16. René ScharfeJul 29, 2023
  17. Junio C HamanoJul 31, 2023
  18. Junio C HamanoAug 4, 2023
  19. Phillip WoodAug 4, 2023
  20. René ScharfeAug 5, 2023
  21. 0/5 show negatability of options in short helpRené Scharfe, Jul 24, 2023
  22. 1/5 subtree: disallow --no-{help,quiet,debug,branch,message}René Scharfe, Jul 24, 2023
  23. 2/5 t1502, docs: disallow --no-helpRené Scharfe, Jul 24, 2023
  24. 3/5 t1502: move optionspec help output to a fileRené Scharfe, Jul 24, 2023
  25. 4/5 t1502: test option negationRené Scharfe, Jul 24, 2023
  26. 5/5 parse-options: show negatability of options in short helpRené Scharfe, Jul 24, 2023
  27. 0/8 show negatability of options in short helpRené Scharfe, Aug 5, 2023
  28. 1/8 subtree: disallow --no-{help,quiet,debug,branch,message}René Scharfe, Aug 5, 2023
  29. 2/8 t1502, docs: disallow --no-helpRené Scharfe, Aug 5, 2023
  30. 3/8 t1502: move optionspec help output to a fileRené Scharfe, Aug 5, 2023
  31. 4/8 t1502: test option negationRené Scharfe, Aug 5, 2023
  32. 5/8 parse-options: show negatability of options in short helpRené Scharfe, Aug 5, 2023
  33. 6/8 parse-options: factor out usage_indent() and usage_padding()René Scharfe, Aug 5, 2023
  34. 7/8 parse-options: no --[no-]no-...René Scharfe, Aug 5, 2023
  35. 8/8 parse-options: simplify usage_padding()René Scharfe, Aug 5, 2023
  36. Junio C HamanoAug 5, 2023
  37. show-branch: fix --no-sparseRené Scharfe, Jul 21, 2023
  38. Junio C HamanoJul 21, 2023
  39. René ScharfeJul 21, 2023
  40. show-branch: disallow --no-{date,topo}-orderRené Scharfe, Jul 21, 2023
  41. reset: disallow --no-{mixed,soft,hard,merge,keep}René Scharfe, Jul 21, 2023
  42. pack-objects: fix --no-quietRené Scharfe, Jul 21, 2023
  43. pack-objects: fix --no-keep-true-parentsRené Scharfe, Jul 21, 2023
  44. Junio C HamanoJul 21, 2023
  45. branch: disallow --no-{all,remotes}René Scharfe, Jul 21, 2023
  46. am: unify definition of --keep-cr and --no-keep-crRené Scharfe, Jul 21, 2023
  47. describe: fix --no-exact-matchRené Scharfe, Jul 21, 2023
  48. Junio C HamanoJul 21, 2023
  49. Junio C HamanoJul 21, 2023
  50. Jeff KingAug 8, 2023
  51. Jeff KingAug 8, 2023
  52. Junio C HamanoAug 9, 2023
  53. Jeff KingAug 9, 2023
  54. René ScharfeAug 9, 2023
  55. Junio C HamanoAug 9, 2023
  56. Jeff KingAug 10, 2023
  57. Junio C HamanoAug 10, 2023
  58. René ScharfeAug 10, 2023
  59. Jeff KingAug 10, 2023
  60. René ScharfeAug 10, 2023
  61. Jeff KingAug 11, 2023
  62. René ScharfeAug 11, 2023
  63. Jeff KingAug 11, 2023
  64. René ScharfeAug 12, 2023
  65. Jeff KingAug 11, 2023
  66. René ScharfeAug 11, 2023

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.