> -----Original Message-----
> From: [email protected] [mailto:[email protected]] On
> Behalf Of Jeff King
> Sent: den 19 september 2013 10:36
> To: Peter Kjellerstedt
> Cc: Junio C Hamano; Nguyen Thai Ngoc Duy; [email protected]
> Subject: Re: git clone silently aborts if stdout gets a broken pipe
>
> On Thu, Sep 19, 2013 at 09:54:38AM +0200, Peter Kjellerstedt wrote:
>
> > > I think your perl script is somewhat questionable, as it is making
> > > assumptions about the output of git-clone, and you would do better
> to
> > > accept arbitrary-sized output
> >
> > Well, the whole idea of using Git::command_oneline() is that we
> > are only interested in the first line of output, similar to using
> > "| head -1". If we had wanted all of the output we would have used
> > Git::command() instead. Since the Git Perl module is released as a
> > part of Git, I would expect it to work as documented regardless of
> > which Git command is used with Git::command_oneline().
>
> I think command_oneline is exactly like "| head -1" in this case. Doing
> "git clone | head -1" would also fail, and should not be used. In
> general, you do not want to put a limiting pipe on a command with side
> effects beyond output. The design of unix pipes and SIGPIPE is such that
> you can do "generate_output | head", and "generate_output" will get
> SIGPIPE and die after realizing that its writer no longer cares about
> the output. But if your command is doing something besides output, that
> assumption doesn't hold.
A very valid point.
> Arguably, "git clone" should be taking the initiative to ignore SIGPIPE
> itself. Its primary function is not output, but doing the clone. If
> output fails, we would want to continue the clone, not die.
>
> By the way, did you actually want to capture the stdout of git-clone, or
> were you just trying to suppress it? Because the eventual patch I posted
> sends it to stderr, under the assumption that what used to go to stdout
> should not be captured and parsed (because it is localized and subject
> to change).
No, we were not really interested in the output to stdout (which is
why the return value from Git::command_oneline() was ignored).
> > However, what surprised me most was that git clone failed silently
> > when it got a broken pipe.
>
> It's not "git clone" that is doing this, I think, but rather the design
> of command_oneline. If I do:
>
> (sleep 1; git clone ...; echo >&2 exit=$?) | false
>
> then I see:
>
> exit=141
>
> That is, clone dies from SIGPIPE trying to write "Cloning into...". But
> command_oneline is specifically designed to ignore SIGPIPE death,
> because you would want something like:
>
> command_oneline("git", "rev-list", "$A..$B");
>
> to give you the first line, and then you do not care if the rest of the
> rev-list dies due to SIGPIPE (it is a good thing, because by closing the
> pipe you are telling it that its output is not needed). It may be that
> the documentation for command_oneline can be improved to mention this
> subtlety.
Ok, all of it makes sense now. Thank you for the explanation.
I have corrected our script so it now works correctly with
git 1.8.4 as well.
> -Peff
> --
> To unsubscribe from this list: send the line "unsubscribe git" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
//Peter
N�����r��y����b�X��ǧv�^�){.n�+����ا���ܨ}���Ơz�&j:+v�������zZ+��+zf���h���~����i���z��w���?�����&�)ߢf