Skip to content

Commit

Permalink
Git.pm: allow pipes to be closed prior to calling command_close_bidi_…
Browse files Browse the repository at this point in the history
…pipe

The command_close_bidi_pipe() function will insist on closing both
input and output pipes returned by command_bidi_pipe().  With this
change it is possible to close one of the pipes in advance and pass
undef as an argument.

Signed-off-by: Michal Nazarewicz <mina86@mina86.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Michal Nazarewicz authored and Junio C Hamano committed Feb 12, 2013
1 parent 1323dba commit f4c0035
Showing 1 changed file with 14 additions and 1 deletion.
15 changes: 14 additions & 1 deletion perl/Git.pm
Original file line number Diff line number Diff line change
Expand Up @@ -426,12 +426,25 @@ Note that you should not rely on whatever actually is in C<CTX>;
currently it is simply the command name but in future the context might
have more complicated structure.
C<PIPE_IN> and C<PIPE_OUT> may be C<undef> if they have been closed prior to
calling this function. This may be useful in a query-response type of
commands where caller first writes a query and later reads response, eg:
my ($pid, $in, $out, $ctx) = $r->command_bidi_pipe('cat-file --batch-check');
print $out "000000000\n";
close $out;
while (<$in>) { ... }
$r->command_close_bidi_pipe($pid, $in, undef, $ctx);
This idiom may prevent potential dead locks caused by data sent to the output
pipe not being flushed and thus not reaching the executed command.
=cut

sub command_close_bidi_pipe {
local $?;
my ($self, $pid, $in, $out, $ctx) = _maybe_self(@_);
_cmd_close($ctx, $in, $out);
_cmd_close($ctx, (grep { defined } ($in, $out)));
waitpid $pid, 0;
if ($? >> 8) {
throw Git::Error::Command($ctx, $? >>8);
Expand Down

0 comments on commit f4c0035

Please sign in to comment.