8 use vars qw($dbhost $dbname $dbuser $dbpass $dbport);
11 require "$ENV{BFConfDir}/BuildFarmWeb.pl";
14 my @members = $query->param('member');
15 map { s/[^a-zA-Z0-9_ -]//g; } @members;
17 my $dsn="dbi:Pg:dbname=$dbname";
18 $dsn .= ";host=$dbhost" if $dbhost;
19 $dsn .= ";port=$dbport" if $dbport;
23 my $sortby = $query->param('sortby') || 'nosort';
24 if ($sortby eq 'name')
26 $sort_clause = 'lower(sysname),';
28 elsif ($sortby eq 'os')
30 $sort_clause = 'lower(operating_system), os_version desc,';
32 elsif ($sortby eq 'compiler')
34 $sort_clause = "lower(compiler), compiler_version,";
37 my $db = DBI->connect($dsn,$dbuser,$dbpass) or die("$dsn,$dbuser,$dbpass,$!");
39 # there is possibly some redundancy in this query, but it makes
40 # a lot of the processing simpler.
45 select (now() at time zone 'GMT')::timestamp(0) - snapshot as when_ago,
46 sysname, snapshot, b.status, stage, branch, build_flags,
47 operating_system, coalesce(b.os_version,s.os_version) as os_version,
48 compiler, coalesce(b.compiler_version, s.compiler_version)
49 as compiler_version, architecture
52 select distinct on (bs.sysname, bs.branch, bs.report_time)
53 sysname, snapshot, status, stage, branch, build_flags,
54 report_time ,compiler_version, os_version
58 on (p.name = bs.sysname and p.effective_date <= bs.report_time)
59 order by bs.sysname, bs.branch, bs.report_time,
60 p.effective_date is null, p.effective_date desc
63 (select sysname, branch, max(snapshot) as snapshot
65 group by sysname, branch
66 having max(snapshot) > now() - '30 days'::interval
69 and s.status = 'approved'
70 order by branch = 'HEAD' desc,
71 branch desc, $sort_clause
80 my $sth=$db->prepare($statement);
82 while (my $row = $sth->fetchrow_hashref)
84 next if (@members && ! grep {$_ eq $row->{sysname} } @members);
85 $row->{build_flags} =~ s/^\{(.*)\}$/$1/;
86 $row->{build_flags} =~ s/,/ /g;
87 $row->{build_flags} =~ s/--((enable|with)-)?//g;
88 $row->{build_flags} =~ s/libxml/xml/;
89 $row->{build_flags} =~ s/\S+=\S+//g;
90 push(@$statrows,$row);
98 my $template = new Template({});
100 print "Content-Type: text/html\n\n";
102 $template->process(\*DATA,{statrows=>$statrows});
108 [%- BLOCK img ; flag ; END -%]
109 [%- BLOCK imgx ; IF flag_imgs.$flag ; '<img src="' . flag_imgs{flag} . '" alt="' . flag . '" /> ' ; ELSE flag . ' ' ; END ; END -%]
116 perl = '/img/camel.png',
117 python = '/img/python.png',
118 debug = '/img/bug.png',
119 pam => '/img/pam.png',
120 cassert => '/img/cassert.png',
121 openssl => '/img/ssl_icon.gif',
122 nls => '/img/translateicon.gif',
123 krb5 => '/img/krb.gif',
124 tcl => '/img/tcl.png',
125 xml => '/img/xml.png',
126 'thread-safety' => '/img/threads.gif',
127 'integer-datetimes' = '/img/days.png',
130 [%- BLOCK img ; IF flag == 'depend' or flag == 'gnu-ld' ; ; ELSIF flag_imgs.$flag %]<img src="[% flag_imgs.$flag %]" title="[% flag %]" alt="[% flag %]" height="16" width="16" class="inline" align="bottom" /> [% ELSE %][%#
133 [%- BLOCK cl %] class=" [% SWITCH bgfor -%]
134 [%- CASE 'OK' %]pass[% CASE 'ContribCheck' %]warn[% CASE [ 'Check' 'InstallCheck' ] %]warnx[% CASE %]fail[% END %]"
136 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
137 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
138 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
140 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
141 <title>PostgreSQL BuildFarm Status</title>
142 <link rel="icon" type="image/png" href="/elephant-icon.png" />
143 <link rel="stylesheet" rev="stylesheet" href="/inc/pgbf.css" charset="utf-8" />
144 <style type="text/css"><!--
145 li#status a { color:rgb(17,45,137); background: url(/inc/b/r.png) no-repeat 100% -20px; }
146 li#status { background: url(/inc/b/l.png) no-repeat 0% -20px; }
152 <a href="/index.html"><img src="/inc/pgbuildfarm-banner.png" alt="PostgreSQL BuildFarm" width="800" height="73" /></a>
155 <li id="home"><a href="/index.html" title="PostgreSQL BuildFarm Home">Home</a></li>
156 <li id="status"><a href="/cgi-bin/show_status.pl" title="Current results">Status</a></li>
157 <li id="members"><a href="/cgi-bin/show_members.pl" title="Platforms tested">Members</a></li>
158 <li id="register"><a href="/register.html" title="Join PostgreSQL BuildFarm">Register</a></li>
159 <li id="pgfoundry"><a href="http://pgfoundry.org/projects/pgbuildfarm/">PGFoundry</a></li>
160 <li id="postgresql.org"><a href="http://www.postgresql.org">PostgreSQL.org</a></li>
163 </div><!-- banner -->
165 <h1>PostgreSQL BuildFarm Status</h1>
167 Shown here is the latest status of each farm member
168 for each branch it has reported on in the last 30 days.
171 Use the farm member link for history of that member
172 on the relevant branch.
174 <table><tr><th class="head" rowspan="2">Legend</th>
175 [% FOREACH flagset IN flag_imgs %]
176 <td><img src="[% flagset.value %]" title="[% flagset.key %]" alt="[% flagset.key %]" height="16" width="16" class="inline" align="center"/> = [% flagset.key %]</td>
177 [% IF loop.count == 6 %]</tr><tr>[% END %]
181 <table cellspacing="0">
183 [% FOREACH row IN statrows %]
184 [% IF row.branch != brch ; brch = row.branch %]
185 <tr><th class="head" colspan="4">Branch: [% brch %]</th></tr>
186 <tr><th>Alias</th><th>System</th><th>Status</th><th>Flags</th></tr>
188 <tr [% PROCESS cl bgfor=row.stage %]>
190 href="show_history.pl?nm=[% row.sysname %]&br=[% row.branch %]"
192 >[% row.sysname %]</a></td>
193 <td><span class="opsys">[% row.operating_system %]
194 [% row.os_version %]</span> <span class="compiler">
196 [% row.compiler_version %]</span> <span class="arch">
197 [%- row.architecture %]</span></td>
199 [%- row.when_ago | replace('\s',' ') %] ago
201 <a href="show_log.pl?nm=
202 [%- row.sysname %]&dt=
203 [%- row.snapshot | uri %]">
204 [%- IF row.stage != 'OK' %]Details[% ELSE %]Config[% END -%]</a></td>
206 <td class="flags">[% FOREACH flag IN row.build_flags.split().sort() ; PROCESS img ; END %]</td>
212 <p style="text-align: center;">
213 The PostgreSQL Buildfarm website is provided by:
214 <a href="http://www.commandprompt.com">CommandPrompt,
215 The PostgreSQL Company</a> <br />
216 The PostgreSQL community makes it work!
218 </div><!-- wrapper -->