1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#!/usr/bin/env perl 2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#----------------------------------------------------------------- 4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# Quick and dirty script to summarize build information for a 5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# set of nightly runs. 6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# 7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# The results of the nighly regression runs are extracted from 8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# the GMANE mail archive. The URL for a given mail sent to the 9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# valgrind-developers mailing list is 10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# 11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# http://article.gmane.org/gmane.comp.debugging.valgrind.devel/<integer> 12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# 13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# The script extracts information about the regression run from a 14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# block of information at the beginning of the mail. That information 15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# was added beginning October 4, 2011. Therefore, only regression runs 16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# from that date or later can be analyzed. 17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# 18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# There is unfortunately no good way of figuring out the interval 19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# of integers in the above URL that include all nightly regression 20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# runs. 21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# 22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# The function get_regtest_data does all the work. It returns a hash 23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# whose keys are the dates at which nightly runs took place. The value 24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# is in turn a hash. 25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# 26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# Each such hash has the following keys: 27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# "builds" array of hashes 28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# "num_builds" int 29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# "num_failing_builds" int 30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# "num_passing_builds" int 31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# "num_testcase_failures" int 32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# "num_failing_testcases" int 33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# "failure_frequency" hash indexed by testcase name; value = int 34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# 35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# "builds" is an array of hashes with the following keys 36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# "arch" string (architecture) 37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# "distro" string (distribution, e.g. Fedora-15) 38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# "failures" array of strings (failing testcases) 39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# "valgrind revision" integer 40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# "VEX revision" integer 41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# "GCC version" string 42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# "C library" string 43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# "uname -mrs" string 44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# "Vendor version" string 45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# 46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#----------------------------------------------------------------- 47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovuse strict; 48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovuse warnings; 49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovuse LWP::Simple; 51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovuse Getopt::Long; 52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovmy $prog_name = "nightly-build-summary"; 54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovmy $debug = 0; 56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovmy $keep = 0; 57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovmy $usage=<<EOF; 59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovUSAGE 60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $prog_name 62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov --from=INTEGER beginning of mail interval; > 14800 64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov [--to=INTEGER] end of mail interval; default = from + 100 66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov [--debug] verbose mode (debugging) 68436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 69436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov [--keep] write individual emails to files (debugging) 70436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 71436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov [--dump] write results suitable for post-processing 72436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 73436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov [--readable] write results in human readable form (default) 74436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 75436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovEOF 76436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 78436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#----------------------------------------------------------------- 79436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# Search for a line indicating that this is an email containing 80436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# the results of a valgrind regression run. 81436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# Return 1, if found and 0 oherwise. 82436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#----------------------------------------------------------------- 83436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovsub is_regtest_result { 84436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my (@lines) = @_; 85436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 86436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov foreach my $line (@lines) { 87436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return 1 if ($line =~ "^valgrind revision:"); 88436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 89436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 90436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return 0; 91436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 92436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 93436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 94436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#----------------------------------------------------------------- 95436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# Extract information from the run. Don't prep the data here. This 96436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# is done later on. 97436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#----------------------------------------------------------------- 98436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovsub get_raw_data { 99436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my (@lines, $msgno) = @_; 100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my ($i, $n, $line, $date); 101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $n = scalar @lines; 103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my %hash = (); 105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# 1) Locate the section with the info about the environment of this nightly run 107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov for ($i = 0; $i < $n; ++$i) { 108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov last if ($lines[$i] =~ /^valgrind revision:/); 109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov die "no info block in message $msgno" if ($i == $n); 111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# 2) Read the info about the build: compiler, valgrind revision etc. 113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# and put it into a hash. 114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov for ( ; $i < $n; ++$i) { 115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $line = $lines[$i]; 116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov last if ($line =~ /^$/); # empty line indicates end of section 117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my ($key, $value) = split(/:/, $line); 118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $value =~ s/^[ ]*//; # removing leading blanks 119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $hash{$key} = $value; 120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if ($debug) { 123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov foreach my $key (keys %hash) { 124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my ($val) = $hash{$key}; 125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "regtest env: KEY = |$key| VAL = |$val|\n"; 126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# 3) Get the date from when the build was kicked off. 130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov for ( ; $i < $n; ++$i) { 131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $line = $lines[$i]; 132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if ($line =~ /^Started at[ ]+([^ ]+)/) { 134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $date = $1; 135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "DATE = $date\n"; 136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov last; 137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov die "no date found in message $msgno" if ($i == $n); 140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# 4) Find out if the regression run failed or passed 143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $hash{"failures"} = []; 144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov for ($i = $i + 1; $i < $n; ++$i) { 145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $line = $lines[$i]; 146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if ($line =~ /Running regression tests/) { 147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return %hash if ($line =~ /done$/); # regtest succeeded; no failures 148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov die "cannot determine regtest outcome for message $msgno" 149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (! ($line =~ /failed$/)); 150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov last; 151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# 5) Regtest failed; locate the section with the list of failing testcases 155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov for ($i = $i + 1; $i < $n; ++$i) { 156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $line = $lines[$i]; 157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# Match for end-of-line == because line might be split. 158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov last if ($line =~ /==$/); 159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov die "cannot locate failing testcases in message $msgno" if ($i == $n); 161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# 6) Get list of failing testcases 163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov for ($i = $i + 1; $i < $n; ++$i) { 164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $line = $lines[$i]; 165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov last if ($line =~ /^$/); 167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my ($testcase) = (split(/\s+/, $line))[0]; 169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "ADD failing testcase $testcase\n" if ($debug); 170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov push @{$hash{"failures"}}, $testcase; 171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return ($date, %hash); 174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#----------------------------------------------------------------- 178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# Extract architecture; get a pretty name for the distro 179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#----------------------------------------------------------------- 180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovsub prep_regtest_data { 181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my (%hash) = @_; 182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my ($val, $arch, $distro); 183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $val = $hash{"uname -mrs"}; 185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov die "uname -mrs info is missing" if (! defined $val); 186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $arch = (split(/ /, $val))[2]; 187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $val = $hash{"Vendor version"}; 189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov die "Vendor version info is missing" if (! defined $val); 190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if ($val =~ /Fedora release ([0-9]+)/) { 192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $distro = "Fedora-$1"; 193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } elsif ($val =~ /openSUSE ([0-9]+)\.([0-9]+)/) { 194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $distro = "openSUSE-$1.$2"; 195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } elsif ($val =~ /SUSE Linux Enterprise Server 11 SP1/) { 196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $distro = "SLES-11-SP1"; 197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } elsif ($val =~ /Red Hat Enterprise Linux AS release 4/) { 198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $distro = "RHEL-4"; 199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $distro = "UNKNOWN"; 201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# Add architecture and distribution to hash 204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $hash{"arch"} = $arch; 205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $hash{"distro"} = $distro; 206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return %hash; 208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#----------------------------------------------------------------- 212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# Precompute some summary information and record it 213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#----------------------------------------------------------------- 214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovsub precompute_summary_info 215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my (%dates) = @_; 217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov foreach my $date (sort keys %dates) { 219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my %failure_frequency = (); 220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my %nightly = %{ $dates{$date} }; 222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my @builds = @{ $nightly{"builds"} }; 223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $nightly{"num_builds"} = scalar (@builds); 225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $nightly{"num_failing_builds"} = 0; 226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $nightly{"num_testcase_failures"} = 0; 227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov foreach my $build (@builds) { 229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my %regtest_data = %{ $build }; 230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my @failures = @{ $regtest_data{"failures"} }; 232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my $num_fail = scalar (@failures); 233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ++$nightly{"num_failing_builds"} if ($num_fail != 0); 235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $nightly{"num_testcase_failures"} += $num_fail; 236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# Compute how often a testcase failed 238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov foreach my $test ( @failures ) { 239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (defined $failure_frequency{$test}) { 240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ++$failure_frequency{$test}; 241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $failure_frequency{$test} = 1; 243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $nightly{"num_passing_builds"} = 248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $nightly{"num_builds"} - $nightly{"num_failing_builds"}; 249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $nightly{"num_failing_testcases"} = scalar (keys %failure_frequency); 251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $nightly{"failure_frequency"} = { %failure_frequency }; 253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $dates{$date} = { %nightly }; 255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return %dates; 258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#----------------------------------------------------------------- 262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# Get messages from GMANE, and build up a database of results. 263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#----------------------------------------------------------------- 264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovsub get_regtest_data { 265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my ($from, $to) = @_; 266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my $url_base = "http://article.gmane.org/gmane.comp.debugging.valgrind.devel/"; 268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my %dates = (); 270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my $old_date = "-1"; 272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my @builds = (); 273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov for (my $i = $from; $i <= $to; ++$i) { 275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my $url = "$url_base" . "$i"; 276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my $page = get("$url"); 278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if ($keep) { 280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov open (EMAIL, ">$i"); 281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print EMAIL $page; 282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov close(EMAIL); 283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# Detect if the article does not exist. Happens for too large --to= values 286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov last if ($page eq "No such file.\n"); 287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# Split the page into lines 289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my @lines = split(/\n/, $page); 290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# Check whether it contains a regression test result 292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov next if (! is_regtest_result(@lines)); 293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "message $i is a regression test result\n" if ($debug); 294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# Get the raw data 296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my ($date, %regtest_data) = get_raw_data(@lines); 297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov %regtest_data = prep_regtest_data(%regtest_data); 299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if ($date ne $old_date) { 301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my %nightly = (); 302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $nightly{"builds"} = [ @builds ]; 303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $dates{$old_date} = { %nightly } if ($old_date ne "-1"); 304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $old_date = $date; 306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov @builds = (); 307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov push @builds, { %regtest_data }; 310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my %nightly = (); 312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $nightly{"builds"} = [ @builds ]; 313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $dates{$old_date} = { %nightly } if ($old_date ne "-1"); 314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# Convenience: precompute some info we'll be interested in 316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov %dates = precompute_summary_info( %dates ); 317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return %dates; 319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#----------------------------------------------------------------- 323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# Write out the results in a form suitable for automatic post-processing 324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#----------------------------------------------------------------- 325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovsub dump_results { 326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my (%dates) = @_; 327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov foreach my $date (sort keys %dates) { 329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my %nightly = %{ $dates{$date} }; 331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my @builds = @{ $nightly{"builds"} }; 332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov foreach my $build (@builds) { 334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my %regtest_data = %{ $build }; 335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my $arch = $regtest_data{"arch"}; 337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my $distro = $regtest_data{"distro"}; 338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my @failures = @{ $regtest_data{"failures"} }; 339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my $num_fail = scalar (@failures); 340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my $fails = join(":", sort @failures); 341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("Regrun: %s %3d %-10s %-20s %s\n", 343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $date, $num_fail, $arch, $distro, $fails); 344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my %failure_frequency = %{ $nightly{"failure_frequency"} }; 347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov foreach my $test (keys %failure_frequency) { 349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("Test: %s %3d %s\n", 350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $date, $failure_frequency{$test}, $test); 351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("Total: %s builds: %d %d fail %d pass tests: %d fail %d unique\n", 354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $date, $nightly{"num_builds"}, $nightly{"num_failing_builds"}, 355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $nightly{"num_passing_builds"}, $nightly{"num_testcase_failures"}, 356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $nightly{"num_failing_testcases"}); 357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovsub write_readable_results { 362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my (%dates) = @_; 363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov foreach my $date (sort keys %dates) { 365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my %nightly = %{ $dates{$date} }; 366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "$date\n----------\n"; 368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("%3d builds\n", $nightly{"num_builds"}); 370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("%3d builds fail\n", $nightly{"num_failing_builds"}); 371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("%3d builds pass\n", $nightly{"num_passing_builds"}); 372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "\n"; 373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("%3d testcase failures (across all runs)\n", 374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $nightly{"num_testcase_failures"}); 375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("%3d failing testcases (unique)\n", 376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $nightly{"num_failing_testcases"}); 377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "\n"; 378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my @builds = @{ $nightly{"builds"} }; 380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if ($nightly{"num_passing_builds"} != 0) { 382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "Passing builds\n"; 383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "--------------\n"; 384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov foreach my $build (@builds) { 385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my %regtest_data = %{ $build }; 386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my @failures = @{ $regtest_data{"failures"} }; 387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my $num_fail = scalar (@failures); 388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if ($num_fail == 0) { 390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my $arch = $regtest_data{"arch"}; 391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my $distro = $regtest_data{"distro"}; 392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("%-8s %-15s\n", $arch, $distro); 394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "\n"; 396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "\n"; 398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if ($nightly{"num_failing_builds"} != 0) { 401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "Failing builds\n"; 402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "--------------\n"; 403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov foreach my $build (@builds) { 404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my %regtest_data = %{ $build }; 405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my @failures = @{ $regtest_data{"failures"} }; 406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my $num_fail = scalar (@failures); 407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if ($num_fail != 0) { 409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my $arch = $regtest_data{"arch"}; 410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my $distro = $regtest_data{"distro"}; 411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("%-8s %-15s %d failures\n", $arch, $distro, $num_fail); 413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov foreach my $test (@failures) { 414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print " $test\n"; 415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "\n"; 417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "\n"; 420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "Failing testcases and their frequency\n"; 423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "-------------------------------------\n"; 424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my %failure_frequency = %{ $nightly{"failure_frequency"} }; 425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# Sorted in decreasing frequency 427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov foreach my $test (sort {$failure_frequency{$b} cmp $failure_frequency{$a} } 428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov keys %failure_frequency) { 429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("%3d %s\n", $failure_frequency{$test}, $test); 430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "\n"; 432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovsub main 437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my ($from, $to, $dump, $readable); 439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $from = $to = 0; 441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $dump = $readable = 0; 442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov GetOptions( "from=i" => \$from, 444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "to=i" => \$to, 445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "debug" => \$debug, 446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "dump" => \$dump, 447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "keep" => \$keep, 448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "readable" => \$readable 449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ) || die $usage; 450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# 14800 is about Oct 4, 2011 which is when we began including information 452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# about the environment 453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov die $usage if ($from < 14800); 455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $to = $from + 100 if ($to == 0); 457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if ($from > $to) { 459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print STDERR "*** invalid [from,to] interval. Try again\n"; 460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov die $usage; 461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $readable = 1 if ($dump == 0 && $readable == 0); 464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "check message interval [$from...$to]\n" if ($debug); 466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# Get mails from GMANE mail archive 468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my %dates = get_regtest_data($from, $to); 470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov dump_results(%dates) if ($dump); 472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov write_readable_results(%dates) if ($readable); 474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovmain(); 477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovexit 0; 479