All of lore.kernel.org
 help / color / mirror / Atom feed
From: Johannes Schindelin <Johannes.Schindelin@gmx.de>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org, Eric Sunshine <sunshine@sunshineco.com>
Subject: Re: [PATCH v2 1/7] log-tree: respect diffopt's configured output file stream
Date: Tue, 21 Jun 2016 09:31:45 +0200 (CEST)	[thread overview]
Message-ID: <alpine.DEB.2.20.1606210920510.22630@virtualbox> (raw)
In-Reply-To: <xmqqwplju74a.fsf@gitster.mtv.corp.google.com>

Hi Junio,

On Mon, 20 Jun 2016, Junio C Hamano wrote:

> Johannes Schindelin <johannes.schindelin@gmx.de> writes:
> 
> > 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.

It is conceivable, but I did not have time to chase those cases down yet.

> 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.

Back when I implemented the feature to write to individual files, I indeed
used freopen() out of laziness: 0377db7 (Teach fmt-patch to write
individual files., 2006-05-05). I could not have used diffopt.file at that
stage, anyway: that field still was almost two years in the future.

> >  		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.

TBH I did not even *know* putc(). It is amazing how you can learn new
things about the POSIX API after decades of working with it.

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

Goes without saying.

> > @@ -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.

Okay, I changed it back to be unconditional.

My original thinking was that we will fclose() the file (if it is not
stdout) anyway, which implies flushing. But the more I think about it,
the more I come to the conclusion that this is more of a side effect,
based on deep knowledge of the current code. So I now agree with you that
it would be "too clever".

Expect v3 in a moment.

Ciao,
Dscho

  reply	other threads:[~2016-06-21  7:32 UTC|newest]

