From cd87ce7d0def6b6efeb1ae688bde217a0a47c9eb Mon Sep 17 00:00:00 2001 From: Ævar Arnfjörð Bjarmason Date: Mon, 21 Feb 2022 20:38:45 +0100 Subject: help.c: use puts() instead of printf{,_ln}() for consistency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: Junio C Hamano --- help.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'help.c') diff --git a/help.c b/help.c index 71444906dd..77af953826 100644 --- a/help.c +++ b/help.c @@ -124,7 +124,8 @@ static void print_cmd_by_category(const struct category_description *catdesc, uint32_t mask = catdesc[i].category; const char *desc = catdesc[i].desc; - printf("\n%s\n", _(desc)); + putchar('\n'); + puts(_(desc)); print_command_list(cmds, mask, longest); } free(cmds); @@ -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) struct cmdname_help *aliases; int i, longest; - printf_ln(_("See 'git help ' to read about a specific subcommand")); + puts(_("See 'git help ' to read about a specific subcommand")); print_cmd_by_category(main_categories, &longest); list_all_other_cmds(&others); -- cgit v1.2.3 From 6fb427abbb06236546c0d5b873e580b0a6fdb414 Mon Sep 17 00:00:00 2001 From: Ævar Arnfjörð Bjarmason Date: Mon, 21 Feb 2022 20:38:47 +0100 Subject: help.c: split up list_all_cmds_help() function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: Junio C Hamano --- help.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) (limited to 'help.c') diff --git a/help.c b/help.c index 77af953826..004117347e 100644 --- a/help.c +++ b/help.c @@ -433,15 +433,10 @@ static int get_alias(const char *var, const char *value, void *data) return 0; } -void list_all_cmds_help(void) +static void list_all_cmds_help_external_commands(void) { struct string_list others = STRING_LIST_INIT_DUP; - struct string_list alias_list = STRING_LIST_INIT_DUP; - struct cmdname_help *aliases; - int i, longest; - - puts(_("See 'git help ' to read about a specific subcommand")); - print_cmd_by_category(main_categories, &longest); + int i; list_all_other_cmds(&others); if (others.nr) @@ -449,6 +444,13 @@ void list_all_cmds_help(void) for (i = 0; i < others.nr; i++) printf(" %s\n", others.items[i].string); string_list_clear(&others, 0); +} + +static void list_all_cmds_help_aliases(int longest) +{ + struct string_list alias_list = STRING_LIST_INIT_DUP; + struct cmdname_help *aliases; + int i; git_config(get_alias, &alias_list); string_list_sort(&alias_list); @@ -474,6 +476,17 @@ void list_all_cmds_help(void) string_list_clear(&alias_list, 1); } +void list_all_cmds_help(void) +{ + int longest; + + puts(_("See 'git help ' 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); +} + int is_in_cmdlist(struct cmdnames *c, const char *s) { int i; -- cgit v1.2.3 From 1ce590133b545aa735683f46003d12df624d67af Mon Sep 17 00:00:00 2001 From: Ævar Arnfjörð Bjarmason Date: Mon, 21 Feb 2022 20:38:51 +0100 Subject: help: add --no-[external-commands|aliases] for use with --all MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: Junio C Hamano --- 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(-) (limited to 'help.c') diff --git a/Documentation/git-help.txt b/Documentation/git-help.txt index d07590c8ff..239c68db45 100644 --- a/Documentation/git-help.txt +++ b/Documentation/git-help.txt @@ -8,7 +8,7 @@ git-help - Display help information about Git SYNOPSIS -------- [verse] -'git help' [-a|--all] [--[no-]verbose] +'git help' [-a|--all] [--[no-]verbose] [--[no-]external-commands] [--[no-]aliases] 'git help' [[-i|--info] [-m|--man] [-w|--web]] [|] 'git help' [-g|--guides] 'git help' [-c|--config] @@ -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. diff --git a/builtin/help.c b/builtin/help.c index 1fc45adfcc..01eda326c3 100644 --- a/builtin/help.c +++ b/builtin/help.c @@ -51,9 +51,14 @@ static const char *html_path; static int verbose = 1; static enum help_format help_format = HELP_FORMAT_NONE; static int exclude_guides; +static int show_external_commands = -1; +static int show_aliases = -1; static struct option builtin_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[] = { }; static const char * const builtin_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]] []"), 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) { case HELP_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); return 0; } printf(_("usage: %s%s"), _(git_usage_string), "\n\n"); diff --git a/help.c b/help.c index 004117347e..45a21e7e35 100644 --- a/help.c +++ b/help.c @@ -476,15 +476,17 @@ static void list_all_cmds_help_aliases(int longest) string_list_clear(&alias_list, 1); } -void list_all_cmds_help(void) +void list_all_cmds_help(int show_external_commands, int show_aliases) { int longest; puts(_("See 'git help ' 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); } int is_in_cmdlist(struct cmdnames *c, const char *s) diff --git a/help.h b/help.h index 9d383f1a0b..971a3ad855 100644 --- a/help.h +++ b/help.h @@ -20,7 +20,7 @@ static inline void mput_char(char c, unsigned int num) } void list_common_cmds_help(void); -void list_all_cmds_help(void); +void list_all_cmds_help(int show_external_commands, int show_aliases); void list_guides_help(void); void list_all_main_cmds(struct string_list *list); diff --git a/t/t0012-help.sh b/t/t0012-help.sh index f12783fd15..64321480c6 100755 --- a/t/t0012-help.sh +++ b/t/t0012-help.sh @@ -57,6 +57,19 @@ do test_expect_code 129 git help $opt -m && test_expect_code 129 git help $opt -w ' + + if test "$opt" = "-a" + then + continue + fi + + test_expect_success "invalid usage of '$opt' with --no-external-commands" ' + test_expect_code 129 git help $opt --no-external-commands + ' + + test_expect_success "invalid usage of '$opt' with --no-aliases" ' + test_expect_code 129 git help $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 \ + git help -a --no-external-commands --no-aliases <<-\EOF && + See '\''git help '\'' to read about a specific subcommand + + Main Porcelain Commands + + Ancillary Commands / Manipulators + + Ancillary Commands / Interrogators + + Interacting with Others + + Low-level Commands / Manipulators + + Low-level Commands / Interrogators + + Low-level Commands / Syncing Repositories + + Low-level Commands / Internal Helpers + EOF + test_cmp expect actual +' + test_expect_success "'git help -g' section spacing" ' test_section_spacing_trailer git help -g <<-\EOF && -- cgit v1.2.3 From 93de1b6999898079f521afd73d6a4ae9d5f9aaea Mon Sep 17 00:00:00 2001 From: Ævar Arnfjörð Bjarmason Date: Mon, 21 Feb 2022 20:38:52 +0100 Subject: help: don't print "\n" before single-section output MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: Junio C Hamano --- help.c | 5 ++++- t/t0012-help.sh | 1 - 2 files changed, 4 insertions(+), 2 deletions(-) (limited to 'help.c') diff --git a/help.c b/help.c index 45a21e7e35..afd3af2412 100644 --- a/help.c +++ b/help.c @@ -124,7 +124,8 @@ static void print_cmd_by_category(const struct category_description *catdesc, uint32_t mask = catdesc[i].category; const char *desc = catdesc[i].desc; - putchar('\n'); + if (i) + putchar('\n'); puts(_(desc)); print_command_list(cmds, mask, longest); } @@ -328,6 +329,7 @@ void list_commands(struct cmdnames *main_cmds, struct cmdnames *other_cmds) void list_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) int longest; puts(_("See 'git help ' to read about a specific subcommand")); + putchar('\n'); print_cmd_by_category(main_categories, &longest); if (show_external_commands) diff --git a/t/t0012-help.sh b/t/t0012-help.sh index 64321480c6..6c3e1f7159 100755 --- a/t/t0012-help.sh +++ b/t/t0012-help.sh @@ -226,7 +226,6 @@ test_expect_success "'git help -a' section spacing" ' test_expect_success "'git help -g' section spacing" ' test_section_spacing_trailer git help -g <<-\EOF && - The Git concept guides are: EOF -- cgit v1.2.3