Fix test and doc internal names
[buildfarm-client.git] / run_build.pl
index 7e9ab32c169a935e95db2e1bccaa191101b6bd76..be324687d8f85aef9053ff429d376999b7173001 100755 (executable)
@@ -126,7 +126,7 @@ if ($skip_steps =~ /\S/)
 $only_steps ||= "";
 if ($only_steps =~ /\S/)
 {
-    %only_steps = map {$_ => 1} split(/\s+/,$only_steps);
+    %only_steps = map {$_ => 1} split(/(\s+|[:,])/,$only_steps);
 }
 
 # Currently only specifying a branch is actually used.
@@ -178,12 +178,22 @@ my  $scm_timeout_secs = $EximBuild::conf{scm_timeout_secs}
 print scalar(localtime()),": buildfarm run for $animal:$branch starting\n"
   if $verbose;
 
+# Allow commandline overrides of conf variables
+foreach my $arg ( @{$EximBuild::Options::overrides} )
+{
+  if (my ($key,$val) = split '=', $arg)
+  {
+    $EximBuild::conf{$key} = $val;
+    printf "Commandline override: '$key' = '%s'\n", $EximBuild::conf{$key}
+      if $verbose;
+  }
+}
+
 if (ref($force_every) eq 'HASH')
 {
     $force_every = $force_every->{$branch} || $force_every->{default};
 }
 
-my $config_opts = $EximBuild::conf{config_opts};
 my $scm = new EximBuild::SCM \%EximBuild::conf;
 
 my $buildport;
@@ -495,9 +505,11 @@ $steps_completed = "";
 
 my @changed_files;
 my @changed_since_success;
+my $last_config;
 my $last_status;
 my $last_run_snap;
 my $last_success_snap;
+my $current_config;
 my $current_snap;
 my @filtered_files;
 my $savescmlog = "";
@@ -543,11 +555,20 @@ elsif (!$from_source)
     unlink "last.success";
 
     # get the timestamp data
+    $last_config = find_last('config') || 0;
     $last_status = find_last('status') || 0;
     $last_run_snap = find_last('run.snap');
     $last_success_snap = find_last('success.snap');
     $forcerun = 1 unless (defined($last_run_snap));
 
+    # If config file changed, force a rebuild
+    ($current_config) = (stat $orig_dir.'/'.$buildconf)[9];
+    if ($current_config > $last_config)
+    {
+      $last_status = 0;
+      set_last('config',$current_config) unless $nostatus;
+    }
+
     # updated by find_changed to last mtime of any file in the repo
     $current_snap=0;
 
@@ -681,6 +702,7 @@ usage: $0 [options] [branch]
   --test                    = short for --nosend --nostatus --verbose --force
   --skip-steps=list         = skip certain steps
   --only-steps=list         = only do certain steps, not allowed with skip-steps
+                              lists can be comma, colon, or space separated
 
 Default branch is HEAD. Usually only the --config option should be necessary.
 
@@ -793,6 +815,7 @@ sub writelog
 
 sub display_features
 {
+    return unless step_wanted('features');
     my @out = `cd $exim
                src/build-*/exim -C test/confs/0000 -bV `;
     my $status = $? >>8;
@@ -828,14 +851,14 @@ sub make
 
 sub make_doc
 {
-    return unless step_wanted('make-doc');
+    return unless step_wanted('build_docs');
     print time_str(),"running make doc ...\n" if $verbose;
 
     my (@makeout);
     @makeout = `cd $exim/doc/doc-docbook/ && \
                 EXIM_VER="4.82" $make everything 2>&1`;
     my $status = $? >>8;
-    writelog('make-doc',\@makeout);
+    writelog('build_docs',\@makeout);
     print "======== make doc log ===========\n",@makeout if ($verbose > 1);
     send_result('Doc',$status,\@makeout) if $status;
     $steps_completed .= " Doc";
@@ -973,7 +996,7 @@ sub make_isolation_check
 
 sub make_test
 {
-    return unless step_wanted('test');
+    return unless step_wanted('make_test');
     print time_str(),"running make test ...\n" if $verbose;
     my $tests_range = $EximBuild::conf{range_num_tests} || "1 4";
     my @makeout;
@@ -987,8 +1010,17 @@ sub make_test
                   ./runtest \$WORKDIR/$exim/src/build-*/exim -CONTINUE $tests_range )2>&1`;
       $status = $? >>8;
       push @makeout, @tmp;
+      # Prepend the failed summary log outputs for ease of reading
+      my $fail_summary = "$exim/test/failed-summary.log";
+      if (-f $fail_summary)
+      {
+        @tmp = `cat $fail_summary`;
+        push @tmp, "\n";
+        unshift @makeout, @tmp;
+        unshift @makeout, "Summary of failed tests:\n";
+      }
     }
-    writelog('test',\@makeout);
+    writelog('make_test',\@makeout);
     print "======== make test logs ===========\n",@makeout
       if ($verbose > 1);
 
@@ -1045,23 +1077,12 @@ sub make_ecpg_check
 
 sub configure
 {
-
-    my @quoted_opts;
-    foreach my $c_opt (@$config_opts)
-    {
-        if ($c_opt =~ /['"]/)
-        {
-            push(@quoted_opts,$c_opt);
-        }
-        else
-        {
-            push(@quoted_opts,"'$c_opt'");
-        }
-    }
+    return unless step_wanted('configure');
+    print time_str(),"creating configuration ...\n" if $verbose;
 
     my $env = $EximBuild::conf{makefile_set};
     my $add = $EximBuild::conf{makefile_add};
-    my $features = $EximBuild::conf{config_features};
+    my $features = $EximBuild::conf{makefile_regex};
 
     my $envstr = "";
     while (my ($key,$val) = each %$env)
@@ -1118,11 +1139,11 @@ sub configure
         push @confout, @tmp;
         @tmp = `cd $exim && perl -pi -e 's/^EXIM_MONITOR=(.*)/# EXIM_MONITOR=\$1/' $local_conf`;
         push @confout, @tmp;
-        for my $feature ( @$features )
+        for my $regex ( @$features )
         {
             @tmp = `cd $exim
-                    perl -pi -e '$feature' $local_conf 2>&1
-                    echo "Changed feature: $feature" `;
+                    perl -pi -e '$regex' $local_conf 2>&1
+                    echo "Used regex: $regex" `;
             push @confout, @tmp;
         }
         # Add the final build file to the display output
@@ -1131,6 +1152,17 @@ sub configure
                 echo "Contents of Local/Makefile:"
                 egrep '^[^#]' $local_conf `;
         push @confout, @tmp;
+        # Build the config_opts array to send to the server
+        chomp @tmp;
+        my @config_opts = grep s/(?:LOOKUP_|EXPERIMENTAL_|USE_)(\S+)=.*/$1/,
+                          @tmp;
+        push @config_opts, grep s/^(?:EXIM_)(PERL|PYTHON)=.*/$1/,
+                           @tmp;
+        # OpenSSL doesn't have a specific USE flag
+        push @config_opts, grep s/^(TLS_LIBS.*-l(ssl|crypto)).*/OPENSSL/,
+                           @tmp;
+        $EximBuild::conf{config_opts} = \@config_opts;
+        
         # Does not matter what the Exim version is, as long as it is valid.
         my $exim_ver = $EximBuild::conf{exim_test_version} || '4.82';
         `cd $exim
@@ -1375,6 +1407,7 @@ sub get_script_config_dump
         orig_env => $orig_env,
     };
     delete $conf->{secret};
+    $Data::Dumper::Sortkeys = 1;
     return  Data::Dumper->Dump([$conf],['Script_Config']);
 }