From 2a783a5377b3fe4b26b9b58a2aa194a16acfa9f9 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 26 Jul 2015 21:05:46 +0100 Subject: Slurp in entire git config, for better performance. --- debian/changelog | 1 + dgit | 68 +++++++++++++++++++++++++++++--------------------------- 2 files changed, 36 insertions(+), 33 deletions(-) diff --git a/debian/changelog b/debian/changelog index 8067f39..8a3490b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -39,6 +39,7 @@ dgit (1.1~~) unstable; urgency=low * Print a supplementary message when push fails, giving advice to the user about how to retry. Closes:#793144. * Honour dgit-distros.DISTRO.cmd-CMD and .opts-CMD. Closes:#793427. + * Slurp in entire git config, for better performance. -- diff --git a/dgit b/dgit index 7d2023e..bcb6a9c 100755 --- a/dgit +++ b/dgit @@ -503,28 +503,34 @@ our %defcfg = ('dgit.default.distro' => 'debian', 'dgit-distro.test-dummy.upload-host' => 'test-dummy', ); -sub git_get_config ($) { - my ($c) = @_; +our %gitcfg; - our %git_get_config_memo; - if (exists $git_get_config_memo{$c}) { - return $git_get_config_memo{$c}; - } +sub git_slurp_config () { + local ($debuglevel) = $debuglevel-2; + local $/="\0"; - 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; + my @cmd = (@git, qw(config -z --get-regexp .*)); + debugcmd "|",@cmd; + + open GITS, "-|", @cmd or failedcmd @cmd; + while () { + chomp or die; + printdebug "=> ", (messagequote $_), "\n"; + m/\n/ or die "$_ ?"; + push @{ $gitcfg{$`} }, $'; #'; } - $git_get_config_memo{$c} = $v; - return $v; + $!=0; $?=0; + close GITS + or ($!==0 && $?==256) + or failedcmd @cmd; +} + +sub git_get_config ($) { + my ($c) = @_; + my $l = $gitcfg{$c}; + $l or return undef; + @$l==1 or badcfg "multiple values for $c" if @$l > 1; + return $l->[0]; } sub cfg { @@ -3180,29 +3186,25 @@ sub finalise_opts_opts () { foreach my $c (access_cfg_cfgs("opts-$k")) { local ($debuglevel) = $debuglevel-2; - my @cmd = (@git, qw(config -z --get-all), $c); - my $vs = cmdoutput_errok @cmd; - if ($?==0) { - badcfg "cannot configure options for $k" - if $opts_opt_cmdonly{$k}; - my $insertpos = $opts_cfg_insertpos{$k}; - @$om = ( @$om[0..$insertpos-1], - (split /\0/, $vs), - @$om[$insertpos..$#$om] ); - } elsif ($?==256) { - die "$k $c ?" if length $vs; - } else { - failedcmd @cmd; - } + my $vl = $gitcfg{$c}; + next unless $vl; + badcfg "cannot configure options for $k" + if $opts_opt_cmdonly{$k}; + my $insertpos = $opts_cfg_insertpos{$k}; + @$om = ( @$om[0..$insertpos-1], + @$vl, + @$om[$insertpos..$#$om] ); } } } if ($ENV{$fakeeditorenv}) { + git_slurp_config(); quilt_fixup_editor(); } parseopts(); +git_slurp_config(); print STDERR "DRY RUN ONLY\n" if $dryrun_level > 1; print STDERR "DAMP RUN - WILL MAKE LOCAL (UNSIGNED) CHANGES\n" -- cgit v1.2.3