On Sat, Aug 26, 2017 at 11:53:37AM -0700, Jeff King wrote: > On Sat, Aug 26, 2017 at 01:57:18AM +0100, Ramsay Jones wrote: > > > > diff --git a/run-command.c b/run-command.c > > > index 98621faca8..064ebd1995 100644 > > > --- a/run-command.c > > > +++ b/run-command.c > > > @@ -641,7 +641,6 @@ int start_command(struct child_process *cmd) > > > } > > > > > > trace_argv_printf(cmd->argv, "trace: run_command:"); > > > - fflush(NULL); > > > > > > #ifndef GIT_WINDOWS_NATIVE > > > { > > > > I suspect not, but I can give it a try ... > > > > ... oh, wow, that works! Ahem. (Hmm, so it's flushing stdin?!) > > Interesting. I find it a little hard to believe there's so obvious a bug > as "fflush(NULL) flushes stdin", but well...that's what it seems like. > > If that's truly what it is, this is the minimal reproduction I came up > with: > > -- >8 -- > #include <stdio.h> > > int main(void) > { > char buf[256]; > while (fgets(buf, sizeof(buf), stdin)) { > fprintf(stdout, "got: %s", buf); > fflush(NULL); > } > return 0; > } > -- 8< -- > > If this really is the bug, then doing something like "seq 10 | ./a.out" > would drop some of the input lines. ...yep. It does. Specifically, I consistently only get the firsts line: $ seq 10 | ./a.exe got: 1 $ If I introduce a delay between the lines of stdin (which I tested by just typing stdin from the keyboard), it works as expected. Looks like this one will need to go to the Cygwin mailing list; I'll take it there shortly. Thank you all for your help getting this far!