chiark / gitweb /
Option parsing: Redo .opts-CMD parsing to use insertpos
[dgit.git] / dgit
diff --git a/dgit b/dgit
index de14f92bb7d7394f474b262ec470b19bb99bf7e7..7d2023e5c91ab266d3c94a81b9cd8f8ad5497c44 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -98,7 +98,11 @@ our %opts_opt_map = ('dget' => \@dget, # accept for compatibility
                      'mergechanges' => \@mergechanges);
 
 our %opts_opt_cmdonly = ('gpg' => 1);
-our %opts_opt_cmdline_opts;
+our %opts_cfg_insertpos = map {
+    $_,
+    scalar @{ $opts_opt_map{$_} }
+} keys %opts_opt_map;
+
 sub finalise_opts_opts();
 
 our $keyid;
@@ -645,7 +649,7 @@ sub access_distros () {
     @l;
 }
 
-sub access_cfg (@) {
+sub access_cfg_cfgs (@) {
     my (@keys) = @_;
     my @cfgs;
     # The nesting of these loops determines the search order.  We put
@@ -672,6 +676,12 @@ sub access_cfg (@) {
     }
     push @cfgs, map { "dgit.default.$_" } @realkeys;
     push @cfgs, @rundef;
+    return @cfgs;
+}
+
+sub access_cfg (@) {
+    my (@keys) = @_;
+    my (@cfgs) = access_cfg_cfgs(@keys);
     my $value = cfg(@cfgs);
     return $value;
 }
@@ -3050,7 +3060,7 @@ sub parseopts () {
                     !$opts_opt_cmdonly{$1} &&
                     ($om = $opts_opt_map{$1})) {
                push @ropts, $_;
-               push @{ $opts_opt_cmdline_opts{$1} }, $2;
+               push @$om, $2;
            } elsif (m/^--existing-package=(.*)/s) {
                push @ropts, $_;
                $existing_package = $1;
@@ -3158,8 +3168,33 @@ sub parseopts () {
 }
 
 sub finalise_opts_opts () {
-    foreach my $k (keys %opts_opt_cmdline_opts) {
-       push @{ $opts_opt_map{$k} }, @{ $opts_opt_cmdline_opts{$k} };
+    foreach my $k (keys %opts_opt_map) {
+       my $om = $opts_opt_map{$k};
+
+       my $v = access_cfg("cmd-$k", 'RETURN-UNDEF');
+       if (defined $v) {
+           badcfg "cannot set command for $k"
+               unless length $om->[0];
+           $om->[0] = $v;
+       }
+
+       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;
+           }
+       }
     }
 }