index: allow multiple sorting criteria
[fateserver.git] / history.cgi
1 #! /usr/bin/perl
2 #
3 # Copyright (c) 2011 Mans Rullgard <mans@mansr.com>
4 #
5 # Permission to use, copy, modify, and distribute this software for any
6 # purpose with or without fee is hereby granted, provided that the above
7 # copyright notice and this permission notice appear in all copies.
8 #
9 # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
10 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
12 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16
17 use strict;
18 use warnings;
19
20 use CGI qw/param/;
21 use FATE;
22 use Time::Zone;
23 use HTML::Entities;
24
25 my $slot = param 'slot';
26 my $slotdir = "$fatedir/$slot";
27
28 my $slot_escaped = encode_entities $slot;
29
30 opendir D, $slotdir or fail "Slot $slot_escaped not found";
31 my @reps = grep { /^[0-9]/ and -d "$slotdir/$_" } readdir D;
32 close D;
33
34 @reps or fail "No data in $fatedir";
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 => '//ffmpeg.org/default.css';
46 tag 'link', rel  => 'stylesheet',
47             type => 'text/css',
48             href => '/fate.css';
49 print "<title>FATE: $slot</title>\n";
50 end 'head';
51
52 start 'body';
53 start 'div', id => 'container';
54
55 navbar;
56
57 start 'div', id => 'body';
58
59 h1 "Report history for $slot";
60
61 start 'table', id => 'history', class => 'replist';
62 start 'thead';
63 trowh 'Time', 'Rev', 'Arch', 'OS', 'Compiler', 'Warnings', 'Tests';
64 end 'thead';
65 start 'tbody';
66 for my $date ((sort { $b cmp $a } @reps)[0..49]) {
67     my $rep = load_summary $slot, $date or next;
68     my $ntest = $$rep{ntests};
69     my $npass = $$rep{npass};
70     my $time = parse_date $$rep{date};
71     my $age  = time - tz_local_offset() - $time;
72     my $rtext;
73     my $rclass;
74
75     start 'tr', class => 'alt hilight';
76     td agestr $age, $time;
77     if ($gitweb and $$rep{rev} =~ /(N-)?(.*)/) {
78         start 'td';
79         anchor $$rep{rev}, href => "$gitweb;a=commit;h=$2";
80         end 'td';
81     } else {
82         td $$rep{rev};
83     }
84     td $$rep{subarch} || $$rep{arch};
85     td $$rep{os};
86     td $$rep{cc};
87     td $$rep{nwarn};
88     if ($npass) {
89         $rtext  = "$npass / $ntest";
90         $rclass = $npass==$ntest? 'pass' : $npass? 'warn' : 'fail';
91     } elsif (!$ntest and !$$rep{status}) {
92         $rtext  = "build only";
93         $rclass = $$rep{status}? 'fail' : 'pass';
94     } else {
95         $rtext  = $$rep{errstr};
96         $rclass = 'fail'
97     }
98     start 'td', class => $rclass;
99     anchor $rtext, href => href slot => $$rep{slot}, time => $$rep{date};
100     end 'td';
101     end 'tr';
102     print "\n";
103 }
104 end 'tbody';
105 end 'table';
106 end 'div';
107 end 'div';
108 end 'body';
109 end 'html';