chiark / gitweb /
Memoise git config lookups (big speedup!)
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 14 Jul 2015 19:23:11 +0000 (20:23 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 19 Jul 2015 14:29:02 +0000 (15:29 +0100)
debian/changelog
dgit

index 67086e0fc826c45a8a2fec49927cf0d60fd98111..a1f6ba111fba5388a16c715958f5add0f9edead6 100644 (file)
@@ -1,5 +1,8 @@
 dgit (0.31~~) unstable; urgency=low
 
 dgit (0.31~~) unstable; urgency=low
 
+  Improvements:
+  * Memoise git config lookups (big speedup!)
+
   Documentation:
   * dgit(1): Remove some obsolete caveats from BUGS.
   * dgit(1); Mention that -wgf can avoid need for build-deps.
   Documentation:
   * dgit(1): Remove some obsolete caveats from BUGS.
   * dgit(1); Mention that -wgf can avoid need for build-deps.
@@ -14,7 +17,6 @@ dgit (0.31~~) unstable; urgency=low
   * Make dgit-ssh-dispatch not spew (harmless) warnings if caller
     tries for a shell session (ie SSH_ORIGINAL_COMMAND not set).
 
   * Make dgit-ssh-dispatch not spew (harmless) warnings if caller
     tries for a shell session (ie SSH_ORIGINAL_COMMAND not set).
 
- --
 
 dgit (0.30) unstable; urgency=high
 
 
 dgit (0.30) unstable; urgency=high
 
diff --git a/dgit b/dgit
index 1a2ee88feabca1487696f6abf7d3a406329de9b0..a051622d1617310b3e5555307d2de534a3c024a5 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -485,20 +485,35 @@ our %defcfg = ('dgit.default.distro' => 'debian',
               'dgit-distro.test-dummy.upload-host' => 'test-dummy',
                );
 
               'dgit-distro.test-dummy.upload-host' => 'test-dummy',
                );
 
+sub git_get_config ($) {
+    my ($c) = @_;
+
+    our %git_get_config_memo;
+    if (exists $git_get_config_memo{$c}) {
+       return $git_get_config_memo{$c};
+    }
+
+    my $v;
+    my @cmd = (@git, qw(config --), $c);
+    {
+       local ($debuglevel) = $debuglevel-2;
+       $v = cmdoutput_errok @cmd;
+    };
+    if ($?==0) {
+    } elsif ($?==256) {
+       $v = undef;
+    } else {
+       failedcmd @cmd;
+    }
+    $git_get_config_memo{$c} = $v;
+    return $v;
+}
+
 sub cfg {
     foreach my $c (@_) {
        return undef if $c =~ /RETURN-UNDEF/;
 sub cfg {
     foreach my $c (@_) {
        return undef if $c =~ /RETURN-UNDEF/;
-       my @cmd = (@git, qw(config --), $c);
-       my $v;
-       {
-           local ($debuglevel) = $debuglevel-2;
-           $v = cmdoutput_errok @cmd;
-       };
-       if ($?==0) {
-           return $v;
-       } elsif ($?!=256) {
-           failedcmd @cmd;
-       }
+       my $v = git_get_config($c);
+       return $v if defined $v;
        my $dv = $defcfg{$c};
        return $dv if defined $dv;
     }
        my $dv = $defcfg{$c};
        return $dv if defined $dv;
     }