From 30afcadb13f446c99952883bbaa54e102757b682 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 30 Dec 2019 05:04:15 +0000 Subject: spawn: support chdir via -C option This simplifies our admin module a bit and allows solver to be used with v1 inboxes using git versions prior to v1.8.5 (but still >= git v1.8.0). --- lib/PublicInbox/Admin.pm | 31 +++++++++---------------------- 1 file changed, 9 insertions(+), 22 deletions(-) (limited to 'lib/PublicInbox/Admin.pm') diff --git a/lib/PublicInbox/Admin.pm b/lib/PublicInbox/Admin.pm index 5a3554cf..44b44b6e 100644 --- a/lib/PublicInbox/Admin.pm +++ b/lib/PublicInbox/Admin.pm @@ -10,6 +10,7 @@ use Cwd 'abs_path'; use base qw(Exporter); our @EXPORT_OK = qw(resolve_repo_dir); require PublicInbox::Config; +use PublicInbox::Spawn qw(popen_rd); sub resolve_repo_dir { my ($cd, $ver) = @_; @@ -18,28 +19,14 @@ sub resolve_repo_dir { $$ver = 2 if $ver; return abs_path($prefix); } - - my @cmd = qw(git rev-parse --git-dir); - my $cmd = join(' ', @cmd); - my $pid = open my $fh, '-|'; - defined $pid or die "forking $cmd failed: $!\n"; - if ($pid == 0) { - if (defined $cd) { - chdir $cd or die "chdir $cd failed: $!\n"; - } - exec @cmd; - die "Failed to exec $cmd: $!\n"; - } else { - my $dir = eval { - local $/; - <$fh>; - }; - close $fh or die "error in $cmd (cwd:$cd): $!\n"; - chomp $dir; - $$ver = 1 if $ver; - return abs_path($cd) if ($dir eq '.' && defined $cd); - abs_path($dir); - } + my $cmd = [ qw(git rev-parse --git-dir) ]; + my $fh = popen_rd($cmd, undef, {-C => $cd}); + my $dir = do { local $/; <$fh> }; + close $fh or die "error in ".join(' ', @$cmd)." (cwd:$cd): $!\n"; + chomp $dir; + $$ver = 1 if $ver; + return abs_path($cd) if ($dir eq '.' && defined $cd); + abs_path($dir); } # for unconfigured inboxes -- cgit v1.2.3-24-ge0c7