usage: add show_usage_if_asked()

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>

Junio C Hamano committed Jan 16, 2025 at 13:35 UTC 0148fd836a9b1954833471f61b4d2e058797af55
2 files changed +26 -3
git-compat-util.h
+2
@@ -701,6 +701,8 @@ int error_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
701 void warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
702 void warning_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
703
704 +void show_usage_if_asked(int ac, const char **av, const char *err);
705 +
706 #ifndef NO_OPENSSL
707 #ifdef APPLE_COMMON_CRYPTO
708 #include "compat/apple-common-crypto.h"
usage.c
+24 -3
@@ -8,7 +8,7 @@
8 #include "gettext.h"
9 #include "trace2.h"
10
11 -static void vreportf(const char *prefix, const char *err, va_list params)
11 +static void vfreportf(FILE *f, const char *prefix, const char *err, va_list params)
12 {
13 char msg[4096];
14 char *p, *pend = msg + sizeof(msg);
@@ -32,8 +32,13 @@ static void vreportf(const char *prefix, const char *err, va_list params)
32 }
33
34 *(p++) = '\n'; /* we no longer need a NUL */
35 - fflush(stderr);
36 - write_in_full(2, msg, p - msg);
35 + fflush(f);
36 + write_in_full(fileno(f), msg, p - msg);
37 +}
38 +
39 +static void vreportf(const char *prefix, const char *err, va_list params)
40 +{
41 + vfreportf(stderr, prefix, err, params);
42 }
43
44 static NORETURN void usage_builtin(const char *err, va_list params)
@@ -173,6 +178,22 @@ void NORETURN usage(const char *err)
178 usagef("%s", err);
179 }
180
181 +static void show_usage_if_asked_helper(const char *err, ...)
182 +{
183 + va_list params;
184 +
185 + va_start(params, err);
186 + vfreportf(stdout, _("usage: "), err, params);
187 + va_end(params);
188 + exit(129);
189 +}
190 +
191 +void show_usage_if_asked(int ac, const char **av, const char *err)
192 +{
193 + if (ac == 2 && !strcmp(av[1], "-h"))
194 + show_usage_if_asked_helper(err);
195 +}
196 +
197 void NORETURN die(const char *err, ...)
198 {
199 va_list params;