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