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; @@ -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";