]> git.ipfire.org Git - thirdparty/git.git/commitdiff
usage: add show_usage_if_asked()
authorJunio C Hamano <gitster@pobox.com>
Thu, 16 Jan 2025 21:35:50 +0000 (13:35 -0800)
committerJunio C Hamano <gitster@pobox.com>
Fri, 17 Jan 2025 21:30:02 +0000 (13:30 -0800)
Some commands call usage() when they are asked to give the help
message with "git cmd -h", but this has the same problem as we
fixed with callers of usage_with_options() for the same purpose.

Introduce a helper function that captures the common pattern

if (argc == 2 && !strcmp(argv[1], "-h"))
usage(usage);

and replaces it with

show_usage_if_asked(argc, argv, usage);

to help correct these code paths.

Note that this helper function still exits with status 129, and
t0012 insists on it.  After converting all the mistaken callers of
usage_with_options() to call this new helper, we may want to address
it---the end user is asking us to give the help text, and we are
doing exactly as asked, so there is no reason to exit with non-zero
status.

Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-compat-util.h
usage.c

index e283c46c6fa06e4079851296a55c9bd5472a65b4..d43dd248c4b8cba4921d69dce683f97784b108fd 100644 (file)
@@ -701,6 +701,8 @@ int error_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
 void warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
 void warning_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
 
+void show_usage_if_asked(int ac, const char **av, const char *err);
+
 #ifndef NO_OPENSSL
 #ifdef APPLE_COMMON_CRYPTO
 #include "compat/apple-common-crypto.h"
diff --git a/usage.c b/usage.c
index 47709006c15f675490f87e1f555161d33fca72e9..38b46bbbfe72089eb179b7caac6409faabac8d9b 100644 (file)
--- a/usage.c
+++ b/usage.c
@@ -8,7 +8,7 @@
 #include "gettext.h"
 #include "trace2.h"
 
-static void vreportf(const char *prefix, const char *err, va_list params)
+static void vfreportf(FILE *f, const char *prefix, const char *err, va_list params)
 {
        char msg[4096];
        char *p, *pend = msg + sizeof(msg);
@@ -32,8 +32,13 @@ static void vreportf(const char *prefix, const char *err, va_list params)
        }
 
        *(p++) = '\n'; /* we no longer need a NUL */
-       fflush(stderr);
-       write_in_full(2, msg, p - msg);
+       fflush(f);
+       write_in_full(fileno(f), msg, p - msg);
+}
+
+static void vreportf(const char *prefix, const char *err, va_list params)
+{
+       vfreportf(stderr, prefix, err, params);
 }
 
 static NORETURN void usage_builtin(const char *err, va_list params)
@@ -173,6 +178,22 @@ void NORETURN usage(const char *err)
        usagef("%s", err);
 }
 
+static void show_usage_if_asked_helper(const char *err, ...)
+{
+       va_list params;
+
+       va_start(params, err);
+       vfreportf(stdout, _("usage: "), err, params);
+       va_end(params);
+       exit(129);
+}
+
+void show_usage_if_asked(int ac, const char **av, const char *err)
+{
+       if (ac == 2 && !strcmp(av[1], "-h"))
+               show_usage_if_asked_helper(err);
+}
+
 void NORETURN die(const char *err, ...)
 {
        va_list params;