lib/PublicInbox/Git.pm | 18 ++++++++++++------ diff --git a/lib/PublicInbox/Git.pm b/lib/PublicInbox/Git.pm index d5b1d39d148798b477300d119464c5408cb1e088..97c39aad7468a09db5c0a1a5f68d852745f61a2d 100644 --- a/lib/PublicInbox/Git.pm +++ b/lib/PublicInbox/Git.pm @@ -62,6 +62,8 @@ } sub new { my ($class, $git_dir) = @_; + $git_dir =~ tr!/!/!s; + $git_dir =~ s!/*\z!!s; # may contain {-tmp} field for File::Temp::Dir bless { git_dir => $git_dir, alt_st => '', -git_path => {} }, $class } @@ -110,18 +112,22 @@ truncate($fh, 0) or $self->fail("truncate failed: $!"); } return; } - my ($out_r, $out_w); - pipe($out_r, $out_w) or $self->fail("pipe failed: $!"); - my @cmd = (qw(git), "--git-dir=$self->{git_dir}", + pipe(my ($out_r, $out_w)) or $self->fail("pipe failed: $!"); + my $rdr = { 0 => $out_r }; + my $gd = $self->{git_dir}; + if ($gd =~ s!/([^/]+/[^/]+)\z!/!) { + $rdr->{-C} = $gd; + $gd = $1; + } + my @cmd = (qw(git), "--git-dir=$gd", qw(-c core.abbrev=40 cat-file), $batch); - my $redir = { 0 => $out_r }; if ($err) { my $id = "git.$self->{git_dir}$batch.err"; my $fh = tmpfile($id) or $self->fail("tmpfile($id): $!"); $self->{$err} = $fh; - $redir->{2} = $fh; + $rdr->{2} = $fh; } - my ($in_r, $p) = popen_rd(\@cmd, undef, $redir); + my ($in_r, $p) = popen_rd(\@cmd, undef, $rdr); $self->{$pid} = $p; $self->{"$pid.owner"} = $$; $out_w->autoflush(1);