]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin: also setup gently for --help-all
authorD. Ben Knoble <ben.knoble+github@gmail.com>
Sun, 3 Aug 2025 16:10:27 +0000 (12:10 -0400)
committerJunio C Hamano <gitster@pobox.com>
Fri, 8 Aug 2025 18:13:12 +0000 (11:13 -0700)
Git experts often check the help summary of a command to make sure they
spell options right when suggesting advice to colleagues. Further, they
might check hidden options when responding to queries about deprecated
options like git-rebase(1)'s "preserve merges" option. But some commands
don't support "--help-all" outside of a git directory. Running (for
example)

    git rebase --help-all

outside a directory fails in "setup_git_directory", erroring with the
localized form of

    fatal: not a git repository (or any of the parent directories): .git

Like 99caeed05d (Let 'git <command> -h' show usage without a git dir,
2009-11-09), we want to show the "--help-all" output even without a git
dir. Make "--help-all" where we expect "-h" to mean
"setup_git_directory_gently", and interpose early in the natural place
("show_usage_with_options_if_asked").

Do the same for usage callers with show_usage_if_asked.

The exception is merge-recursive, whose help block doesn't use newer
APIs.

Best-viewed-with: --ignore-space-change
Signed-off-by: D. Ben Knoble <ben.knoble+github@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/merge-recursive.c
git.c
parse-options.c
t/t1517-outside-repo.sh
usage.c

index 03b5100cfae9186600bbf976bfd3bc3eed3b0a1c..17aa4db37abb5914622788645664bd6d687587d9 100644 (file)
@@ -38,7 +38,8 @@ int cmd_merge_recursive(int argc,
        if (argv[0] && ends_with(argv[0], "-subtree"))
                o.subtree_shift = "";
 
-       if (argc == 2 && !strcmp(argv[1], "-h")) {
+       if (argc == 2 && (!strcmp(argv[1], "-h") ||
+                         !strcmp(argv[1], "--help-all"))) {
                struct strbuf msg = STRBUF_INIT;
                strbuf_addf(&msg, builtin_merge_recursive_usage, argv[0]);
                show_usage_if_asked(argc, argv, msg.buf);
diff --git a/git.c b/git.c
index 07a5fe39fb69f02589e52ac432d06021f815c76f..40d3df1b763ddf5b5a27d68f2b0f277ef2d38305 100644 (file)
--- a/git.c
+++ b/git.c
@@ -445,7 +445,7 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv, struct
        const char *prefix;
        int run_setup = (p->option & (RUN_SETUP | RUN_SETUP_GENTLY));
 
-       help = argc == 2 && !strcmp(argv[1], "-h");
+       help = argc == 2 && (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help-all"));
        if (help && (run_setup & RUN_SETUP))
                /* demote to GENTLY to allow 'git cmd -h' outside repo */
                run_setup = RUN_SETUP_GENTLY;
index 169d76fb65594b797e7867102fe3d17d9ebdefcf..d9f960b7b508e81c3b652e19d22b4015be0c3c6a 100644 (file)
@@ -1461,10 +1461,16 @@ void show_usage_with_options_if_asked(int ac, const char **av,
                                      const char * const *usagestr,
                                      const struct option *opts)
 {
-       if (ac == 2 && !strcmp(av[1], "-h")) {
-               usage_with_options_internal(NULL, usagestr, opts,
-                                           USAGE_NORMAL, USAGE_TO_STDOUT);
-               exit(129);
+       if (ac == 2) {
+               if (!strcmp(av[1], "-h")) {
+                       usage_with_options_internal(NULL, usagestr, opts,
+                                                   USAGE_NORMAL, USAGE_TO_STDOUT);
+                       exit(129);
+               } else if (!strcmp(av[1], "--help-all")) {
+                       usage_with_options_internal(NULL, usagestr, opts,
+                                                   USAGE_FULL, USAGE_TO_STDOUT);
+                       exit(129);
+               }
        }
 }
 
index 3dc602872a00379ef24aee550ee1491c7cb8ed38..e34321dd446abfcbcfc7bb827ac90bf99b54f775 100755 (executable)
@@ -133,6 +133,10 @@ do
                test_expect_code 129 nongit git $cmd -h >usage &&
                test_grep "[Uu]sage: git $cmd " usage
        '
+       test_$expect_outcome $prereq "'git $cmd --help-all' outside a repository" '
+               test_expect_code 129 nongit git $cmd --help-all >usage &&
+               test_grep "[Uu]sage: git $cmd " usage
+       '
 done
 
 test_done
diff --git a/usage.c b/usage.c
index 81913236a4a2ab90bac8655061830ea863d4ed3b..4c245ba0cbaf0129215dfaf7781a300c8803ab65 100644 (file)
--- a/usage.c
+++ b/usage.c
@@ -192,7 +192,8 @@ static void show_usage_if_asked_helper(const char *err, ...)
 
 void show_usage_if_asked(int ac, const char **av, const char *err)
 {
-       if (ac == 2 && !strcmp(av[1], "-h"))
+       if (ac == 2 && (!strcmp(av[1], "-h") ||
+                       !strcmp(av[1], "--help-all")))
                show_usage_if_asked_helper(err);
 }