index: set fail alert only if tests were run
[fateserver.git] / index.cgi
1 #! /usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use FATE;
7
8 opendir D, $fatedir or fail 'Server error: $fatedir not found';
9 my @slots = grep /^[^.]/, readdir D;
10 closedir D;
11
12 my @reps;
13 my $allpass = 0;
14 my $allfail = 0;
15
16 for my $slot (@slots) {
17     my $rep = load_summary $slot, 'latest' or next;
18     push @reps, $rep;
19     if ($$rep{npass} == 0) {
20         $allfail++;
21     } elsif ($$rep{npass} == $$rep{ntests}) {
22         $allpass++;
23     }
24
25     if (my $prev = load_summary $slot, 'previous') {
26         my $nfail = $$rep{ntests}  - $$rep{npass};
27         my $pfail = $$prev{ntests} - $$prev{npass};
28         $$rep{alert} = $$rep{ntests} && $nfail <=> $pfail;
29     }
30 }
31
32 $allpass = int 100 * $allpass / @reps;
33 $allfail = int 100 * $allfail / @reps;
34 my $warn = int 100 - $allpass - $allfail;
35
36 print "Content-type: text/html\r\n\r\n";
37
38 doctype;
39 start 'html', xmlns => "http://www.w3.org/1999/xhtml";
40 start 'head';
41 tag 'meta', 'http-equiv' => "Content-Type",
42             'content'    => "text/html; charset=utf-8";
43 tag 'link', rel  => 'stylesheet',
44             type => 'text/css',
45             href => 'fate.css';
46 print "<title>FATE</title>\n";
47 end 'head';
48
49 start 'body';
50 h1 'FATE';
51
52 start 'table', id => 'index', class => 'replist';
53 start 'thead';
54 start 'tr';
55 start 'td', colspan => 6, id => 'failometer';
56 span '&nbsp;', class => 'pass', style => "width: ${allpass}%";
57 span '&nbsp;', class => 'warn', style => "width: ${warn}%";
58 span '&nbsp;', class => 'fail', style => "width: ${allfail}%";
59 end 'td';
60 end 'tr';
61 trowh 'Time', 'Arch', 'OS', 'Compiler', 'Rev', 'Result';
62 end 'thead';
63 start 'tbody';
64 for my $rep (sort { $$a{slot} cmp $$b{slot} } @reps) {
65     my $ntest = $$rep{ntests};
66     my $npass = $$rep{npass};
67     my $time = parse_date $$rep{date};
68     my $age  = time - $time;
69     my $agestr = agestr $age, $time;
70     my $ageclass = '';
71     my $rtext;
72     my $rclass;
73     my $alert = ('rejoice', '', 'alert')[$$rep{alert} + 1];
74
75     if ($age < $recent_age) {
76         $ageclass = 'recent';
77     } elsif ($age > $ancient_age) {
78         $ageclass = 'ancient';
79     }
80
81     start 'tr', class => "$ageclass $alert alt hilight";
82     start 'td';
83     anchor $agestr, href => "history.cgi?slot=$$rep{slot}";
84     end 'td';
85     td $$rep{subarch} || $$rep{arch};
86     td $$rep{os};
87     td $$rep{cc};
88     td $$rep{rev};
89     if ($npass) {
90         $rtext  = "$npass / $ntest";
91         $rclass = $npass==$ntest? 'pass' : $npass? 'warn' : 'fail';
92     } else {
93         $rtext  = $$rep{errstr};
94         $rclass = 'fail'
95     }
96     start 'td', class => $rclass;
97     anchor $rtext, href => "report.cgi?slot=$$rep{slot}&amp;time=$$rep{date}";
98     end 'td';
99     end 'tr';
100     print "\n";
101 }
102 end 'tbody';
103 end 'table';
104 end 'body';
105 end 'html';