Only worktrees need to use `git rev-parse --git-path', so avoid
the spawn overhead of a new process.  With the SolverGit.pm
limit on coderepo scans disabled and scanning over 800 git repos
for git@vger matches, this reduces up xt/solver.t times by
roughly 25%.
---
 lib/PublicInbox/Git.pm | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/lib/PublicInbox/Git.pm b/lib/PublicInbox/Git.pm
index 7c6e15b7..a374649f 100644
--- a/lib/PublicInbox/Git.pm
+++ b/lib/PublicInbox/Git.pm
@@ -100,14 +100,17 @@ sub new {
 sub git_path ($$) {
        my ($self, $path) = @_;
        $self->{-git_path}->{$path} //= do {
-               local $/ = "\n";
-               chomp(my $str = $self->qx(qw(rev-parse --git-path), $path));
-
-               # git prior to 2.5.0 did not understand --git-path
-               if ($str eq "--git-path\n$path") {
-                       $str = "$self->{git_dir}/$path";
+               my $d = "$self->{git_dir}/$path";
+               if (-e $d) {
+                       $d;
+               } else {
+                       local $/ = "\n";
+                       my $s = $self->qx(qw(rev-parse --git-path), $path);
+                       chomp $s;
+
+                       # git prior to 2.5.0 did not understand --git-path
+                       $s eq "--git-path\n$path" ? $d : $s;
                }
-               $str;
        };
 }
 

Reply via email to