From: Adam Roben <aroben@apple.com>
To: git@vger.kernel.org
Cc: Adam Roben <aroben@apple.com>, Eric Wong <normalperson@yhbt.net>
Subject: [PATCH 09/11] Git.pm: Add command_bidi_pipe and command_close_bidi_pipe
Date: Wed, 23 Apr 2008 15:17:51 -0400 [thread overview]
Message-ID: <1208978273-98146-10-git-send-email-aroben@apple.com> (raw)
In-Reply-To: <1208978273-98146-9-git-send-email-aroben@apple.com>
command_bidi_pipe hands back the stdin and stdout file handles from the
executed command. command_close_bidi_pipe closes these handles and terminates
the process.
Signed-off-by: Adam Roben <aroben@apple.com>
---
perl/Git.pm | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 56 insertions(+), 0 deletions(-)
diff --git a/perl/Git.pm b/perl/Git.pm
index 2e7f896..d766974 100644
--- a/perl/Git.pm
+++ b/perl/Git.pm
@@ -51,6 +51,7 @@ require Exporter;
# Methods which can be called as standalone functions as well:
@EXPORT_OK = qw(command command_oneline command_noisy
command_output_pipe command_input_pipe command_close_pipe
+ command_bidi_pipe command_close_bidi_pipe
version exec_path hash_object git_cmd_try);
@@ -92,6 +93,7 @@ increate nonwithstanding).
use Carp qw(carp croak); # but croak is bad - throw instead
use Error qw(:try);
use Cwd qw(abs_path);
+use IPC::Open2 qw(open2);
}
@@ -375,6 +377,60 @@ sub command_close_pipe {
_cmd_close($fh, $ctx);
}
+=item command_bidi_pipe ( COMMAND [, ARGUMENTS... ] )
+
+Execute the given C<COMMAND> in the same way as command_output_pipe()
+does but return both an input pipe filehandle and an output pipe filehandle.
+
+The function will return return C<($pid, $pipe_in, $pipe_out, $ctx)>.
+See C<command_close_bidi_pipe()> for details.
+
+=cut
+
+sub command_bidi_pipe {
+ my ($pid, $in, $out);
+ $pid = open2($in, $out, 'git', @_);
+ return ($pid, $in, $out, join(' ', @_));
+}
+
+=item command_close_bidi_pipe ( PID, PIPE_IN, PIPE_OUT [, CTX] )
+
+Close the C<PIPE_IN> and C<PIPE_OUT> as returned from C<command_bidi_pipe()>,
+checking whether the command finished successfully. The optional C<CTX>
+argument is required if you want to see the command name in the error message,
+and it is the fourth value returned by C<command_bidi_pipe()>. The call idiom
+is:
+
+ my ($pid, $in, $out, $ctx) = $r->command_bidi_pipe('cat-file --batch-check');
+ print "000000000\n" $out;
+ while (<$in>) { ... }
+ $r->command_close_bidi_pipe($pid, $in, $out, $ctx);
+
+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.
+
+=cut
+
+sub command_close_bidi_pipe {
+ my ($pid, $in, $out, $ctx) = @_;
+ foreach my $fh ($in, $out) {
+ unless (close $fh) {
+ if ($!) {
+ carp "error closing pipe: $!";
+ } elsif ($? >> 8) {
+ throw Git::Error::Command($ctx, $? >>8);
+ }
+ }
+ }
+
+ waitpid $pid, 0;
+
+ if ($? >> 8) {
+ throw Git::Error::Command($ctx, $? >>8);
+ }
+}
+
=item command_noisy ( COMMAND [, ARGUMENTS... ] )
--
1.5.5.1.152.g9aeb7
next prev parent reply other threads:[~2008-04-23 19:19 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-04-23 19:17 Speed up git-svn fetch Adam Roben
2008-04-23 19:17 ` [PATCH 01/11] Add tests for git cat-file Adam Roben
2008-04-23 19:17 ` [PATCH 02/11] git-cat-file: Small refactor of cmd_cat_file Adam Roben
2008-04-23 19:17 ` [PATCH 03/11] git-cat-file: Make option parsing a little more flexible Adam Roben
2008-04-23 19:17 ` [PATCH 04/11] git-cat-file: Add --batch-check option Adam Roben
2008-04-23 19:17 ` [PATCH 05/11] git-cat-file: Add --batch option Adam Roben
2008-04-23 19:17 ` [PATCH 06/11] Move git-hash-object tests from t5303 to t1007 Adam Roben
2008-04-23 19:17 ` [PATCH 07/11] Add more tests for git hash-object Adam Roben
2008-04-23 19:17 ` [PATCH 08/11] git-hash-object: Add --stdin-paths option Adam Roben
2008-04-23 19:17 ` Adam Roben [this message]
2008-04-23 19:17 ` [PATCH 10/11] Git.pm: Add hash_and_insert_object and cat_blob Adam Roben
2008-04-23 19:17 ` [PATCH 11/11] git-svn: Speed up fetch Adam Roben
2008-04-25 18:04 ` [PATCH 03/11] git-cat-file: Make option parsing a little more flexible Junio C Hamano
2008-04-25 6:56 ` [PATCH 01/11] Add tests for git cat-file Eric Wong
2008-04-25 18:06 ` Junio C Hamano
2008-04-25 18:03 ` Junio C Hamano
2008-05-06 6:41 ` Junio C Hamano
2008-04-23 19:19 ` Speed up git-svn fetch Adam Roben
2008-04-25 7:15 ` Eric Wong
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=1208978273-98146-10-git-send-email-aroben@apple.com \
--to=aroben@apple.com \
--cc=git@vger.kernel.org \
--cc=normalperson@yhbt.net \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).