Re: [PATCH v4 3/6] usage: add show_usage_if_asked()
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jan 16, 2025, 23:00 UTC
- Message-ID
- <xmqqr052nz36.fsf@gitster.g>
- In-Reply-To
- <20250116213553.2563751-4-gitster@pobox.com>
So here is a replacement for this step. Everything else is unaffected, so I'll wait for other comments until sending a full reroll.
Thanks.
--- >8 --- Subject: [PATCH v5 3/6] 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> ---
1: 2b57538eab ! 1: 94a6fdf72f usage: add show_usage_if_asked()
@@ Commit message
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
#include "trace2.h"
-static void vreportf(const char *prefix, const char *err, va_list params)
-+static void vfdreportf(int fd, 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);
@@ usage.c: static void vreportf(const char *prefix, const char *err, va_list param
*(p++) = '\n'; /* we no longer need a NUL */
- fflush(stderr);
- write_in_full(2, msg, p - msg);
-+ if (fd == 2)
-+ fflush(stderr);
-+ write_in_full(fd, 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)
+{
-+ vfdreportf(2, prefix, err, params);
++ vfreportf(stderr, prefix, err, params);
}
static NORETURN void usage_builtin(const char *err, va_list params)
@@ usage.c: void NORETURN usage(const char *err)
+ va_list params;
+
+ va_start(params, err);
-+ vfdreportf(1, _("usage: "), err, params);
++ vfreportf(stdout, _("usage: "), err, params);
+ va_end(params);
+ exit(129);
+}git-compat-util.h | 2 ++ usage.c | 27 ++++++++++++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/git-compat-util.h b/git-compat-util.h index e283c46c6f..d43dd248c4 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -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 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;
-- 2.48.1-210-gaa1682cadd