+ pipe($in_r, $in_w) or die "pipe failed: $!\n";
+ pipe($out_r, $out_w) or die "pipe failed: $!\n";
+
+ my @cmd = ('git', "--git-dir=$self->{git_dir}", qw(cat-file --batch));
+ my $pid = fork;
+ defined $pid or die "fork failed: $!\n";
+ if ($pid == 0) {
+ dup2(fileno($out_r), 0) or die "redirect stdin failed: $!\n";
+ dup2(fileno($in_w), 1) or die "redirect stdout failed: $!\n";
+ exec(@cmd) or die 'exec `' . join(' '). "' failed: $!\n";
+ }
+ close $out_r or die "close failed: $!\n";
+ close $in_w or die "close failed: $!\n";
+
+ $self->{in} = $in_r;
+ $self->{out} = $out_w;