chiark / gitweb /
dgit-repos-server: Break apart parsetag()
[dgit.git] / infra / dgit-repos-server
index 61a4b1739a48f4486dfc7e781266fc855d8f0d4b..7b8849a85cfb3162731efc0c469a6f9496da1643 100755 (executable)
@@ -552,7 +552,8 @@ sub readupdates () {
     printdebug " updates ok.\n";
 }
 
-sub parsetag () {
+sub parsetag_general ($$) {
+    my ($mainfn, $dgititemfn) = @_;
     printdebug " parsetag...\n";
     open PT, ">dgit-tmp/plaintext" or die $!;
     open DS, ">dgit-tmp/plaintext.asc" or die $!;
@@ -569,12 +570,8 @@ sub parsetag () {
        }
     }
     $!=0; $_=<T>; defined or die $!;
-    m/^($package_re) release (\S+) for \S+ \((\S+)\) \[dgit\]$/ or
-       reject "tag message not in expected format";
 
-    die unless $1 eq $package;
-    $version = $2;
-    die "$3 != $suite " unless $3 eq $suite;
+    $mainfn->();
 
     my $copyl = $_;
     for (;;) {
@@ -584,13 +581,9 @@ sub parsetag () {
        if (m/^\[dgit ([^"].*)\]$/) { # [dgit "something"] is for future
            $_ = $1." ";
            while (length) {
-               if (s/^distro\=(\S+) //) {
+               if ($dgititemfn->()) {
+               } elsif (s/^distro\=(\S+) //) {
                    die "$1 != $distro" unless $1 eq $distro;
-               } elsif (s/^(--deliberately-$deliberately_re) //) {
-                   push @deliberatelies, $1;
-               } elsif (s/^previously:(\S+)=(\w+) //) {
-                   die "previously $1 twice" if defined $previously{$1};
-                   $previously{$1} = $2;
                } elsif (s/^[-+.=0-9a-z]\S* //) {
                } else {
                    die "unknown dgit info in tag ($_)";
@@ -612,6 +605,26 @@ sub parsetag () {
     printdebug " parsetag ok.\n";
 }
 
+sub parsetag () {
+    parsetag_general sub {
+       m/^($package_re) release (\S+) for \S+ \((\S+)\) \[dgit\]$/ or
+           reject "tag message not in expected format";
+       die unless $1 eq $package;
+       $version = $2;
+       die "$3 != $suite " unless $3 eq $suite;
+    }, sub {
+       if (s/^(--deliberately-$deliberately_re) //) {
+           push @deliberatelies, $1;
+       } elsif (s/^previously:(\S+)=(\w+) //) {
+           die "previously $1 twice" if defined $previously{$1};
+           $previously{$1} = $2;
+       } else {
+           return 0;
+       }
+       return 1;
+    };
+}
+
 sub checksig_keyring ($) {
     my ($keyringfile) = @_;
     # returns primary-keyid if signed by a key in this keyring
@@ -1155,7 +1168,7 @@ sub parseargsdispatch () {
 
     $ENV{"DGIT_DRS_\U$_"} = ${ $main::{$_} } foreach @hookenvs;
 
-    die unless @ARGV==1;
+    die unless @ARGV>=1;
 
     my $mode = shift @ARGV;
     die unless $mode =~ m/^--(\w+)$/;