git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3 4/6] usage: add show_usage_and_exit_if_asked()

From
Junio C Hamano <gitster@pobox.com>
Date
Jan 16, 2025, 01:25 UTC
Message-ID
<20250116012524.1557441-5-gitster@pobox.com>
In-Reply-To
<20250116012524.1557441-1-gitster@pobox.com>

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 <gitster@pobox.com>
---
 git-compat-util.h |  2 ++
 usage.c           | 28 +++++++++++++++++++++++++---
 2 files changed, 27 insertions(+), 3 deletions(-)
diff --git a/git-compat-util.h b/git-compat-util.h
index e283c46c6f..6edf50bc95 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_and_exit_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..26cd54a511 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 vfdreportf(int fd, const char *prefix, const char *err, va_list params)
 {
 	char msg[4096];
 	char *p, *pend = msg + sizeof(msg);
@@ -32,8 +32,14 @@ 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);
+	if (fd == 2)
+		fflush(stderr);
+	write_in_full(fd, msg, p - msg);
+}
+
+static void vreportf(const char *prefix, const char *err, va_list params)
+{
+	vfdreportf(2, prefix, err, params);
 }
 
 static NORETURN void usage_builtin(const char *err, va_list params)
@@ -173,6 +179,22 @@ void NORETURN usage(const char *err)
 	usagef("%s", err);
 }
 
+static void show_usage_and_exit_if_asked_helper(const char *err, ...)
+{
+	va_list params;
+
+	va_start(params, err);
+	vfdreportf(1, _("usage: "), err, params);
+	va_end(params);
+	exit(129);
+}
+
+void show_usage_and_exit_if_asked(int ac, const char **av, const char *err)
+{
+	if (ac == 2 && !strcmp(av[1], "-h"))
+		show_usage_and_exit_if_asked_helper(err);
+}
+
 void NORETURN die(const char *err, ...)
 {
 	va_list params;
-- 
2.48.1-191-gafe818080f
Previous: Junio C HamanoNext: Jeff King
Message 5 of 37 in “Send help text from "git cmd -h" to stdout”
  1. 0/6 Send help text from "git cmd -h" to stdoutJunio C Hamano, Jan 16, 2025
  2. 1/6 parse-options: add show_usage_help_and_exit_if_asked()Junio C Hamano, Jan 16, 2025
  3. 2/6 t0012: optionally check that "-h" output goes to stdoutJunio C Hamano, Jan 16, 2025
  4. 3/6 builtins: send usage_with_options() help text to standard outputJunio C Hamano, Jan 16, 2025
  5. 4/6 usage: add show_usage_and_exit_if_asked()Junio C Hamano, Jan 16, 2025
  6. Jeff KingJan 16, 2025
  7. Jeff KingJan 16, 2025
  8. Junio C HamanoJan 16, 2025
  9. Jeff KingJan 16, 2025
  10. Junio C HamanoJan 16, 2025
  11. 5/6 oddballs: send usage() help text to standard outputJunio C Hamano, Jan 16, 2025
  12. Jeff KingJan 16, 2025
  13. Junio C HamanoJan 16, 2025
  14. 6/6 builtin: send usage() help text to standard outputJunio C Hamano, Jan 16, 2025
  15. Junio C HamanoJan 16, 2025
  16. Junio C HamanoJan 16, 2025
  17. Jeff KingJan 16, 2025
  18. Junio C HamanoJan 16, 2025
  19. 0/6 Send help text from "git cmd -h" to stdoutJunio C Hamano, Jan 16, 2025
  20. 1/6 t0012: optionally check that "-h" output goes to stdoutJunio C Hamano, Jan 16, 2025
  21. 2/6 parse-options: add show_usage_with_options_if_asked()Junio C Hamano, Jan 16, 2025
  22. 3/6 usage: add show_usage_if_asked()Junio C Hamano, Jan 16, 2025
  23. Junio C HamanoJan 16, 2025
  24. Jeff KingJan 17, 2025
  25. 4/6 builtins: send usage_with_options() help text to standard outputJunio C Hamano, Jan 16, 2025
  26. 5/6 oddballs: send usage() help text to standard outputJunio C Hamano, Jan 16, 2025
  27. 6/6 builtin: send usage() help text to standard outputJunio C Hamano, Jan 16, 2025
  28. Jeff KingJan 17, 2025
  29. Junio C HamanoJan 17, 2025
  30. 0/6 Send help text from "git cmd -h" to stdoutJunio C Hamano, Jan 17, 2025
  31. 1/6 t0012: optionally check that "-h" output goes to stdoutJunio C Hamano, Jan 17, 2025
  32. 2/6 parse-options: add show_usage_with_options_if_asked()Junio C Hamano, Jan 17, 2025
  33. 3/6 usage: add show_usage_if_asked()Junio C Hamano, Jan 17, 2025
  34. 4/6 builtins: send usage_with_options() help text to standard outputJunio C Hamano, Jan 17, 2025
  35. 5/6 oddballs: send usage() help text to standard outputJunio C Hamano, Jan 17, 2025
  36. 6/6 builtin: send usage() help text to standard outputJunio C Hamano, Jan 17, 2025
  37. Jeff KingJan 18, 2025

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.