aboutsummaryrefslogtreecommitdiffstats
path: root/usage.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2025-01-16 13:35:50 -0800
committerJunio C Hamano <gitster@pobox.com>2025-01-17 13:30:02 -0800
commit0148fd836a9b1954833471f61b4d2e058797af55 (patch)
tree5c63baa457ab14d3e426f8162b5e0d1dccc772ed /usage.c
parentparse-options: add show_usage_with_options_if_asked() (diff)
downloadgit-0148fd836a9b1954833471f61b4d2e058797af55.tar.gz
git-0148fd836a9b1954833471f61b4d2e058797af55.zip
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>
Diffstat (limited to 'usage.c')
-rw-r--r--usage.c27
1 files changed, 24 insertions, 3 deletions
diff --git a/usage.c b/usage.c
index 47709006c1..38b46bbbfe 100644
--- 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;