#!/usr/local/bin/perl -w
#
# version: 3.0
# author: Geert-Jan Giezeman
#
# This script creates a WWW page with a table of test suite results.
#
# Usage:
# create_testpage [-p previous-release]
use Cwd;
use strict;
use vars qw($opt_p);
use Getopt::Std;
my ($PLATFORMS_BESIDE_RESULTS, $PLATFORMS_REF_BETWEEN_RESULTS)=(1,1);
my $SCRIPTDIR = './';
my $TEMPPAGE="tmp$$.html";
my $TEMPPAGE2="tmp2$$.html";
my $WWWPAGE;
my $VERSIONS_WEBPAGE;
my $release_name;
my @platforms_to_do;
my @known_platforms;
my %platform_short_names;
my @available_platforms;
my @test_directories;
my @testresults;
my $currentdir;
my $testresult_dir;
$currentdir=cwd();
$testresult_dir="$currentdir/TESTRESULTS";
sub write_select()
{
my($filename, @result);
print OUTPUTV << "EOF";
CGAL Versions
EOF
print OUTPUTV '";
print OUTPUTV "";
}
sub list_platforms()
{
my ($filename, @result);
foreach $_ (glob("results_*.txt")) {
($filename) = m/results_(.*?)\.txt\s*/;
push(@result, $filename) if $filename;
}
return @result;
}
sub list_packages($)
#
# Fill @test_directories with the packages found in the argument platform.
# Return false if that platform does not have a list of packages.
{
my ($platform) = @_;
@test_directories = ();
my $test_result="results_${platform}.txt";
open(TESTRESULT, $test_result) or return 0;
while () {
if (/^\s*(.*?)\s+(\w)\s*$/) {
push (@test_directories, $1);
}
}
close TESTRESULT or return 0;
return 1;
}
sub collect_results_of_platform($)
{
my ($platform) = @_;
# Create an anonymous hash that hashes packages to their result.
my $platform_results = {};
my $test_result="results_${platform}.txt";
my ($yeahs, $nays, $warnings) = (0,0,0);
my $resulttext;
open(TESTRESULT, $test_result) or return $platform_results;
while () {
if (/^\s*(.*?)\s+(\w)\s*$/) {
#($package,$succes) = ($1,$2);
if ($2 eq 'y' or $2 eq 'Y') {
$resulttext = 'y';
++$yeahs;
} elsif ($2 eq 'w' or $2 eq 'W') {
$resulttext = 'w';
++$warnings;
} elsif ($2 eq 'n' or $2 eq 'N') {
$resulttext = 'n';
++$nays;
} else {
$resulttext = ' ';
}
$platform_results->{$1} = $resulttext;
}
}
close TESTRESULT;
$platform_results->{"y"} = $yeahs;
$platform_results->{"n"} = $nays;
$platform_results->{"w"} = $warnings;
return $platform_results;
}
sub collect_results()
{
my $platform;
foreach $platform (@platforms_to_do) {
last if list_packages($platform);
}
foreach $platform (@platforms_to_do) {
push(@testresults, collect_results_of_platform($platform));
}
}
sub print_result_table()
{
my $platform_count = scalar(@platforms_to_do);
my $pc_plus_2 = $platform_count + 2;
print OUTPUT <<"EOF";
Package
Test Platform
EOF
#
#
#Test Suite Results $release_name
#
my ($platform_num,$platform)=(0,"");
foreach $platform (@platforms_to_do) {
++$platform_num;
print OUTPUT "
$platform_num
\n";
}
print OUTPUT "\n";
my $test_directory;
my $test_num = 0;
foreach $test_directory (@test_directories) {
if ($PLATFORMS_REF_BETWEEN_RESULTS) {
$test_num++;
if ($test_num == 15) {
$test_num = 0;
#print OUTPUT "\n
EOF
if ($PLATFORMS_BESIDE_RESULTS) {
print OUTPUT <<"EOF";
EOF
}
print_result_table();
if ($PLATFORMS_BESIDE_RESULTS) {
print OUTPUT <<"EOF";
EOF
if ($platform_count > 0) {
my $repeat_count = (1 + 1.1/16.5)*scalar(@test_directories)/($platform_count+0.25);
while ($repeat_count >= 1) {
$repeat_count--;
print OUTPUT <<"EOF";
EOF
print_platforms();
print OUTPUT <<"EOF";
EOF
}
}
print OUTPUT <<"EOF";
EOF
}
}
sub parse_platform($)
{
my ($pf) = @_;
$pf =~ s/_LEDA$//;
my @list = split /_/, $pf;
return @list;
}
sub parse_platform_2($)
{
my ($pf) = @_;
my @list = parse_platform($pf);
if (@list > 3) {
splice(@list,0,@list-3);
}
while (@list < 3) {
push(@list,'?');
}
return @list;
}
sub short_pfname($)
{
my @pflist = parse_platform_2($_[0]);
my $shortpf = join('_', $pflist[2], $pflist[1]);
return $shortpf;
}
sub choose_platforms()
{
my (%platform_index, $pf);
# List all platforms for which there are results
@available_platforms = list_platforms();
my $index = 0;
# Put all known platforms in a hash table.
for ($index=0; $index < @known_platforms; $index += 1) {
$pf = $known_platforms[$index];
$platform_index{$pf} = 1;
}
# Check if there are platforms listed that are not known. Warn about this
# and add those platforms at the end of the list of known platforms.
foreach (@available_platforms) {
$pf = $_;
my @pflist = parse_platform_2($pf);
my $shortpf = join('_', $pflist[2], $pflist[1]);
$pf =~ s/^[^_]*_//;
$pf =~ s/_LEDA$//;
if (!exists $platform_index{$shortpf}) {
print STDERR
"Warning: Platform $_ is unknown!\n";
$platform_index{$shortpf} = 1;
push(@known_platforms,$shortpf); # ???
$platform_short_names{$shortpf} = $shortpf;
}
}
# Make a list of all the platforms that are to be treated, in the order they
# appear in the list of known_platforms.
@platforms_to_do = ();
@known_platforms = sort(@known_platforms);
for ($index=0; $index < @known_platforms; $index += 1) {
$pf = $known_platforms[$index];
my $ind2 = 0;
foreach (@available_platforms) {
my $apf = short_pfname($_);
if ($apf eq $pf) {
push(@platforms_to_do, $_);
}
}
}
}
sub print_platform_descriptions()
{
my ($i,$pf_no,$pf) = (0,1);
print OUTPUT <<'EOF';
OS and compiler
tester
LEDA
GMP
CLN
QT
y
w
n
EOF
my ($platform_num)=(0);
foreach $pf (@platforms_to_do) {
print OUTPUT "
\n
$pf_no
\n";
$pf_no++;
my $pf_short = join('_',parse_platform_2($pf));
print OUTPUT "
\n";
$pf_no++;
my $pf_short = short_pfname($pf);
print OUTPUT "
$platform_short_names{$pf_short}
\n";
print OUTPUT "
\n";
}
print OUTPUT "
\n";
}
sub search_previous_release()
{
if (! -r $WWWPAGE) {
print STDERR "Warning: no previous release known.\n";
print STDERR "Did you forget the -p option?.\n";
return;
}
open INPUT, $WWWPAGE or die;
while () {
if (m//) {
$opt_p = $1;
last;
}
}
close INPUT;
}
sub result_filename($)
{
return "results".substr($_[0],4).".html";
# $name =~ s/-I-/-/;
}
sub print_little_header(){
print OUTPUT<<"EOF";
CGAL Test Result Page
The results of the tests are presented in a table
('y' = success, 'w' = warning, 'n' = failure),
and the error + compiler output from each test can be retrieved by clicking
on it.
N.B. The detection of warnings is not exact.
Look at the output to be sure!
EOF
}
print OUTPUT<<'EOF';
EOF
}
sub print_header() {
my ($date,$month,@time_date_info);
@time_date_info = localtime;
$month = ('Jan','Feb','Mar','Apr','May','Jun',
'Jul','Aug','Sep','Oct','Nov','Dec')[$time_date_info[4] ];
$date = "$time_date_info[3] $month ". (1900+$time_date_info[5]);
print OUTPUT<<"EOF";
CGAL Test Result Page
Last modified: $date
EOF
# print OUTPUT `$SCRIPTDIR/print_cgal_header "CGAL Test Result Page"`;
if (defined($opt_p)) {
print OUTPUT "\n";
}
print OUTPUT<<"EOF";
CGAL Test Result Page
This page contains the results from test suite $release_name of supported compilers.
The results of the tests are presented in a table
('y' = success, 'w' = warning, 'n' = failure),
and the error + compiler output from each test can be retrieved by clicking
on it.
N.B. The detection of warnings is not exact.
Look at the output to be sure!