Factor version check into separate block in interpret_directive
authorJacob Bachmeyer <jcb@gnu.org>
Thu, 20 Oct 2022 23:52:08 +0000 (18:52 -0500)
committerJacob Bachmeyer <jcb@gnu.org>
Thu, 20 Oct 2022 23:52:08 +0000 (18:52 -0500)
Produced messages are changed; the testsuite is adjusted accordingly.

gatekeeper.pl
testsuite/lib/gatekeeper.exp

index be190c26e31180602858e1a56329edbe4674237d..f9282f3f7e48161387f79cb600ba6b73e026e8f7 100755 (executable)
@@ -1379,6 +1379,27 @@ sub interpret_directive {
   my $filename;
   my $cnt = 0; # TODO: remove this
 
+  {    # Extract version first, since directive elements may be in any order.
+    my @versions = grep $_->[0] eq 'version', @$directive;
+
+    if (scalar @versions == 1) {
+      $versions[0][1] =~ /^(\d+\.\d+)$/
+       or fatal("invalid version $versions[0][1]",1,$directive_file_contents);
+      my $val = $1;  # so far so good
+
+      # We only support version 1.1/1.2 right now!
+      fatal("invalid version $val, not supported",1,$directive_file_contents)
+       if (($val ne '1.1') and ($val ne '1.2'));
+
+      $header{version} = $val;  # TODO:  parse?
+      $info{"version"} = $val; #ok.
+    } elsif (scalar @versions > 1) {
+      fatal("invalid multiple version elements",1,$directive_file_contents);
+    } else {   # no version at all; no longer allowed
+      # This will be caught later, when the operation list is validated.
+    }
+  }
+
   foreach my $item (@$directive) {
     my $tainted_cmd = lc $item->[0];
     my $tainted_val = $item->[1];
@@ -1401,21 +1422,7 @@ sub interpret_directive {
       $filename = $val;
       $info{"filename"} = {"value" => $val, "order" => $cnt++};  # ok.
     } elsif ($tainted_cmd eq 'version') {
-      $tainted_val =~ /^(\d+\.\d+)$/
-       or fatal("invalid version $tainted_val",1,$directive_file_contents);
-      my $val = $1;  # so far so good
-
-      # We only support version 1.1/1.2 right now!
-      fatal("invalid version $val, not supported",1,$directive_file_contents)
-       if (($val ne '1.1') and ($val ne '1.2'));
-
-      # Only let them specify one version directive.
-      fatal("invalid second version $val, have $info{version}",
-           1,$directive_file_contents)
-       if exists $info{"version"};
-
-      $header{version} = $val;  # TODO:  parse?
-      $info{"version"} = $val; #ok.
+      # already handled above
     } elsif ($tainted_cmd eq 'symlink') {
       $tainted_val =~ /^($RE_filename_relative)\s+($RE_filename_relative)$/
        or fatal("invalid parameters for symlink command: $tainted_val",
index 1fb59d779ebe33f40dd1aec5157705d1a02ce475..ff6d7c2ea095311d2874a161c0fed8ced771df1b 100644 (file)
@@ -679,7 +679,7 @@ proc analyze_log { base_dir name assess } {
                     exp_continue
                 }
        -re {^gatekeeper\[[0-9]+\]: \(Test\)\
-                invalid second version ([^,]+), have ([^\r\n]+)} {
+                invalid multiple version elements} {
                     # from read_directive_file, if version repeated
                     set A(validate,bad-version-repeat) 1
                     exp_continue