diff --git a/common/prettify.pm b/common/prettify.pm
index 53aaa14b7..cb4d8b807 100644
--- a/common/prettify.pm
+++ b/common/prettify.pm
@@ -369,6 +369,7 @@ sub new ($)
my $self = {};
my $basename = shift;
my $buildname = shift;
+ my $failed_tests = shift;
my $rev_link = shift;
my $log_prefix = shift;
@@ -383,6 +384,7 @@ sub new ($)
$self->{SUBSECTION_COUNTER} = 0;
$self->{TITLE} = "Failed Test Brief Log By Build";
$self->{GIT_CHECKEDOUT_OPENDDS} = "unknown";
+ $self->{FAILED_TESTS} = $failed_tests;
$self->{REV_LINK} = $rev_link;
unless (-e $filename) {
@@ -393,6 +395,8 @@ sub new ($)
$self->{FH} = new FileHandle ($filename, '>>');
$self->{FILENAME} = $filename;
$self->{BUILDNAME} = $buildname;
+ $self->{USE_BUILDNAME} = '';
+ $self->{CURRENT_SUBSECTION} = '';
bless ($self, $class);
return $self;
@@ -401,7 +405,6 @@ sub new ($)
sub Header ()
{
my $self = shift;
-
if (defined $self->{LAST_SECTION} && $self->{LAST_SECTION} eq 'Test') {
print {$self->{FH}} "\n";
print {$self->{FH}} "
\n";
@@ -471,29 +474,42 @@ sub Subsection ($)
sub Print_Sections ()
{
my $self = shift;
+ my $rev = substr($self->{GIT_CHECKEDOUT_OPENDDS}, 0, 8);
+ my $rev_line = "";
+ if ($rev ne "unknown") {
+ $rev_line = "Rev: ";
+ if (length($self->{REV_LINK})) {
+ $rev_line .= "{REV_LINK}";
+ $rev_line =~ s/\/$//g;
+ $rev_line .= "/$rev>";
+ }
+ $rev_line .= $rev;
+ if (length($self->{REV_LINK})) {
+ $rev_line .= "";
+ }
+ }
if (defined $self->{LAST_SECTION} && defined $self->{LAST_SUBSECTION} && $self->{LAST_SECTION} eq 'Test') {
- if (defined $self->{BUILDNAME}) {
- print {$self->{FH}} "
$self->{BUILDNAME}
\n";
- my $rev = substr($self->{GIT_CHECKEDOUT_OPENDDS}, 0, 8);
+ if (defined $self->{USE_BUILDNAME}) {
+ print {$self->{FH}} "
$self->{BUILDNAME}
";
if ($rev ne "unknown") {
- my $rev_line = "Rev: ";
- if (length($self->{REV_LINK})) {
- $rev_line .= "{REV_LINK}";
- $rev_line =~ s/\/$//g;
- $rev_line .= "/$rev>";
- }
- $rev_line .= $rev;
- if (length($self->{REV_LINK})) {
- $rev_line .= "";
- }
- print {$self->{FH}} "$rev_line
\n";
- }
- $self->{BUILDNAME} = undef;
+ print {$self->{FH}} "$rev_line\n";
+ }
+ $self->{USE_BUILDNAME} = undef;
+ }
+
+ if (defined $self->{FAILED_TESTS}->{$self->{LAST_SUBSECTION}}) {
+ $self->{FAILED_TESTS}->{$self->{LAST_SUBSECTION}} = $self->{FAILED_TESTS}->{$self->{LAST_SUBSECTION}} . "$self->{BUILDNAME}
\n$rev_line
";
+ }
+ else {
+ $self->{FAILED_TESTS}->{$self->{LAST_SUBSECTION}} = "$self->{BUILDNAME}
\n$rev_line
";
}
print {$self->{FH}} "{SUBSECTION_COUNTER}\">";
- print {$self->{FH}} "$self->{LAST_SUBSECTION}
\n";
+ print {$self->{FH}} "$self->{LAST_SUBSECTION}
";
+
+ $self->{CURRENT_SUBSECTION} = $self->{LAST_SUBSECTION};
+
$self->{LAST_SUBSECTION} = undef;
}
}
@@ -504,7 +520,6 @@ sub Error ($)
my $s = shift;
if (defined $self->{LAST_SECTION} && $self->{LAST_SECTION} eq 'Test') {
-
# Escape any '<' or '>' signs
$s =~ s/</g;
$s =~ s/>/>/g;
@@ -513,10 +528,17 @@ sub Error ($)
$self->Print_Sections ();
- print {$self->{FH}} "\n";
- print {$self->{FH}} "[{FULLHTML}#error_$counter"
- . "\">Details] ";
- print {$self->{FH}} "$s
\n";
+ my $Err1 = "\n";
+ my $Err2 = "[{FULLHTML}#error_$counter" . "\">Details] ";
+ my $Err3 = "$s
\n";
+
+ print {$self->{FH}} $Err1;
+ print {$self->{FH}} $Err2;
+ print {$self->{FH}} $Err3;
+
+ $self->{FAILED_TESTS}->{$self->{CURRENT_SUBSECTION}} = $self->{FAILED_TESTS}->{$self->{CURRENT_SUBSECTION}} . $Err1;
+ $self->{FAILED_TESTS}->{$self->{CURRENT_SUBSECTION}} = $self->{FAILED_TESTS}->{$self->{CURRENT_SUBSECTION}} . $Err2;
+ $self->{FAILED_TESTS}->{$self->{CURRENT_SUBSECTION}} = $self->{FAILED_TESTS}->{$self->{CURRENT_SUBSECTION}} . $Err3;
}
}
@@ -534,10 +556,17 @@ sub Warning ($)
$self->Print_Sections ();
- print {$self->{FH}} "\n";
- print {$self->{FH}} "[{FULLHTML}#warning_$counter"
- . "\">Details] ";
- print {$self->{FH}} "$s
\n";
+ my $Warning1 = "\n";
+ my $Warning2 = "[{FULLHTML}#warning_$counter\">Details] ";
+ my $Warning3 = "$s
\n";
+
+ print {$self->{FH}} $Warning1;
+ print {$self->{FH}} $Warning2;
+ print {$self->{FH}} $Warning3;
+
+ $self->{FAILED_TESTS}->{$self->{CURRENT_SUBSECTION}} = $self->{FAILED_TESTS}->{$self->{CURRENT_SUBSECTION}} . $Warning1;
+ $self->{FAILED_TESTS}->{$self->{CURRENT_SUBSECTION}} = $self->{FAILED_TESTS}->{$self->{CURRENT_SUBSECTION}} . $Warning2;
+ $self->{FAILED_TESTS}->{$self->{CURRENT_SUBSECTION}} = $self->{FAILED_TESTS}->{$self->{CURRENT_SUBSECTION}} . $Warning3;
}
}
@@ -1060,48 +1089,72 @@ use FileHandle;
###############################################################################
-sub new ($$$$$$)
+sub new ($$$$$$$$)
{
my $proto = shift;
my $class = ref ($proto) || $proto;
my $self = {};
my $basename = shift;
my $buildname = shift;
+ my $failed_tests_ref = shift;
my $skip_failed_test_logs = shift;
my $rev_link = shift;
my $log_prefix = shift;
+ my $failed_tests_only = shift;
# Initialize some variables
$self->{STATE} = '';
$self->{LAST_SECTION} = '';
$self->{LAST_DESCRIPTION} = '';
-
- # Initialize the hash table of handlers for each section
-
- %{$self->{HANDLERS}} =
- (
- 'begin' => \&Normal_Handler,
- 'setup' => \&Setup_Handler,
- 'config' => \&Config_Handler,
- 'configure' => \&Autoconf_Handler,
- 'compile' => \&Compile_Handler,
- 'test' => \&Test_Handler,
- 'end' => \&Normal_Handler
- );
-
- # Initialize the list of output classes
-
- @{$self->{OUTPUT}} =
- (
- new Prettify::Full_HTML ($basename), #Must be 0
- new Prettify::Brief_HTML ($basename),
- new Prettify::Totals_HTML ($basename), #Must be 2
- new Prettify::Config_HTML ($basename), #Must be 3
- );
+ $self->{FAILED_TESTS} = $failed_tests_ref;
+ $self->{FAILED_TESTS_ONLY} = $failed_tests_only;
+
+ if ($failed_tests_only) {
+ $self->{TOTALS} = new Prettify::Totals_HTML ($basename);
+ }
+
+ if (!$failed_tests_only) {
+ # Initialize the hash table of handlers for each section
+
+ %{$self->{HANDLERS}} =
+ (
+ 'begin' => \&Normal_Handler,
+ 'setup' => \&Setup_Handler,
+ 'config' => \&Config_Handler,
+ 'configure' => \&Autoconf_Handler,
+ 'compile' => \&Compile_Handler,
+ 'test' => \&Test_Handler,
+ 'end' => \&Normal_Handler
+ );
+
+ # Initialize the list of output classes
+
+ @{$self->{OUTPUT}} =
+ (
+ new Prettify::Full_HTML ($basename), #Must be at 0
+ new Prettify::Brief_HTML ($basename),
+ new Prettify::Totals_HTML ($basename), #Must be at 2
+ new Prettify::Config_HTML ($basename), #Must be at 3
+ );
- if (!$skip_failed_test_logs) {
- push @{$self->{OUTPUT}}, new Prettify::Failed_Tests_HTML ($basename, $buildname, $rev_link, $log_prefix); #Must be 4, if used
+ if (!$skip_failed_test_logs) {
+ push @{$self->{OUTPUT}}, new Prettify::Failed_Tests_HTML ($basename, $buildname, $self->{FAILED_TESTS}, $rev_link, $log_prefix); #Must be at 4, if used with other reports
+ }
+ }
+ elsif (!$skip_failed_test_logs) {
+ %{$self->{HANDLERS}} =
+ (
+ 'begin' => \&Normal_Handler,
+ 'setup' => \&Setup_Handler,
+ 'config' => \&Config_Handler,
+ 'test' => \&Test_Handler,
+ );
+
+ @{$self->{OUTPUT}} =
+ (
+ new Prettify::Failed_Tests_HTML ($basename, $buildname, $self->{FAILED_TESTS}, $rev_link, $log_prefix),
+ );
}
my $junit = main::GetVariable ('junit_xml_output');
@@ -1316,7 +1369,7 @@ sub Setup_Handler ($)
return;
}
- my $totals= (@{$self->{OUTPUT}})[2];
+ my $totals= $self->{FAILED_TESTS_ONLY} ? $self->{TOTALS} : (@{$self->{OUTPUT}})[2];
if ($s =~ m/Executing: (?:.*\/)?cvs(?:.exe)? /i) ## Prismtech still use some CVS please leave
{
@@ -1448,11 +1501,10 @@ sub Setup_Handler ($)
elsif ("$totals->{GIT_CHECKEDOUT_OPENDDS}" eq "Matched")
{
$totals->{GIT_CHECKEDOUT_OPENDDS} = $sha;
- if (exists ($self->{OUTPUT}[4]))
+ if (exists ($self->{OUTPUT}[$self->{FAILED_TESTS_ONLY} ? 0 : 4]))
{
- (@{$self->{OUTPUT}})[4]->{GIT_CHECKEDOUT_OPENDDS} = $sha;
+ (@{$self->{OUTPUT}})[$self->{FAILED_TESTS_ONLY} ? 0 : 4]->{GIT_CHECKEDOUT_OPENDDS} = $sha;
}
-
}
$self->Output_Normal ($s);
}
@@ -1523,10 +1575,12 @@ sub Config_Handler ($)
my $state = $self->{STATE};
# We only want to output config stuff to the Config_HTML class (and FULL)
- $outputs[0]->Normal($s, $state);
- $outputs[3]->Normal($s, $state);
+ if (!$self->{FAILED_TESTS_ONLY}){
+ $outputs[0]->Normal($s, $state);
+ $outputs[3]->Normal($s, $state);
+ }
- my $totals= (@{$self->{OUTPUT}})[2];
+ my $totals= $self->{FAILED_TESTS_ONLY} ? $self->{TOTALS} : (@{$self->{OUTPUT}})[2];
if ($s =~ m/SVN_REVISION(_(\d))?=(\d+)/)
{
@@ -1583,9 +1637,9 @@ sub Config_Handler ($)
my $revision = $totals->{GIT_REVISIONS}[0];
print "Matched GIT url to revision $revision\n";
$totals->{GIT_CHECKEDOUT_OPENDDS} = $revision;
- if (exists ($self->{OUTPUT}[4]))
+ if (exists ($self->{OUTPUT}[$self->{FAILED_TESTS_ONLY} ? 0 : 4]))
{
- (@{$self->{OUTPUT}})[4]->{GIT_CHECKEDOUT_OPENDDS} = $revision;
+ (@{$self->{OUTPUT}})[$self->{FAILED_TESTS_ONLY} ? 0 : 4]->{GIT_CHECKEDOUT_OPENDDS} = $revision;
}
}
}
@@ -1720,17 +1774,19 @@ sub BuildErrors ($)
# In this function we process the log file line by line,
# looking for errors.
-sub Process ($;$$$$)
+sub Process ($;$$$$$$)
{
my $filename = shift;
my $basename = $filename;
$basename =~ s/\.txt$//;
my $buildname = shift // "";
+ my $failed_tests_ref = shift // {};
my $skip_failed_test_logs = shift // 1;
my $rev_link = shift // "";
my $log_prefix = shift // "";
+ my $failed_tests_only = shift // 0;
- my $processor = new Prettify ($basename, $buildname, $skip_failed_test_logs, $rev_link, $log_prefix);
+ my $processor = new Prettify ($basename, $buildname, $failed_tests_ref, $skip_failed_test_logs, $rev_link, $log_prefix, $failed_tests_only);
my $input = new FileHandle ($filename, 'r');
@@ -1744,12 +1800,14 @@ sub Process ($;$$$$)
# notification if MAIL_ADMIN was specified in the XML config
# file.
- my @errors = $processor->BuildErrors();
- my $mail_admin = main::GetVariable ( 'MAIL_ADMIN' );
- my $mail_admin_file = main::GetVariable ( 'MAIL_ADMIN_FILE' );
- if ( (scalar( @errors ) > 0) && ((defined $mail_admin) || (defined $mail_admin_file)) )
- {
- $processor->SendEmailNotification();
+ if (!$failed_tests_only) {
+ my @errors = $processor->BuildErrors();
+ my $mail_admin = main::GetVariable ( 'MAIL_ADMIN' );
+ my $mail_admin_file = main::GetVariable ( 'MAIL_ADMIN_FILE' );
+ if ( (scalar( @errors ) > 0) && ((defined $mail_admin) || (defined $mail_admin_file)) )
+ {
+ $processor->SendEmailNotification();
+ }
}
return $processor;
diff --git a/scoreboard.pl b/scoreboard.pl
index 376235ea3..859d79250 100755
--- a/scoreboard.pl
+++ b/scoreboard.pl
@@ -152,9 +152,14 @@ ($$)
print $indexhtml "\n
\n";
### Failed Test Reports
- print $indexhtml "
Failed Test Brief Log By Build
\n";
-
+
+ if (!$use_build_logs) {
+ print $indexhtml "
Failed Test Brief Log By Build
\n";
+ print $indexhtml "
Failed Test Brief Log By Test
\n";
+ }
+
### Print timestamp
+
print $indexhtml '
Last updated at ' . get_time_str() . "
\n";
### Print the Footer
@@ -504,6 +509,9 @@ ($)
sub update_cache ($)
{
my $directory = shift;
+ my %failed_tests_by_test;
+ my $failed_tests_by_test_ref = \%failed_tests_by_test;
+
print "Updating Local Cache\n" if ($verbose);
@@ -543,11 +551,20 @@ ($)
}
print " Prettifying\n" if($verbose);
-
- Prettify::Process ("$directory/$buildname/$filename", $buildname, $use_build_logs, $builds{$buildname}->{DIFFROOT}, "$directory/$log_prefix");
+ Prettify::Process ("$directory/$buildname/$filename", $buildname, $failed_tests_by_test_ref, $use_build_logs, $builds{$buildname}->{DIFFROOT}, "$directory/$log_prefix");
}
}
}
+
+ my $failed_tests_by_test_file_name = $directory . "/" . $log_prefix . "_Failed_Tests_By_Test.html";
+ my $failed_tests_by_test_file = new FileHandle ($failed_tests_by_test_file_name, 'w');
+ my $title = "Failed Test Brief Log By Test";
+ print {$failed_tests_by_test_file} "$title
\n";
+
+ while (my ($k, $v) = each %failed_tests_by_test) {
+ print {$failed_tests_by_test_file} "
$k
\n";
+ print {$failed_tests_by_test_file} "$v
\n";
+ }
}
###############################################################################
@@ -564,6 +581,8 @@ ($)
sub local_update_cache ($)
{
my $directory = shift;
+ my %failed_tests_by_test;
+ my $failed_tests_by_test_ref = \%failed_tests_by_test;
print "Updating Local Cache\n" if ($verbose);
@@ -572,7 +591,12 @@ ($)
return;
}
- my $failed_tests = $directory . "/" . $log_prefix . "_Failed_Tests_By_Build.html";
+ my $failed_tests = $directory . "/" . $log_prefix . "_Failed_Tests_By_Build.html";
+ if (-e $failed_tests) {
+ unlink $failed_tests;
+ }
+
+ $failed_tests = $directory . "/" . $log_prefix . "_Failed_Tests_By_Test.html";
if (-e $failed_tests) {
unlink $failed_tests;
}
@@ -661,10 +685,12 @@ ($)
foreach my $file (@existing) {
if ( -e $file . "_Totals.html" || $post == 1 ) {
- print " Prettifying $file.txt\n" if($verbose);
-
- Prettify::Process ("$file.txt", $buildname, $use_build_logs, $builds{$buildname}->{DIFFROOT}, "$directory/$log_prefix");
- $updated++;
+ # skip scenario when Failed Test Log is not needed, and all other logs already exist
+ if (!($use_build_logs && (-e $file . "_Totals.html"))) {
+ print " Prettifying $file.txt\n" if($verbose);
+ Prettify::Process ("$file.txt", $buildname, $failed_tests_by_test_ref, $use_build_logs, $builds{$buildname}->{DIFFROOT}, "$directory/$log_prefix", (-e $file . "_Totals.html"));
+ $updated++;
+ }
} else {
# Create the triggerfile for the next time we run
open(FH, ">$triggerfile");
@@ -764,6 +790,16 @@ ($)
$builds{$buildname}{CVS_TIMESTAMP} = $1; ## PRISMTECH still use some cvs, please leave
}
}
+
+ my $failed_tests_by_test_file_name = $directory . "/" . $log_prefix . "_Failed_Tests_By_Test.html";
+ my $failed_tests_by_test_file = new FileHandle ($failed_tests_by_test_file_name, 'w');
+ my $title = "Failed Test Brief Log By Test";
+ print {$failed_tests_by_test_file} "$title
\n";
+
+ while (my ($k, $v) = each %failed_tests_by_test) {
+ print {$failed_tests_by_test_file} "
$k
\n";
+ print {$failed_tests_by_test_file} "$v
\n";
+ }
}
@@ -794,6 +830,11 @@ ($)
unlink $failed_tests;
}
+ $failed_tests = $directory . "/" . $log_prefix . "_Failed_Tests_By_Test.html";
+ if (-e $failed_tests) {
+ unlink $failed_tests;
+ }
+
foreach my $buildname (keys %builds) {
### Do we use the local cache or do we work
### with the storage of the build itself?
@@ -1155,6 +1196,7 @@ ($$$)
if (!$use_build_logs) {
print $indexhtml "
Failed Test Brief Log By Build
\n";
+ print $indexhtml "
Failed Test Brief Log By Test
\n";
}
print $indexhtml '
Last updated at ' . get_time_str() . "
\n";