chiark / gitweb /
Introduce defvalopt, new approach for options taking values
[dgit.git] / dgit
diff --git a/dgit b/dgit
index 83969717816bc5286d0566d2d7f1956e1085ad05..b3ddb548357565e0c01ed5d8394ab3d976e8554e 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -3108,6 +3108,23 @@ sub cmd_version {
     exit 0;
 }
 
+our (%valopts_long, %valopts_short);
+our @rvalopts;
+
+sub defvalopt ($$$&) {
+    my ($long,$short,$val_re,$fn) = @_;
+    my $oi = { Long => $long, Short => $short, Re => $val_re, Fn => $fn };
+    $valopts_long{$long} = $oi;
+    $valopts_short{$short} = $oi;
+    # $fn subref should:
+    #   do whatever assignemnt or thing it likes with $_[0]
+    #   if the option should not be passed on to remote, @rvalopts=()
+}
+
+defvalopt '--since-version', '-v', '[^_]+|_', sub {
+    ($changes_since_version) = @_;
+};
+
 sub parseopts () {
     my $om;
 
@@ -3117,6 +3134,8 @@ sub parseopts () {
        @ssh = ($ENV{'GIT_SSH'});
     }
 
+    my $oi;
+
     while (@ARGV) {
        last unless $ARGV[0] =~ m/^-/;
        $_ = shift @ARGV;
@@ -3138,9 +3157,6 @@ sub parseopts () {
            } elsif (m/^--new$/) {
                push @ropts, $_;
                $new_package=1;
-           } elsif (m/^--since-version=([^_]+|_)$/) {
-               push @ropts, $_;
-               $changes_since_version = $1;
            } elsif (m/^--([-0-9a-z]+)=(.+)/s &&
                     ($om = $opts_opt_map{$1}) &&
                     length $om->[0]) {
@@ -3187,6 +3203,18 @@ sub parseopts () {
            } elsif (m/^--deliberately-($deliberately_re)$/s) {
                push @ropts, $_;
                push @deliberatelies, $&;
+           } elsif (m/^(--[-0-9a-z]+)(=|$)/ && ($oi = $valopts_long{$1})) {
+               @rvalopts = ($_);
+               my $val = $'; #';
+               if ($2 eq '') {
+                   badusage "$oi->{Long} needs a value" unless @ARGV;
+                   $val = shift @ARGV;
+                   push @rvalopts, $val;
+               }
+               badusage "bad value for $oi->{Long}" unless
+                   $val =~ m/^$oi->{Re}$(?!\n)/s;
+               $oi->{Fn}($val);
+               push @ropts, @rvalopts;
            } else {
                badusage "unknown long option \`$_'";
            }
@@ -3207,9 +3235,6 @@ sub parseopts () {
                } elsif (s/^-N/-/) {
                    push @ropts, $&;
                    $new_package=1;
-               } elsif (s/^-v([^_]+|_)$//s) {
-                   push @ropts, $&;
-                   $changes_since_version = $1;
                } elsif (m/^-m/) {
                    push @ropts, $&;
                    push @changesopts, $_;
@@ -3228,7 +3253,7 @@ sub parseopts () {
                    }
                } elsif (s/^-k(.+)//s) {
                    $keyid=$1;
-               } elsif (m/^-[vdCk]$/) {
+               } elsif (m/^-[dCk]$/) {
                    badusage
  "option \`$_' requires an argument (and no space before the argument)";
                } elsif (s/^-wn$//s) {
@@ -3249,6 +3274,19 @@ sub parseopts () {
                } elsif (s/^-wc$//s) {
                    push @ropts, $&;
                    $cleanmode = 'check';
+               } elsif (m/^-[a-zA-Z]/ && ($oi = $valopts_short{$&})) {
+                   @rvalopts = ($_);
+                   my $val = $'; #';
+                   if (!length $val) {
+                       badusage "$oi->{Short} needs a value" unless @ARGV;
+                       $val = shift @ARGV;
+                       push @rvalopts, $val;
+                   }
+                   badusage "bad value for $oi->{Short}" unless
+                       $val =~ m/^$oi->{Re}$(?!\n)/s;
+                   $oi->{Fn}($val);
+                   push @ropts, @rvalopts;
+                   $_ = '';
                } else {
                    badusage "unknown short option \`$_'";
                }