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

Re: [PATCH v2 1/7] log-tree: respect diffopt's configured output file stream

From
Junio C Hamano <gitster@pobox.com>
Date
Jun 20, 2016, 17:01 UTC
Message-ID
<xmqqwplju74a.fsf@gitster.mtv.corp.google.com>
In-Reply-To
<babf95df5f610feb6c2ae7f2ed3cff98bab47fe2.1466420060.git.johannes.schindelin@gmx.de>
Johannes Schindelin <johannes.schindelin@gmx.de> writes:
Show 5 quoted lines
> The diff options already know how to print the output anywhere else
> than stdout. The same is needed for log output in general, e.g.
> when writing patches to files in `git format-patch`. Let's allow
> users to use log_tree_commit() *without* changing global state via
> freopen().

I wonder if this change is actually fixing existing bugs. Are there cases where diffopt.file is set, i.e. the user expects the output to be sent elsewhere, but the code here unconditionally emits to the standard output? I suspect that such a bug can be demonstratable in a test or two, if that were the case.

I am sort-of surprised that we didn't do this already even though we had diffopt.file for a long time since c0c77734 (Write diff output to a file in struct diff_options, 2008-03-09).

Use of freopen() to always write patches through stdout may have been done as a lazy workaround of the issue this patch fixes, but what is surprising to me is that doing it the right way like this patch does is not that much of work. Perhaps that was done long before c0c77734 was done, which would mean doing it the right way back then when we started using freopen() it would have been a lot more work and we thought taking a short-cut was warranted.

In any case, this is a change in the good direction. Thanks for cleaning things up.

Show 6 quoted lines
>  		if (opt->children.name)
>  			show_children(opt, commit, abbrev_commit);
>  		show_decorations(opt, commit);
>  		if (opt->graph && !graph_is_commit_finished(opt->graph)) {
> -			putchar('\n');
> +			fputc('\n', opt->diffopt.file);

Hmph. putc() is the "to the given stream" equivalent of putchar() in the "send to stdout" world, not fputc(). I do not see a reason to force the call to go to a function avoiding a possible macro here.

Likewise for all the new fputc() calls in this series that were originally putchar().

Show 12 quoted lines
> @@ -880,8 +880,9 @@ int log_tree_commit(struct rev_info *opt, struct commit *commit)
>  		shown = 1;
>  	}
>  	if (opt->track_linear && !opt->linear && opt->reverse_output_stage)
> -		printf("\n%s\n", opt->break_bar);
> +		fprintf(opt->diffopt.file, "\n%s\n", opt->break_bar);
>  	opt->loginfo = NULL;
> -	maybe_flush_or_die(stdout, "stdout");
> +	if (opt->diffopt.file == stdout)
> +		maybe_flush_or_die(stdout, "stdout");
>  	return shown;
>  }
This one looks fishy.

Back when we freopen()'ed to write patches only through stdout, we always called maybe_flush_or_die() to make sure that the output is flushed correctly after processing each commit. This change makes it not to care, which I doubt was what you intended. Instead, my suspicion is that you didn't want to say "stdout" when writing into a file.

But even when writing to on-disk files, the code before your series would have said "stdout" when it had trouble flushing, so I do not think this new "if()" condition is making things better. If "it said stdout when having trouble flushing to a file" were a problem to be fixed, "let's not say stdout by not even attempting to flush and catch errors when writing to a file" would not be the right solution, no?

Personally, I do not think it hurts if we kept saying 'stdout' here, even when we flush opt->diffopt.file and found a problem.

