help: correct logic error in combining --all and --config

Fix a bug in the --config option that's been there ever since its introduction in 3ac68a93fd2 (help: add --config to list all available config, 2018-05-26). Die when --all and --config are combined, combining them doesn't make sense. The code for the --config option when combined with an earlier refactoring done to support the --guide option in 65f98358c0c (builtin/help.c: add --guide option, 2013-04-02) would cause us to take the "--all" branch early and ignore the --config option. Let's instead list these as incompatible, both in the synopsis and help output, and enforce it in the code itself. Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Ævar Arnfjörð Bjarmason committed Sep 22, 2021 at 00:40 UTC 1ed4bef6b438d25ce605f6bdefb4c98569dad137
3 files changed +25 -10
Documentation/git-help.txt
+1
@@ -11,6 +11,7 @@ SYNOPSIS
11 'git help' [-a|--all [--[no-]verbose]]
12 [[-i|--info] [-m|--man] [-w|--web]] [COMMAND|GUIDE]
13 'git help' [-g|--guides]
14 +'git help' [-c|--config]
15
16 DESCRIPTION
17 -----------
builtin/help.c
+22 -9
@@ -62,6 +62,7 @@ static const char * const builtin_help_usage[] = {
62 N_("git help [-a|--all] [--[no-]verbose]]\n"
63 " [[-i|--info] [-m|--man] [-w|--web]] [<command>]"),
64 N_("git help [-g|--guides]"),
65 + N_("git help [-c|--config]"),
66 NULL
67 };
68
@@ -553,9 +554,21 @@ int cmd_help(int argc, const char **argv, const char *prefix)
554 builtin_help_usage, 0);
555 parsed_help_format = help_format;
556
557 + /* Incompatible options */
558 + if (show_all && show_config)
559 + usage_msg_opt(_("--config and --all cannot be combined"),
560 + builtin_help_usage, builtin_help_options);
561 +
562 + if (show_config && show_guides)
563 + usage_msg_opt(_("--config and --guides cannot be combined"),
564 + builtin_help_usage, builtin_help_options);
565 +
566 /* Options that take no further arguments */
567 + if (argc && show_config)
568 + usage_msg_opt(_("--config cannot be combined with command or guide names"),
569 + builtin_help_usage, builtin_help_options);
570 if (argc && show_guides)
558 - usage_msg_opt(_("--guides cannot be combined with other options"),
571 + usage_msg_opt(_("--guides cannot be combined with command or guide names"),
572 builtin_help_usage, builtin_help_options);
573
574 if (show_all) {
@@ -570,6 +583,14 @@ int cmd_help(int argc, const char **argv, const char *prefix)
583 list_commands(colopts, &main_cmds, &other_cmds);
584 }
585
586 + if (show_guides)
587 + list_guides_help();
588 +
589 + if (show_all || show_guides) {
590 + printf("%s\n", _(git_more_info_string));
591 + return 0;
592 + }
593 +
594 if (show_config) {
595 int for_human = show_config == 1;
596
@@ -583,14 +604,6 @@ int cmd_help(int argc, const char **argv, const char *prefix)
604 return 0;
605 }
606
586 - if (show_guides)
587 - list_guides_help();
588 -
589 - if (show_all || show_guides) {
590 - printf("%s\n", _(git_more_info_string));
591 - return 0;
592 - }
593 -
607 if (!argv[0]) {
608 printf(_("usage: %s%s"), _(git_usage_string), "\n\n");
609 list_common_cmds_help();
t/t0012-help.sh
+2 -1
@@ -35,7 +35,8 @@ test_expect_success 'basic help commands' '
35 '
36
37 test_expect_success 'invalid usage' '
38 - test_expect_code 129 git help -g add
38 + test_expect_code 129 git help -g add &&
39 + test_expect_code 129 git help -a -c
40 '
41
42 test_expect_success "works for commands and guides by default" '