Skip to content

Commit fda0491

Browse files
committed
usage: add show_usage_and_exit_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_and_exit_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. Signed-off-by: Junio C Hamano <[email protected]>
1 parent 7f76eba commit fda0491

File tree

2 files changed

+27
-3
lines changed

2 files changed

+27
-3
lines changed

git-compat-util.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -701,6 +701,8 @@ int error_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
701701
void warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
702702
void warning_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
703703

704+
void show_usage_and_exit_if_asked(int ac, const char **av, const char *err);
705+
704706
#ifndef NO_OPENSSL
705707
#ifdef APPLE_COMMON_CRYPTO
706708
#include "compat/apple-common-crypto.h"

usage.c

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#include "gettext.h"
99
#include "trace2.h"
1010

11-
static void vreportf(const char *prefix, const char *err, va_list params)
11+
static void vfdreportf(int fd, const char *prefix, const char *err, va_list params)
1212
{
1313
char msg[4096];
1414
char *p, *pend = msg + sizeof(msg);
@@ -32,8 +32,14 @@ static void vreportf(const char *prefix, const char *err, va_list params)
3232
}
3333

3434
*(p++) = '\n'; /* we no longer need a NUL */
35-
fflush(stderr);
36-
write_in_full(2, msg, p - msg);
35+
if (fd == 2)
36+
fflush(stderr);
37+
write_in_full(fd, msg, p - msg);
38+
}
39+
40+
static void vreportf(const char *prefix, const char *err, va_list params)
41+
{
42+
vfdreportf(2, prefix, err, params);
3743
}
3844

3945
static NORETURN void usage_builtin(const char *err, va_list params)
@@ -173,6 +179,22 @@ void NORETURN usage(const char *err)
173179
usagef("%s", err);
174180
}
175181

182+
static void show_usage_and_exit_if_asked_helper(const char *err, ...)
183+
{
184+
va_list params;
185+
186+
va_start(params, err);
187+
vfdreportf(1, _("usage: "), err, params);
188+
va_end(params);
189+
exit(129);
190+
}
191+
192+
void show_usage_and_exit_if_asked(int ac, const char **av, const char *err)
193+
{
194+
if (ac == 2 && !strcmp(av[1], "-h"))
195+
show_usage_and_exit_if_asked_helper(err);
196+
}
197+
176198
void NORETURN die(const char *err, ...)
177199
{
178200
va_list params;

0 commit comments

Comments
 (0)