Thread overview: 67+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-18 10:03 [PATCH 0/5] Let log-tree and friends respect diffopt's `file` field Johannes Schindelin
2016-06-18 10:03 ` [PATCH 1/5] log-tree: respect diffopt's configured output file stream Johannes Schindelin
2016-06-18 10:03 ` [PATCH 2/5] line-log: " Johannes Schindelin
2016-06-18 10:04 ` [PATCH 3/5] graph: respect the diffopt.file setting Johannes Schindelin
2016-06-18 10:04 ` [PATCH 4/5] shortlog: support outputting to streams other than stdout Johannes Schindelin
2016-06-18 10:04 ` [PATCH 5/5] format-patch: avoid freopen() Johannes Schindelin
2016-06-19 20:01   ` Eric Sunshine
2016-06-20  6:26     ` Johannes Schindelin
2016-06-20  6:32       ` Eric Sunshine
2016-06-20 10:09         ` Johannes Schindelin
2016-06-20 16:03       ` Junio C Hamano
2016-06-21  7:15         ` Johannes Schindelin
2016-06-21 16:50           ` Junio C Hamano
2016-06-22  7:24             ` Johannes Schindelin
2016-06-22 15:49               ` Junio C Hamano
2016-06-22 16:14                 ` Johannes Schindelin
2016-06-22 17:37                   ` Junio C Hamano
2016-06-22 17:53                   ` Junio C Hamano
2016-06-20 10:55 ` [PATCH v2 0/7] Let log-tree and friends respect diffopt's `file` field Johannes Schindelin
2016-06-20 10:55   ` [PATCH v2 1/7] log-tree: respect diffopt's configured output file stream Johannes Schindelin
2016-06-20 17:01     ` Junio C Hamano
2016-06-21  7:31       ` Johannes Schindelin [this message]
2016-06-21  7:38         ` Johannes Schindelin
2016-06-21 10:39           ` Johannes Schindelin
2016-06-20 10:55   ` [PATCH v2 2/7] line-log: " Johannes Schindelin
2016-06-20 10:55   ` [PATCH v2 3/7] graph: respect the diffopt.file setting Johannes Schindelin
2016-06-20 10:55   ` [PATCH v2 4/7] shortlog: support outputting to streams other than stdout Johannes Schindelin
2016-06-20 10:55   ` [PATCH v2 5/7] format-patch: explicitly switch off color when writing to files Johannes Schindelin
2016-06-20 10:55   ` [PATCH v2 6/7] format-patch: avoid freopen() Johannes Schindelin
2016-06-20 10:56   ` [PATCH v2 7/7] format-patch: use stdout directly Johannes Schindelin
2016-06-20 18:57     ` Junio C Hamano
2016-06-20 11:50   ` [PATCH v2 0/7] Let log-tree and friends respect diffopt's `file` field Johannes Schindelin
2016-06-21 10:34   ` [PATCH v3 0/9] " Johannes Schindelin
2016-06-21 10:34     ` [PATCH v3 1/9] am: stop ignoring errors reported by log_tree_diff() Johannes Schindelin
2016-06-21 18:59       ` Junio C Hamano
2016-06-22 12:21         ` Johannes Schindelin
2016-06-21 10:34     ` [PATCH v3 2/9] Disallow diffopt.close_file when using the log_tree machinery Johannes Schindelin
2016-06-21 18:14       ` Junio C Hamano
2016-06-21 19:05         ` Junio C Hamano
2016-06-21 19:32           ` Junio C Hamano
2016-06-22 15:17             ` Johannes Schindelin
2016-06-21 10:34     ` [PATCH v3 3/9] log-tree: respect diffopt's configured output file stream Johannes Schindelin
2016-06-21 10:35     ` [PATCH v3 4/9] line-log: " Johannes Schindelin
2016-06-21 10:35     ` [PATCH v3 5/9] graph: respect the diffopt.file setting Johannes Schindelin
2016-06-21 10:35     ` [PATCH v3 6/9] shortlog: support outputting to streams other than stdout Johannes Schindelin
2016-06-21 10:35     ` [PATCH v3 7/9] format-patch: explicitly switch off color when writing to files Johannes Schindelin
2016-06-21 10:35     ` [PATCH v3 8/9] format-patch: avoid freopen() Johannes Schindelin
2016-06-21 10:35     ` [PATCH v3 9/9] format-patch: use stdout directly Johannes Schindelin
2016-06-21 13:47     ` [PATCH v3 0/9] Let log-tree and friends respect diffopt's `file` field Paul Tan
2016-06-21 14:12       ` Johannes Schindelin
2016-06-22  9:23         ` Paul Tan
2016-06-22 15:01     ` [PATCH v4 00/10] " Johannes Schindelin
2016-06-22 15:01       ` [PATCH v4 01/10] Prepare log/log-tree to reuse the diffopt.close_file attribute Johannes Schindelin
2016-06-24 20:56         ` Junio C Hamano
2016-06-26  6:56           ` Johannes Schindelin
2016-06-22 15:01       ` [PATCH v4 02/10] log-tree: respect diffopt's configured output file stream Johannes Schindelin
2016-06-22 15:01       ` [PATCH v4 03/10] line-log: " Johannes Schindelin
2016-06-22 15:01       ` [PATCH v4 04/10] graph: respect the diffopt.file setting Johannes Schindelin
2016-06-22 15:01       ` [PATCH v4 05/10] shortlog: support outputting to streams other than stdout Johannes Schindelin
2016-06-22 15:01       ` [PATCH v4 06/10] format-patch: explicitly switch off color when writing to files Johannes Schindelin
2016-06-24 22:01         ` Junio C Hamano
2016-06-26  6:49           ` Johannes Schindelin
2016-06-22 15:01       ` [PATCH v4 07/10] format-patch: avoid freopen() Johannes Schindelin
2016-06-22 15:02       ` [PATCH v4 08/10] format-patch: use stdout directly Johannes Schindelin
2016-06-24 22:03         ` Junio C Hamano
2016-06-22 15:02       ` [PATCH v4 09/10] shortlog: respect the --output=<file> setting Johannes Schindelin
2016-06-22 15:02       ` [PATCH v4 10/10] Ensure that log respects --output=<file> Johannes Schindelin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=alpine.DEB.2.20.1606210920510.22630@virtualbox \
    --to=johannes.schindelin@gmx.de \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=sunshine@sunshineco.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.