From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 3D6DD1F8C8 for ; Wed, 29 Sep 2021 21:25:20 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH] git: shorten --git-dir= in CLI with chdir in spawn Date: Wed, 29 Sep 2021 21:25:20 +0000 Message-Id: <20210929212520.7297-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Long pathnames are difficult to read and distinguish in ps(1) output. Deep paths can also slow down pathname resolution when dealing with loose objects, so we put "cat-file --batch" deeper into the directory tree. Since v2 processes are in the form of $INBOXDIR/all.git, keep the basename of $INBOXDIR in --git-dir= so it's easy to distinguish between processes just by looking at ps(1). While "git -C" also exists, it's only present in git 1.8.5+. We also need to keep in mind the "directory" pointed to by --git-dir= need not be a directory (nor a symlink pointing to one). This reduces pathname resolution overhead for v1 and v2 inbox git processes, but unfortunately not for extindex since that needs to store alternates as absolute paths. --- lib/PublicInbox/Git.pm | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/PublicInbox/Git.pm b/lib/PublicInbox/Git.pm index d5b1d39d..97c39aad 100644 --- a/lib/PublicInbox/Git.pm +++ b/lib/PublicInbox/Git.pm @@ -62,6 +62,8 @@ sub git_quote ($) { 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 @@ sub _bidi_pipe { } 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);