diff options
author | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2015-07-14 20:23:11 +0100 |
---|---|---|
committer | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2015-07-19 15:29:02 +0100 |
commit | 6a8f914beb77ec4cc36ed0aecb0e5da31a450418 (patch) | |
tree | 853d32237009bfa3071bfd6c155291c49d646c75 | |
parent | 236b11e106008dcf767ede43a5926d9b985f59e7 (diff) |
Memoise git config lookups (big speedup!)
-rw-r--r-- | debian/changelog | 4 | ||||
-rwxr-xr-x | dgit | 37 |
2 files changed, 29 insertions, 12 deletions
diff --git a/debian/changelog b/debian/changelog index 67086e0..a1f6ba1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,8 @@ 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. @@ -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). - -- dgit (0.30) unstable; urgency=high @@ -485,20 +485,35 @@ our %defcfg = ('dgit.default.distro' => 'debian', '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/; - 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; } |