Thanks.
Previous: Johannes SchindelinNext: Johannes Schindelin
Message 22 of 67 in “Let log-tree and friends respect diffopt's `file` field”
  1. 0/5 Let log-tree and friends respect diffopt's `file` fieldJohannes Schindelin, Jun 18, 2016
  2. 1/5 log-tree: respect diffopt's configured output file streamJohannes Schindelin, Jun 18, 2016
  3. 3/5 graph: respect the diffopt.file settingJohannes Schindelin, Jun 18, 2016
  4. 4/5 shortlog: support outputting to streams other than stdoutJohannes Schindelin, Jun 18, 2016
  5. 5/5 format-patch: avoid freopen()Johannes Schindelin, Jun 18, 2016
  6. Eric SunshineJun 19, 2016
  7. Johannes SchindelinJun 20, 2016
  8. Eric SunshineJun 20, 2016
  9. Johannes SchindelinJun 20, 2016
  10. Junio C HamanoJun 20, 2016
  11. Johannes SchindelinJun 21, 2016
  12. Junio C HamanoJun 21, 2016
  13. Johannes SchindelinJun 22, 2016
  14. Junio C HamanoJun 22, 2016
  15. Johannes SchindelinJun 22, 2016
  16. Junio C HamanoJun 22, 2016
  17. Junio C HamanoJun 22, 2016
  18. 2/5 line-log: respect diffopt's configured output file streamJohannes Schindelin, Jun 18, 2016
  19. 0/7 Let log-tree and friends respect diffopt's `file` fieldJohannes Schindelin, Jun 20, 2016
  20. 2/7 line-log: respect diffopt's configured output file streamJohannes Schindelin, Jun 20, 2016
  21. 1/7 log-tree: respect diffopt's configured output file streamJohannes Schindelin, Jun 20, 2016
  22. Junio C HamanoJun 20, 2016
  23. Johannes SchindelinJun 21, 2016
  24. Johannes SchindelinJun 21, 2016
  25. Johannes SchindelinJun 21, 2016
  26. 3/7 graph: respect the diffopt.file settingJohannes Schindelin, Jun 20, 2016
  27. 6/7 format-patch: avoid freopen()Johannes Schindelin, Jun 20, 2016
  28. 5/7 format-patch: explicitly switch off color when writing to filesJohannes Schindelin, Jun 20, 2016
  29. 4/7 shortlog: support outputting to streams other than stdoutJohannes Schindelin, Jun 20, 2016
  30. 7/7 format-patch: use stdout directlyJohannes Schindelin, Jun 20, 2016
  31. Junio C HamanoJun 20, 2016
  32. Johannes SchindelinJun 20, 2016
  33. 0/9 Let log-tree and friends respect diffopt's `file` fieldJohannes Schindelin, Jun 21, 2016
  34. 8/9 format-patch: avoid freopen()Johannes Schindelin, Jun 21, 2016
  35. 7/9 format-patch: explicitly switch off color when writing to filesJohannes Schindelin, Jun 21, 2016
  36. 9/9 format-patch: use stdout directlyJohannes Schindelin, Jun 21, 2016
  37. 2/9 Disallow diffopt.close_file when using the log_tree machineryJohannes Schindelin, Jun 21, 2016
  38. Junio C HamanoJun 21, 2016
  39. Junio C HamanoJun 21, 2016
  40. Junio C HamanoJun 21, 2016
  41. Johannes SchindelinJun 22, 2016
  42. 4/9 line-log: respect diffopt's configured output file streamJohannes Schindelin, Jun 21, 2016
  43. 3/9 log-tree: respect diffopt's configured output file streamJohannes Schindelin, Jun 21, 2016
  44. 1/9 am: stop ignoring errors reported by log_tree_diff()Johannes Schindelin, Jun 21, 2016
  45. Junio C HamanoJun 21, 2016
  46. Johannes SchindelinJun 22, 2016
  47. 6/9 shortlog: support outputting to streams other than stdoutJohannes Schindelin, Jun 21, 2016
  48. 5/9 graph: respect the diffopt.file settingJohannes Schindelin, Jun 21, 2016
  49. Paul TanJun 21, 2016
  50. Johannes SchindelinJun 21, 2016
  51. Paul TanJun 22, 2016
  52. 00/10 Let log-tree and friends respect diffopt's `file` fieldJohannes Schindelin, Jun 22, 2016
  53. 09/10 shortlog: respect the --output=<file> settingJohannes Schindelin, Jun 22, 2016
  54. 10/10 Ensure that log respects --output=<file>Johannes Schindelin, Jun 22, 2016
  55. 07/10 format-patch: avoid freopen()Johannes Schindelin, Jun 22, 2016
  56. 08/10 format-patch: use stdout directlyJohannes Schindelin, Jun 22, 2016
  57. Junio C HamanoJun 24, 2016
  58. 05/10 shortlog: support outputting to streams other than stdoutJohannes Schindelin, Jun 22, 2016
  59. 02/10 log-tree: respect diffopt's configured output file streamJohannes Schindelin, Jun 22, 2016
  60. 06/10 format-patch: explicitly switch off color when writing to filesJohannes Schindelin, Jun 22, 2016
  61. Junio C HamanoJun 24, 2016
  62. Johannes SchindelinJun 26, 2016
  63. 01/10 Prepare log/log-tree to reuse the diffopt.close_file attributeJohannes Schindelin, Jun 22, 2016
  64. Junio C HamanoJun 24, 2016
  65. Johannes SchindelinJun 26, 2016
  66. 04/10 graph: respect the diffopt.file settingJohannes Schindelin, Jun 22, 2016
  67. 03/10 line-log: respect diffopt's configured output file streamJohannes Schindelin, Jun 22, 2016

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.