Fix a trivial regression in 17b3e515050 (Merge branch
'nd/command-list' into nd/complete-config-vars, 2018-05-29) where we'd
overly whitespace pad "git help -g", since the codepath moved to a
function that assumed it needed to "\n\n"-pad multiple items being
emitted, so we'd print an extra leading newline when printing one
item (as opposed to "git help -a").
In doing so I wanted to add regression tests, and to do that we first
need to make the format stable ("git help -a" will change depending on
whatever git-* you have in $PATH).
These are things I noticed when re-rolling my no-yet-picked-up series
to move Documentation/technical/* to manpages[1]. An unsubmitted
re-roll of this series depends on this one. I'll hold off on a
re-submission of it until this series has graduated.
1. https://lore.kernel.org/git/cover-v2-0.5-00000000000-20211212T194047Z-avarab@gmail.com/
Ævar Arnfjörð Bjarmason (7):
help doc: add missing "]" to "[-a|--all]"
help.c: use puts() instead of printf{,_ln}() for consistency
help tests: test "git" and "git help [-a|-g] spacing
help.c: split up list_all_cmds_help() function
help: error if [-a|-g|-c] and [-i|-m|-w] are combined
help: add --no-[external-commands|aliases] for use with --all
help: don't print "\n" before single-section output
Documentation/git-help.txt | 12 ++++-
builtin/help.c | 34 ++++++++++++--
help.c | 37 ++++++++++++----
help.h | 2 +-
t/t0012-help.sh | 91 ++++++++++++++++++++++++++++++++++++++
5 files changed, 161 insertions(+), 15 deletions(-)
--
2.34.1.1257.g2af47340c7b
Add a missing "]" to documentation added in 63eae83f8f3 (help: add "-a
--verbose" to list all commands with synopsis, 2018-05-20). This made
it seem as though "--[no-]verbose" can only be provided with "--all",
not "-a". The corresponding usage information in the C
code ("builtin_help_usage") does not have the same problem.
Signed-off-by: Ævar Arnfjörð Bjarmason <redacted>
---
Documentation/git-help.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Change code in "help.c" that used printf_ln() without format
specifiers to use puts() instead, as other existing code in the file
does. Let's also change related code to use puts() instead of the
equivalent of calling "printf" with a "%s\n" format.
This formatting-only change will make a subsequent functional change
easier to read, as it'll be changing code that's consistently using
the same functions to do the same things.
Signed-off-by: Ævar Arnfjörð Bjarmason <redacted>
---
help.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
@@ -317,7 +318,7 @@ void list_commands(struct cmdnames *main_cmds, struct cmdnames *other_cmds)}if(other_cmds->cnt){-printf_ln(_("git commands available from elsewhere on your $PATH"));+puts(_("git commands available from elsewhere on your $PATH"));putchar('\n');pretty_print_cmdnames(other_cmds,colopts);putchar('\n');
@@ -439,7 +440,7 @@ void list_all_cmds_help(void)structcmdname_help*aliases;inti,longest;-printf_ln(_("See 'git help <command>' to read about a specific subcommand"));+puts(_("See 'git help <command>' to read about a specific subcommand"));print_cmd_by_category(main_categories,&longest);list_all_other_cmds(&others);
There's logic in "help.c"'s "print_cmd_by_category()" to emit "help"
output with particular spacing, which doesn't make much sense when
emitting only one section with "help -g".
Let's add tests for the current spacing in preparation for a
subsequent whitespace formatting fix, and make sure that that fix
doesn't cause regressions for the "git" and "git help" output.
Signed-off-by: Ævar Arnfjörð Bjarmason <redacted>
---
t/t0012-help.sh | 45 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 45 insertions(+)
Split up the listing of commands and aliases from
list_all_cmds_help(). This will make a subsequent functional change
smaller.
Signed-off-by: Ævar Arnfjörð Bjarmason <redacted>
---
help.c | 27 ++++++++++++++++++++-------
1 file changed, 20 insertions(+), 7 deletions(-)
@@ -433,15 +433,10 @@ static int get_alias(const char *var, const char *value, void *data)return0;}-voidlist_all_cmds_help(void)+staticvoidlist_all_cmds_help_external_commands(void){structstring_listothers=STRING_LIST_INIT_DUP;-structstring_listalias_list=STRING_LIST_INIT_DUP;-structcmdname_help*aliases;-inti,longest;--puts(_("See 'git help <command>' to read about a specific subcommand"));-print_cmd_by_category(main_categories,&longest);+inti;list_all_other_cmds(&others);if(others.nr)
@@ -474,6 +476,17 @@ void list_all_cmds_help(void)string_list_clear(&alias_list,1);}+voidlist_all_cmds_help(void)+{+intlongest;++puts(_("See 'git help <command>' to read about a specific subcommand"));+print_cmd_by_category(main_categories,&longest);++list_all_cmds_help_external_commands();+list_all_cmds_help_aliases(longest);+}+intis_in_cmdlist(structcmdnames*c,constchar*s){inti;
Add more sanity checking to "git help" usage by erroring out if these
man viewer options are combined with incompatible command-modes that
will never use these documentation viewers.
This continues the work started in d35d03cf93e (help: simplify by
moving to OPT_CMDMODE(), 2021-09-22) of adding more sanity checking to
"git help". Doing this allows us to clarify the "SYNOPSIS" in the
documentation, and the "git help -h" output.
Signed-off-by: Ævar Arnfjörð Bjarmason <redacted>
---
Documentation/git-help.txt | 2 +-
builtin/help.c | 20 ++++++++++++++++++--
t/t0012-help.sh | 10 ++++++++++
3 files changed, 29 insertions(+), 3 deletions(-)
@@ -605,19 +613,27 @@ int cmd_help(int argc, const char **argv, const char *prefix)break;caseHELP_ACTION_GUIDES:no_extra_argc(argc);+no_format();+list_guides_help();printf("%s\n",_(git_more_info_string));return0;caseHELP_ACTION_CONFIG_FOR_COMPLETION:no_extra_argc(argc);+no_format();+list_config_help(SHOW_CONFIG_VARS);return0;caseHELP_ACTION_CONFIG_SECTIONS_FOR_COMPLETION:no_extra_argc(argc);+no_format();+list_config_help(SHOW_CONFIG_SECTIONS);return0;caseHELP_ACTION_CONFIG:no_extra_argc(argc);+no_format();+setup_pager();list_config_help(SHOW_CONFIG_HUMAN);printf("\n%s\n",_("'git help config' for more information"));
@@ -46,6 +46,16 @@ test_expect_success 'invalid usage' 'test_expect_code129githelp--config-sections-for-completionadd'+foroptin'-a''-g''-c''--config-for-completion''--config-sections-for-completion'+do+test_expect_success"invalid usage of '$opt' with [-i|-m|-w]"'+githelp$opt&&+test_expect_code129githelp$opt-i&&+test_expect_code129githelp$opt-m&&+test_expect_code129githelp$opt-w+'+done+ test_expect_success"works for commands and guides by default"'configure_help&&githelpstatus&&
Add the ability to only emit git's own usage information under
--all. This also allows us to extend the "test_section_spacing" tests
added in a preceding commit to test "git help --all"
output.
Previously we could not do that, as the tests might find a git-*
command in the "$PATH", which would make the output differ from one
setup to another.
Signed-off-by: Ævar Arnfjörð Bjarmason <redacted>
---
Documentation/git-help.txt | 10 +++++++++-
builtin/help.c | 16 ++++++++++++++--
help.c | 8 +++++---
help.h | 2 +-
t/t0012-help.sh | 37 +++++++++++++++++++++++++++++++++++++
5 files changed, 66 insertions(+), 7 deletions(-)
@@ -49,6 +49,14 @@ OPTIONS Prints all the available commands on the standard output. This option overrides any given command or guide name.+--no-external-commands::+ When used with `--all`, exclude the listing of external "git-*"+ commands found in the `$PATH`.++--no-aliases::+ When used with `--all`, exclude the listing of configured+ aliases.+ --verbose:: When used with `--all` print description for all recognized commands. This is the default.
@@ -51,9 +51,14 @@ static const char *html_path;staticintverbose=1;staticenumhelp_formathelp_format=HELP_FORMAT_NONE;staticintexclude_guides;+staticintshow_external_commands=-1;+staticintshow_aliases=-1;staticstructoptionbuiltin_help_options[]={OPT_CMDMODE('a',"all",&cmd_mode,N_("print all available commands"),HELP_ACTION_ALL),+OPT_BOOL(0,"external-commands",&show_external_commands,+N_("show external commands in --all?")),+OPT_BOOL(0,"aliases",&show_aliases,N_("show aliases in --all?")),OPT_HIDDEN_BOOL(0,"exclude-guides",&exclude_guides,N_("exclude guides")),OPT_SET_INT('m',"man",&help_format,N_("show man page"),HELP_FORMAT_MAN),OPT_SET_INT('w',"web",&help_format,N_("show manual in web browser"),
@@ -75,7 +80,7 @@ static struct option builtin_help_options[] = {};staticconstchar*constbuiltin_help_usage[]={-N_("git help [-a|--all] [--[no-]verbose]]"),+N_("git help [-a|--all] [--[no-]verbose]] [--[no-](external-commands|aliases)]"),N_("git help [[-i|--info] [-m|--man] [-w|--web]] [<command>]"),N_("git help [-g|--guides]"),N_("git help [-c|--config]"),
@@ -598,12 +603,19 @@ int cmd_help(int argc, const char **argv, const char *prefix)builtin_help_usage,0);parsed_help_format=help_format;+if(cmd_mode!=HELP_ACTION_ALL&&+(show_external_commands>=0||+show_aliases>=0))+usage_msg_opt(_("the '--no-[external-commands|aliases]' options can only be used with '--all'"),+builtin_help_usage,builtin_help_options);+switch(cmd_mode){caseHELP_ACTION_ALL:no_format();if(verbose){setup_pager();-list_all_cmds_help();+list_all_cmds_help(show_external_commands,+show_aliases);return0;}printf(_("usage: %s%s"),_(git_usage_string),"\n\n");
@@ -476,15 +476,17 @@ static void list_all_cmds_help_aliases(int longest)string_list_clear(&alias_list,1);}-voidlist_all_cmds_help(void)+voidlist_all_cmds_help(intshow_external_commands,intshow_aliases){intlongest;puts(_("See 'git help <command>' to read about a specific subcommand"));print_cmd_by_category(main_categories,&longest);-list_all_cmds_help_external_commands();-list_all_cmds_help_aliases(longest);+if(show_external_commands)+list_all_cmds_help_external_commands();+if(show_aliases)+list_all_cmds_help_aliases(longest);}intis_in_cmdlist(structcmdnames*c,constchar*s)
@@ -54,6 +54,19 @@ dotest_expect_code129githelp$opt-m&&test_expect_code129githelp$opt-w'++iftest"$opt"="-a"+then+continue+fi++test_expect_success"invalid usage of '$opt' with --no-external-commands"'+test_expect_code129githelp$opt--no-external-commands+'++test_expect_success"invalid usage of '$opt' with --no-aliases"'+test_expect_code129githelp$opt--no-external-commands+'done test_expect_success"works for commands and guides by default"'
@@ -184,6 +197,30 @@ do'done+test_expect_success"'git help -a' section spacing"'+test_section_spacing\+githelp-a--no-external-commands--no-aliases<<-\EOF&&+See'\''git help <command>'\''toreadaboutaspecificsubcommand++MainPorcelainCommands++AncillaryCommands/Manipulators++AncillaryCommands/Interrogators++InteractingwithOthers++Low-levelCommands/Manipulators++Low-levelCommands/Interrogators++Low-levelCommands/SyncingRepositories++Low-levelCommands/InternalHelpers+EOF+test_cmpexpectactual+'+ test_expect_success"'git help -g' section spacing"'test_section_spacing_trailergithelp-g<<-\EOF&&
Fix a formatting regression in 1b81d8cb19d (help: use command-list.txt
for the source of guides, 2018-05-20). Adjust the output of "git help
--guides" and any other future single-section commands so that a
newline isn't inserted before the only section being printed.
This changes the output from:
$ git help --guides
The Git concept guides are:
[...]
To:
$ git help --guides
The Git concept guides are:
[...]
That we started printing an extra "\n" in 1b81d8cb19d wasn't intended,
but an emergent effect of moving all of the printing of "git help"
output to code that was ready to handle printing N sections.
With 1b81d8cb19d we started using the "print_cmd_by_category()"
function added earlier in the same series, or in cfb22a02ab5 (help:
use command-list.h for common command list, 2018-05-10).
Fixing this formatting nit is easy enough. Let's have all of the
output that would like to be "\n"-separated from other lines emit its
own "\n". We then adjust "print_cmd_by_category()" to only print a
"\n" to delimit the sections it's printing out.
Signed-off-by: Ævar Arnfjörð Bjarmason <redacted>
---
help.c | 5 ++++-
t/t0012-help.sh | 1 -
2 files changed, 4 insertions(+), 2 deletions(-)
@@ -328,6 +329,7 @@ void list_commands(struct cmdnames *main_cmds, struct cmdnames *other_cmds)voidlist_common_cmds_help(void){puts(_("These are common Git commands used in various situations:"));+putchar('\n');print_cmd_by_category(common_categories,NULL);}
@@ -481,6 +483,7 @@ void list_all_cmds_help(int show_external_commands, int show_aliases)intlongest;puts(_("See 'git help <command>' to read about a specific subcommand"));+putchar('\n');print_cmd_by_category(main_categories,&longest);if(show_external_commands)
From: Eric Sunshine <hidden> Date: 2021-12-28 16:18:15
On Tue, Dec 28, 2021 at 10:36 AM Ævar Arnfjörð Bjarmason
[off-list ref] wrote:
quoted hunk
Add more sanity checking to "git help" usage by erroring out if these
man viewer options are combined with incompatible command-modes that
will never use these documentation viewers.
This continues the work started in d35d03cf93e (help: simplify by
moving to OPT_CMDMODE(), 2021-09-22) of adding more sanity checking to
"git help". Doing this allows us to clarify the "SYNOPSIS" in the
documentation, and the "git help -h" output.
Signed-off-by: Ævar Arnfjörð Bjarmason <redacted>
---
diff --git a/builtin/help.c b/builtin/help.c
@@ -581,6 +581,13 @@ static void no_extra_argc(int argc)+static void no_format(void)+{+ if (help_format != HELP_FORMAT_NONE)+ usage_msg_opt(_("[-a|--all] cannot be combined with [[-i|--info] [-m|--man] [-w|--web]]"),+ builtin_help_usage, builtin_help_options);+}
Nit: The square brackets in the message may be unnecessarily
confusing. (Indeed, what exactly do they mean in this context?) Also,
the short options may not add much value: the user who typed `-w`
knows presumably that it is shorthand for `--web`. So, one
simplification would be:
'--all' cannot be combined with '--info', '--man', or '--web'
From: Eric Sunshine <hidden> Date: 2021-12-28 16:28:27
On Tue, Dec 28, 2021 at 10:36 AM Ævar Arnfjörð Bjarmason
[off-list ref] wrote:
quoted hunk
Add the ability to only emit git's own usage information under
--all. This also allows us to extend the "test_section_spacing" tests
added in a preceding commit to test "git help --all"
output.
Previously we could not do that, as the tests might find a git-*
command in the "$PATH", which would make the output differ from one
setup to another.
Signed-off-by: Ævar Arnfjörð Bjarmason <redacted>
---
@@ -8,7 +8,7 @@ git-help - Display help information about Git-'git help' [-a|--all] [--[no-]verbose]+'git help' [-a|--all] [--[no-]verbose] [--[no-](external-commands|aliases)]
Are these two new options mutually exclusive as this synopsis line
seems to indicate? Glancing at the code, it looks like they can be
used together. So, perhaps the synopsis should just say:
'git help' [-a|--all] [--[no-]verbose] [--[no-]external-commands]
[--[no-]aliases]
quoted hunk
diff --git a/builtin/help.c b/builtin/help.c
@@ -51,9 +51,14 @@ static const char *html_path; OPT_CMDMODE('a', "all", &cmd_mode, N_("print all available commands"), HELP_ACTION_ALL),+ OPT_BOOL(0, "external-commands", &show_external_commands,+ N_("show external commands in --all?")),+ OPT_BOOL(0, "aliases", &show_aliases, N_("show aliases in --all?")), OPT_HIDDEN_BOOL(0, "exclude-guides", &exclude_guides, N_("exclude guides")),
Nit: I don't see question marks on any of the existing options. It's
not clear what purpose they serve here.
On Tue, Dec 28, 2021 at 10:36 AM Ævar Arnfjörð Bjarmason
[off-list ref] wrote:
quoted
Add more sanity checking to "git help" usage by erroring out if these
man viewer options are combined with incompatible command-modes that
will never use these documentation viewers.
This continues the work started in d35d03cf93e (help: simplify by
moving to OPT_CMDMODE(), 2021-09-22) of adding more sanity checking to
"git help". Doing this allows us to clarify the "SYNOPSIS" in the
documentation, and the "git help -h" output.
Signed-off-by: Ævar Arnfjörð Bjarmason <redacted>
---
diff --git a/builtin/help.c b/builtin/help.c
@@ -581,6 +581,13 @@ static void no_extra_argc(int argc)+static void no_format(void)+{+ if (help_format != HELP_FORMAT_NONE)+ usage_msg_opt(_("[-a|--all] cannot be combined with [[-i|--info] [-m|--man] [-w|--web]]"),+ builtin_help_usage, builtin_help_options);+}
Nit: The square brackets in the message may be unnecessarily
confusing. (Indeed, what exactly do they mean in this context?) Also,
the short options may not add much value: the user who typed `-w`
knows presumably that it is shorthand for `--web`. So, one
simplification would be:
'--all' cannot be combined with '--info', '--man', or '--web'
A late re-roll of [1] which addresses all the comments Eric Sunshine
raised, thanks for the review, and sorry the v2 took so long!
As the range-diff shows the main change is a mid-series set of changes
to sanity check more "git help <opts>" incompaitibilities. The
SYNOPSIS issues etc. Eric noted have also been fixed.
1. https://lore.kernel.org/git/cover-0.7-00000000000-20211228T153456Z-avarab@gmail.com/
Ævar Arnfjörð Bjarmason (9):
help doc: add missing "]" to "[-a|--all]"
help.c: use puts() instead of printf{,_ln}() for consistency
help tests: test "git" and "git help [-a|-g] spacing
help.c: split up list_all_cmds_help() function
help: note the option name on option incompatibility
help: correct usage & behavior of "git help --all"
help: error if [-a|-g|-c] and [-i|-m|-w] are combined
help: add --no-[external-commands|aliases] for use with --all
help: don't print "\n" before single-section output
Documentation/git-help.txt | 15 ++++--
builtin/help.c | 63 +++++++++++++++++++++----
help.c | 37 +++++++++++----
help.h | 2 +-
t/t0012-help.sh | 94 ++++++++++++++++++++++++++++++++++++++
5 files changed, 187 insertions(+), 24 deletions(-)
Range-diff against v1:
1: 652dae26bf4 = 1: c4b66c36c17 help doc: add missing "]" to "[-a|--all]"
2: f84662469a3 = 2: 124643c4b35 help.c: use puts() instead of printf{,_ln}() for consistency
3: 3956937cf3b ! 3: 3e39116f197 help tests: test "git" and "git help [-a|-g] spacing
@@ t/t0012-help.sh: test_expect_success 'git help --config-sections-for-completion'
+'
+
test_expect_success 'generate builtin list' '
+ mkdir -p sub &&
git --list-cmds=builtins >builtins
- '
4: f040dd549b4 = 4: f9c4d5e2d28 help.c: split up list_all_cmds_help() function
5: 12ff152bd57 < -: ----------- help: error if [-a|-g|-c] and [-i|-m|-w] are combined
-: ----------- > 5: e5c49089106 help: note the option name on option incompatibility
-: ----------- > 6: 868e8a6cf83 help: correct usage & behavior of "git help --all"
-: ----------- > 7: 992ee6580ac help: error if [-a|-g|-c] and [-i|-m|-w] are combined
6: a5ef9f69530 ! 8: c81c0cbbcdb help: add --no-[external-commands|aliases] for use with --all
@@ Documentation/git-help.txt: git-help - Display help information about Git
--------
[verse]
-'git help' [-a|--all] [--[no-]verbose]
-+'git help' [-a|--all] [--[no-]verbose] [--[no-](external-commands|aliases)]
++'git help' [-a|--all] [--[no-]verbose] [--[no-]external-commands] [--[no-]aliases]
'git help' [[-i|--info] [-m|--man] [-w|--web]] [<command>|<guide>]
'git help' [-g|--guides]
'git help' [-c|--config]
@@ Documentation/git-help.txt: OPTIONS
- Prints all the available commands on the standard output. This
- option overrides any given command or guide name.
+ --all::
+ Prints all the available commands on the standard output.
+--no-external-commands::
+ When used with `--all`, exclude the listing of external "git-*"
@@ builtin/help.c: static const char *html_path;
OPT_CMDMODE('a', "all", &cmd_mode, N_("print all available commands"),
HELP_ACTION_ALL),
+ OPT_BOOL(0, "external-commands", &show_external_commands,
-+ N_("show external commands in --all?")),
-+ OPT_BOOL(0, "aliases", &show_aliases, N_("show aliases in --all?")),
++ N_("show external commands in --all")),
++ OPT_BOOL(0, "aliases", &show_aliases, N_("show aliases in --all")),
OPT_HIDDEN_BOOL(0, "exclude-guides", &exclude_guides, N_("exclude guides")),
OPT_SET_INT('m', "man", &help_format, N_("show man page"), HELP_FORMAT_MAN),
OPT_SET_INT('w', "web", &help_format, N_("show manual in web browser"),
@@ builtin/help.c: static struct option builtin_help_options[] = {
static const char * const builtin_help_usage[] = {
- N_("git help [-a|--all] [--[no-]verbose]]"),
-+ N_("git help [-a|--all] [--[no-]verbose]] [--[no-](external-commands|aliases)]"),
++ N_("git help [-a|--all] [--[no-]verbose]] [--[no-]external-commands] [--[no-]aliases]"),
N_("git help [[-i|--info] [-m|--man] [-w|--web]] [<command>]"),
N_("git help [-g|--guides]"),
N_("git help [-c|--config]"),
@@ builtin/help.c: int cmd_help(int argc, const char **argv, const char *prefix)
+
switch (cmd_mode) {
case HELP_ACTION_ALL:
- no_format();
+ opt_mode_usage(argc, "--all", help_format);
if (verbose) {
setup_pager();
- list_all_cmds_help();
7: 08fd12fe7b4 = 9: 08dc693dc3e help: don't print "\n" before single-section output
--
2.35.1.1132.ga1fe46f8690
Add a missing "]" to documentation added in 63eae83f8f3 (help: add "-a
--verbose" to list all commands with synopsis, 2018-05-20). This made
it seem as though "--[no-]verbose" can only be provided with "--all",
not "-a". The corresponding usage information in the C
code ("builtin_help_usage") does not have the same problem.
Signed-off-by: Ævar Arnfjörð Bjarmason <redacted>
---
Documentation/git-help.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Change code in "help.c" that used printf_ln() without format
specifiers to use puts() instead, as other existing code in the file
does. Let's also change related code to use puts() instead of the
equivalent of calling "printf" with a "%s\n" format.
This formatting-only change will make a subsequent functional change
easier to read, as it'll be changing code that's consistently using
the same functions to do the same things.
Signed-off-by: Ævar Arnfjörð Bjarmason <redacted>
---
help.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
@@ -317,7 +318,7 @@ void list_commands(struct cmdnames *main_cmds, struct cmdnames *other_cmds)}if(other_cmds->cnt){-printf_ln(_("git commands available from elsewhere on your $PATH"));+puts(_("git commands available from elsewhere on your $PATH"));putchar('\n');pretty_print_cmdnames(other_cmds,colopts);putchar('\n');
@@ -439,7 +440,7 @@ void list_all_cmds_help(void)structcmdname_help*aliases;inti,longest;-printf_ln(_("See 'git help <command>' to read about a specific subcommand"));+puts(_("See 'git help <command>' to read about a specific subcommand"));print_cmd_by_category(main_categories,&longest);list_all_other_cmds(&others);
There's logic in "help.c"'s "print_cmd_by_category()" to emit "help"
output with particular spacing, which doesn't make much sense when
emitting only one section with "help -g".
Let's add tests for the current spacing in preparation for a
subsequent whitespace formatting fix, and make sure that that fix
doesn't cause regressions for the "git" and "git help" output.
Signed-off-by: Ævar Arnfjörð Bjarmason <redacted>
---
t/t0012-help.sh | 45 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 45 insertions(+)
Do the same for the "--all" option that I did for "--guides" in
9856ea6785c (help: correct usage & behavior of "git help --guides",
2021-09-22). I.e. we've documented it as ignoring non-option
arguments, let's have it error out instead.
As with other changes made in 62f035aee3f (Merge branch
'ab/help-config-vars', 2021-10-13) this is technically a change in
behavior, but in practice it's just a bug fix. We were ignoring this
before, but by erroring we can simplify our documentation and
synopsis, as well as avoid user confusion as they wonder what the
difference between e.g. "git help --all" and "git help --all status"
is (there wasn't any difference).
Signed-off-by: Ævar Arnfjörð Bjarmason <redacted>
---
Documentation/git-help.txt | 5 ++---
builtin/help.c | 5 +++--
t/t0012-help.sh | 3 +++
3 files changed, 8 insertions(+), 5 deletions(-)
@@ -46,8 +46,7 @@ OPTIONS ------- -a:: --all::- Prints all the available commands on the standard output. This- option overrides any given command or guide name.+ Prints all the available commands on the standard output. --verbose:: When used with `--all` print description for all recognized
Split up the listing of commands and aliases from
list_all_cmds_help(). This will make a subsequent functional change
smaller.
Signed-off-by: Ævar Arnfjörð Bjarmason <redacted>
---
help.c | 27 ++++++++++++++++++++-------
1 file changed, 20 insertions(+), 7 deletions(-)
@@ -433,15 +433,10 @@ static int get_alias(const char *var, const char *value, void *data)return0;}-voidlist_all_cmds_help(void)+staticvoidlist_all_cmds_help_external_commands(void){structstring_listothers=STRING_LIST_INIT_DUP;-structstring_listalias_list=STRING_LIST_INIT_DUP;-structcmdname_help*aliases;-inti,longest;--puts(_("See 'git help <command>' to read about a specific subcommand"));-print_cmd_by_category(main_categories,&longest);+inti;list_all_other_cmds(&others);if(others.nr)
@@ -474,6 +476,17 @@ void list_all_cmds_help(void)string_list_clear(&alias_list,1);}+voidlist_all_cmds_help(void)+{+intlongest;++puts(_("See 'git help <command>' to read about a specific subcommand"));+print_cmd_by_category(main_categories,&longest);++list_all_cmds_help_external_commands();+list_all_cmds_help_aliases(longest);+}+intis_in_cmdlist(structcmdnames*c,constchar*s){inti;
Add more sanity checking to "git help" usage by erroring out if these
man viewer options are combined with incompatible command-modes that
will never use these documentation viewers.
This continues the work started in d35d03cf93e (help: simplify by
moving to OPT_CMDMODE(), 2021-09-22) of adding more sanity checking to
"git help". Doing this allows us to clarify the "SYNOPSIS" in the
documentation, and the "git help -h" output.
Signed-off-by: Ævar Arnfjörð Bjarmason <redacted>
---
builtin/help.c | 41 +++++++++++++++++++++++++++++++++++------
t/t0012-help.sh | 10 ++++++++++
2 files changed, 45 insertions(+), 6 deletions(-)
@@ -574,12 +574,40 @@ static const char *check_git_cmd(const char* cmd)returncmd;}-staticvoidopt_mode_usage(intargc,constchar*opt_mode)+staticvoidno_help_format(constchar*opt_mode,enumhelp_formatfmt)+{+constchar*opt_fmt;++switch(fmt){+caseHELP_FORMAT_NONE:+return;+caseHELP_FORMAT_MAN:+opt_fmt="--man";+break;+caseHELP_FORMAT_INFO:+opt_fmt="--info";+break;+caseHELP_FORMAT_WEB:+opt_fmt="--web";+break;+default:+BUG("unreachable");+}++usage_msg_optf(_("options '%s' and '%s' cannot be used together"),+builtin_help_usage,builtin_help_options,opt_mode,+opt_fmt);+}++staticvoidopt_mode_usage(intargc,constchar*opt_mode,+enumhelp_formatfmt){if(argc)usage_msg_optf(_("the '%s' option doesn't take any non-option arguments"),builtin_help_usage,builtin_help_options,opt_mode);++no_help_format(opt_mode,fmt);}intcmd_help(intargc,constchar**argv,constchar*prefix)
@@ -606,20 +634,21 @@ int cmd_help(int argc, const char **argv, const char *prefix)printf("%s\n",_(git_more_info_string));break;caseHELP_ACTION_GUIDES:-opt_mode_usage(argc,"--guides");+opt_mode_usage(argc,"--guides",help_format);list_guides_help();printf("%s\n",_(git_more_info_string));return0;caseHELP_ACTION_CONFIG_FOR_COMPLETION:-opt_mode_usage(argc,"--config-for-completion");+opt_mode_usage(argc,"--config-for-completion",help_format);list_config_help(SHOW_CONFIG_VARS);return0;caseHELP_ACTION_CONFIG_SECTIONS_FOR_COMPLETION:-opt_mode_usage(argc,"--config-sections-for-completion");+opt_mode_usage(argc,"--config-sections-for-completion",+help_format);list_config_help(SHOW_CONFIG_SECTIONS);return0;caseHELP_ACTION_CONFIG:-opt_mode_usage(argc,"--config");+opt_mode_usage(argc,"--config",help_format);setup_pager();list_config_help(SHOW_CONFIG_HUMAN);printf("\n%s\n",_("'git help config' for more information"));
@@ -49,6 +49,16 @@ test_expect_success 'invalid usage' 'test_expect_code129githelp--config-sections-for-completionadd'+foroptin'-a''-g''-c''--config-for-completion''--config-sections-for-completion'+do+test_expect_success"invalid usage of '$opt' with [-i|-m|-w]"'+githelp$opt&&+test_expect_code129githelp$opt-i&&+test_expect_code129githelp$opt-m&&+test_expect_code129githelp$opt-w+'+done+ test_expect_success"works for commands and guides by default"'configure_help&&githelpstatus&&
Fix a formatting regression in 1b81d8cb19d (help: use command-list.txt
for the source of guides, 2018-05-20). Adjust the output of "git help
--guides" and any other future single-section commands so that a
newline isn't inserted before the only section being printed.
This changes the output from:
$ git help --guides
The Git concept guides are:
[...]
To:
$ git help --guides
The Git concept guides are:
[...]
That we started printing an extra "\n" in 1b81d8cb19d wasn't intended,
but an emergent effect of moving all of the printing of "git help"
output to code that was ready to handle printing N sections.
With 1b81d8cb19d we started using the "print_cmd_by_category()"
function added earlier in the same series, or in cfb22a02ab5 (help:
use command-list.h for common command list, 2018-05-10).
Fixing this formatting nit is easy enough. Let's have all of the
output that would like to be "\n"-separated from other lines emit its
own "\n". We then adjust "print_cmd_by_category()" to only print a
"\n" to delimit the sections it's printing out.
Signed-off-by: Ævar Arnfjörð Bjarmason <redacted>
---
help.c | 5 ++++-
t/t0012-help.sh | 1 -
2 files changed, 4 insertions(+), 2 deletions(-)
@@ -328,6 +329,7 @@ void list_commands(struct cmdnames *main_cmds, struct cmdnames *other_cmds)voidlist_common_cmds_help(void){puts(_("These are common Git commands used in various situations:"));+putchar('\n');print_cmd_by_category(common_categories,NULL);}
@@ -481,6 +483,7 @@ void list_all_cmds_help(int show_external_commands, int show_aliases)intlongest;puts(_("See 'git help <command>' to read about a specific subcommand"));+putchar('\n');print_cmd_by_category(main_categories,&longest);if(show_external_commands)
Add the ability to only emit git's own usage information under
--all. This also allows us to extend the "test_section_spacing" tests
added in a preceding commit to test "git help --all"
output.
Previously we could not do that, as the tests might find a git-*
command in the "$PATH", which would make the output differ from one
setup to another.
Signed-off-by: Ævar Arnfjörð Bjarmason <redacted>
---
Documentation/git-help.txt | 10 +++++++++-
builtin/help.c | 16 ++++++++++++++--
help.c | 8 +++++---
help.h | 2 +-
t/t0012-help.sh | 37 +++++++++++++++++++++++++++++++++++++
5 files changed, 66 insertions(+), 7 deletions(-)
@@ -48,6 +48,14 @@ OPTIONS --all:: Prints all the available commands on the standard output.+--no-external-commands::+ When used with `--all`, exclude the listing of external "git-*"+ commands found in the `$PATH`.++--no-aliases::+ When used with `--all`, exclude the listing of configured+ aliases.+ --verbose:: When used with `--all` print description for all recognized commands. This is the default.
@@ -51,9 +51,14 @@ static const char *html_path;staticintverbose=1;staticenumhelp_formathelp_format=HELP_FORMAT_NONE;staticintexclude_guides;+staticintshow_external_commands=-1;+staticintshow_aliases=-1;staticstructoptionbuiltin_help_options[]={OPT_CMDMODE('a',"all",&cmd_mode,N_("print all available commands"),HELP_ACTION_ALL),+OPT_BOOL(0,"external-commands",&show_external_commands,+N_("show external commands in --all")),+OPT_BOOL(0,"aliases",&show_aliases,N_("show aliases in --all")),OPT_HIDDEN_BOOL(0,"exclude-guides",&exclude_guides,N_("exclude guides")),OPT_SET_INT('m',"man",&help_format,N_("show man page"),HELP_FORMAT_MAN),OPT_SET_INT('w',"web",&help_format,N_("show manual in web browser"),
@@ -75,7 +80,7 @@ static struct option builtin_help_options[] = {};staticconstchar*constbuiltin_help_usage[]={-N_("git help [-a|--all] [--[no-]verbose]]"),+N_("git help [-a|--all] [--[no-]verbose]] [--[no-]external-commands] [--[no-]aliases]"),N_("git help [[-i|--info] [-m|--man] [-w|--web]] [<command>]"),N_("git help [-g|--guides]"),N_("git help [-c|--config]"),
@@ -620,12 +625,19 @@ int cmd_help(int argc, const char **argv, const char *prefix)builtin_help_usage,0);parsed_help_format=help_format;+if(cmd_mode!=HELP_ACTION_ALL&&+(show_external_commands>=0||+show_aliases>=0))+usage_msg_opt(_("the '--no-[external-commands|aliases]' options can only be used with '--all'"),+builtin_help_usage,builtin_help_options);+switch(cmd_mode){caseHELP_ACTION_ALL:opt_mode_usage(argc,"--all",help_format);if(verbose){setup_pager();-list_all_cmds_help();+list_all_cmds_help(show_external_commands,+show_aliases);return0;}printf(_("usage: %s%s"),_(git_usage_string),"\n\n");
@@ -476,15 +476,17 @@ static void list_all_cmds_help_aliases(int longest)string_list_clear(&alias_list,1);}-voidlist_all_cmds_help(void)+voidlist_all_cmds_help(intshow_external_commands,intshow_aliases){intlongest;puts(_("See 'git help <command>' to read about a specific subcommand"));print_cmd_by_category(main_categories,&longest);-list_all_cmds_help_external_commands();-list_all_cmds_help_aliases(longest);+if(show_external_commands)+list_all_cmds_help_external_commands();+if(show_aliases)+list_all_cmds_help_aliases(longest);}intis_in_cmdlist(structcmdnames*c,constchar*s)
@@ -57,6 +57,19 @@ dotest_expect_code129githelp$opt-m&&test_expect_code129githelp$opt-w'++iftest"$opt"="-a"+then+continue+fi++test_expect_success"invalid usage of '$opt' with --no-external-commands"'+test_expect_code129githelp$opt--no-external-commands+'++test_expect_success"invalid usage of '$opt' with --no-aliases"'+test_expect_code129githelp$opt--no-external-commands+'done test_expect_success"works for commands and guides by default"'
@@ -187,6 +200,30 @@ do'done+test_expect_success"'git help -a' section spacing"'+test_section_spacing\+githelp-a--no-external-commands--no-aliases<<-\EOF&&+See'\''git help <command>'\''toreadaboutaspecificsubcommand++MainPorcelainCommands++AncillaryCommands/Manipulators++AncillaryCommands/Interrogators++InteractingwithOthers++Low-levelCommands/Manipulators++Low-levelCommands/Interrogators++Low-levelCommands/SyncingRepositories++Low-levelCommands/InternalHelpers+EOF+test_cmpexpectactual+'+ test_expect_success"'git help -g' section spacing"'test_section_spacing_trailergithelp-g<<-\EOF&&
Change the errors added in d35d03cf93e (help: simplify by moving to
OPT_CMDMODE(), 2021-09-22) to quote the offending option at the user
when invoked as e.g.:
git help --guides garbage
Now instead of:
fatal: this option doesn't take any other arguments
We'll emit:
fatal: the '--guides' option doesn't take any non-option arguments
Let's also rename the function, as it will be extended to do other
checks that aren't "no extra argc" in a subsequent commit.
Signed-off-by: Ævar Arnfjörð Bjarmason <redacted>
---
builtin/help.c | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
@@ -574,11 +574,12 @@ static const char *check_git_cmd(const char* cmd)returncmd;}-staticvoidno_extra_argc(intargc)+staticvoidopt_mode_usage(intargc,constchar*opt_mode){if(argc)-usage_msg_opt(_("this option doesn't take any other arguments"),-builtin_help_usage,builtin_help_options);+usage_msg_optf(_("the '%s' option doesn't take any non-option arguments"),+builtin_help_usage,builtin_help_options,+opt_mode);}intcmd_help(intargc,constchar**argv,constchar*prefix)
@@ -604,20 +605,20 @@ int cmd_help(int argc, const char **argv, const char *prefix)printf("%s\n",_(git_more_info_string));break;caseHELP_ACTION_GUIDES:-no_extra_argc(argc);+opt_mode_usage(argc,"--guides");list_guides_help();printf("%s\n",_(git_more_info_string));return0;caseHELP_ACTION_CONFIG_FOR_COMPLETION:-no_extra_argc(argc);+opt_mode_usage(argc,"--config-for-completion");list_config_help(SHOW_CONFIG_VARS);return0;caseHELP_ACTION_CONFIG_SECTIONS_FOR_COMPLETION:-no_extra_argc(argc);+opt_mode_usage(argc,"--config-sections-for-completion");list_config_help(SHOW_CONFIG_SECTIONS);return0;caseHELP_ACTION_CONFIG:-no_extra_argc(argc);+opt_mode_usage(argc,"--config");setup_pager();list_config_help(SHOW_CONFIG_HUMAN);printf("\n%s\n",_("'git help config' for more information"));