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

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

From
Jeff King <peff@peff.net>
Date
Jan 16, 2025, 21:54 UTC
Message-ID
<20250116215431.GA2338133@coredump.intra.peff.net>
In-Reply-To
<xmqqbjw6u101.fsf@gitster.g>
On Thu, Jan 16, 2025 at 09:22:54AM -0800, Junio C Hamano wrote:
Show 19 quoted lines
> >> -	fflush(stderr);
> >> -	write_in_full(2, msg, p - msg);
> >> +	if (fd == 2)
> >> +		fflush(stderr);
> >> +	write_in_full(fd, msg, p - msg);
> >> +}
> >
> > Gross. :) I think the existing code is conceptually:
> >
> >   write_in_full(fileno(stderr), msg, p - msg);
> >
> > In which case vfreportf() could just take a FILE*, flush it and then
> > write.
> 
> Sure, but these "stderr" are real error reporting that need to stay
> to be stderr, and flush needs to be done only when our true payload
> goes to fd#2 and I do not think these fflush() are about stdio calls
> made by the caller _before_ it called this function.  It may become
> a bit tricky to read the resulting code if we pass "FILE *".

I think the flush _is_ about earlier stdio calls in the process; that's what 116d1fa6c6 (vreportf(): avoid relying on stdio buffering, 2019-10-30) says. I do think it's unlikely for the process to write to stdout() before processing "-h", but it seems like we should do the safer thing as a general principle, unless it ends up hard to do so.

You said "may become a bit tricky" above, but unless I'm missing something, it's just:

---
 usage.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/usage.c b/usage.c
index d9f323a0bd..533d296e41 100644
--- a/usage.c
+++ b/usage.c
@@ -8,7 +8,7 @@
 #include "gettext.h"
 #include "trace2.h"
 
-static void vfdreportf(int fd, const char *prefix, const char *err, va_list params)
+static void vfreportf(FILE *fh, const char *prefix, const char *err, va_list params)
 {
 	char msg[4096];
 	char *p, *pend = msg + sizeof(msg);
@@ -32,14 +32,13 @@ static void vfdreportf(int fd, const char *prefix, const char *err, va_list para
 	}
 
 	*(p++) = '\n'; /* we no longer need a NUL */
-	if (fd == 2)
-		fflush(stderr);
-	write_in_full(fd, msg, p - msg);
+	fflush(fh);
+	write_in_full(fileno(fh), 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)
@@ -184,7 +183,7 @@ static void show_usage_if_asked_helper(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);
 }
Previous: Junio C HamanoNext: Junio C Hamano
Message 9 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.