#!/usr/bin/perl # pretty-printing sub prettytoolset { my $toolset = shift; return "Borland C++ 5.82" if ($toolset eq 'bcc'); return "Metrowerks CodeWarrior 8" if ($toolset eq 'cw'); return "Digital Mars C++ 8.51" if ($toolset eq 'dmc'); return "Sun C++ 5.10" if ($toolset eq 'suncc'); return "Intel C++ Compiler $1.0" if ($toolset =~ /^ic(\d+)$/); return "Intel C++ Compiler $1.0 x64" if ($toolset =~ /^ic(\d+)_x64$/); return "MinGW (GCC $1.$2)" if ($toolset =~ /^mingw(\d)(\d)$/); return "MinGW (GCC $1.$2) x64" if ($toolset =~ /^mingw(\d)(\d)_x64$/); return "Microsoft Visual C++ 7.1" if ($toolset eq 'msvc71'); return "Microsoft Visual C++ $1.0" if ($toolset =~ /^msvc(\d+)$/); return "Microsoft Visual C++ $1.0 x64" if ($toolset =~ /^msvc(\d+)_x64$/); return "GNU C++ Compiler $1" if ($toolset =~ /^gcc(.*)$/); $toolset; } sub prettyplatform { my $platform = shift; return "solaris" if ($platform =~ /solaris/); return "macos" if ($platform =~ /darwin/); return "linux64" if ($platform =~ /64-linux/); return "linux32" if ($platform =~ /86-linux/); return "fbsd64" if ($platform =~ /64-freebsd/); return "fbsd32" if ($platform =~ /86-freebsd/); return "win64" if ($platform =~ /MSWin32-x64/); return "win32" if ($platform =~ /MSWin32/); $platform; } # parse build log %results = (); %toolsets = (); %defines = (); %configurations = (); sub insertindex { my ($hash, $key) = @_; $$hash{$key} = scalar(keys %$hash) unless defined $$hash{$key}; } while (<>) { ### autotest i386-freebsd-64int gcc release [wchar] result 0 97.78 98.85 if (/^### autotest (\S+) (\S+) (\S+) \[(.*?)\] result (\S+) (\S*) (\S*)/) { my ($platform, $toolset, $configuration, $defineset, $result, $coverage_pugixml, $coverage_pugixpath) = ($1, $2, $3, $4, $5, $6, $7); die "Detected duplicate build information $_\n" if defined $results{"$toolset $platform"}{$configuration}{$defineset}; my $fulltool = &prettyplatform($platform) . ' ' . &prettytoolset($toolset); my $fullconf = "$configuration $defineset"; $results{$fulltool}{$fullconf}{result} = $result; $results{$fulltool}{$fullconf}{coverage_pugixml} = $coverage_pugixml; $results{$fulltool}{$fullconf}{coverage_pugixpath} = $coverage_pugixpath; &insertindex(\%toolsets, $fulltool); $defines{$_} = 1 foreach (split /,/, $defineset); &insertindex(\%configurations, $fullconf); } } # make arrays of toolsets and configurations @toolsetarray = (); @configurationarray = (); $toolsetarray[$toolsets{$_}] = $_ foreach (keys %toolsets); $configurationarray[$configurations{$_}] = $_ foreach (keys %configurations); # print header $stylesheet = <pugixml autotest report

pugixml autotest report

END # print configuration header (release/debug) print ""; print "" foreach (@configurationarray); print "\n"; # print defines header (one row for each define) foreach $define (sort {$a cmp $b} keys %defines) { print ""; foreach (@configurationarray) { my $present = ($_ =~ /\b$define\b/); my $color = $present ? "#cccccc" : "#ffffff"; print ""; } print "\n"; } # print data (one row for each toolset) foreach $tool (@toolsetarray) { my ($platform, $toolset) = split(/\s+/, $tool, 2); print ""; foreach (@configurationarray) { my $info = $results{$tool}{$_}; if (!defined $$info{result}) { print ""; } elsif ($$info{result} == 0) { my ($coverage_pugixml, $coverage_pugixpath) = ($$info{coverage_pugixml}, $$info{coverage_pugixpath}); print ""; } else { print "" } } print "\n"; } # print footer $date = localtime; print <
Generated on $date END
configuration".(split /\s+/)[0]."
$define" . ($present ? "+" : " ") . "
$platform$toolset pass"; if ($coverage_pugixml > 0 || $coverage_pugixpath > 0) { print "
" . ($coverage_pugixml + 0) . "%
" . ($coverage_pugixpath + 0) . "%
"; } print "
fail