1 | <!DOCTYPE html |
---|
2 | PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" |
---|
3 | "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
---|
4 | <html xmlns="http://www.w3.org/1999/xhtml" |
---|
5 | xmlns:xi="http://www.w3.org/2001/XInclude" |
---|
6 | xmlns:py="http://genshi.edgewall.org/"> |
---|
7 | <xi:include href="layout.html" /> |
---|
8 | <xi:include href="macros.html" /> |
---|
9 | <head> |
---|
10 | <title>$title</title> |
---|
11 | <script type="text/javascript" src="${req.href.chrome('bitten', 'excanvas.js')}"></script> |
---|
12 | <script type="text/javascript" src="${req.href.chrome('bitten', 'jquery.flot.js')}"></script> |
---|
13 | </head> |
---|
14 | <body> |
---|
15 | <strong py:def="build_status(status)" class="status"> |
---|
16 | <py:choose test="status"> |
---|
17 | <py:when test="'completed'">Success</py:when> |
---|
18 | <py:when test="'failed'">Failed</py:when> |
---|
19 | <py:when test="'in progress'">In-progress</py:when> |
---|
20 | </py:choose> |
---|
21 | </strong> |
---|
22 | |
---|
23 | <div py:def="build_time(build)" class="system"> |
---|
24 | <py:choose> |
---|
25 | <span py:when="build.stopped"> |
---|
26 | <div>Duration: ${build.duration}</div> |
---|
27 | </span> |
---|
28 | <span py:otherwise=""> |
---|
29 | <div>${build.started} (${build.started_delta} ago)</div> |
---|
30 | </span> |
---|
31 | </py:choose> |
---|
32 | </div> |
---|
33 | |
---|
34 | <div py:def="slave_info(slave)" class="system"> |
---|
35 | <strong>$slave.name</strong> ($slave.ipnr)<br /> |
---|
36 | $slave.os_name $slave.os_version |
---|
37 | <py:if test="slave.machine or slave.processor"> / </py:if> |
---|
38 | ${slave.processor or slave.machine or ''} |
---|
39 | </div> |
---|
40 | |
---|
41 | <ul py:def="build_steps(steps)" py:if="steps" class="steps"> |
---|
42 | <li py:for="step in steps" |
---|
43 | class="${step.cls}"> |
---|
44 | <span class="duration">$step.duration</span> |
---|
45 | <a href="$step.href" title="${step.description or None}"> |
---|
46 | $step.name |
---|
47 | </a> |
---|
48 | <ul py:if="step.status is 'failed' and step.errors"> |
---|
49 | <li py:for="error in step.errors">$error</li> |
---|
50 | </ul> |
---|
51 | </li> |
---|
52 | </ul> |
---|
53 | |
---|
54 | <div py:def="status_summary(config)" class="summary"> |
---|
55 | <p class="pending"> |
---|
56 | ${config.builds_pending} build<py:if test="config.builds_pending != 1">s</py:if> pending |
---|
57 | <span py:if="'platforms' in config" class="detail">(<py:for |
---|
58 | each="platform, sep in separated([p for p in config.platforms if p.builds_inprogress], ', ')">${platform.name}: |
---|
59 | ${platform.builds_pending}$sep</py:for>)</span> |
---|
60 | </p> |
---|
61 | <p class="inprogress"> |
---|
62 | ${config.builds_inprogress or 'No'} build<py:if test="config.builds_inprogress != 1">s</py:if> in progress |
---|
63 | <span py:if="'platforms' in config" class="detail">(<py:for |
---|
64 | each="platform, sep in separated([p for p in config.platforms if p.builds_inprogress], ', ')">${platform.name}: |
---|
65 | ${platform.builds_inprogress}$sep</py:for>)</span> |
---|
66 | </p> |
---|
67 | </div> |
---|
68 | |
---|
69 | <div id="content" class="build"> |
---|
70 | <h1>$title</h1><py:choose test="page_mode"><py:when test="'overview'"> |
---|
71 | ${status_summary(dict(builds_pending=builds_pending, builds_inprogress=builds_inprogress))} |
---|
72 | <form id="prefs" method="get" action=""> |
---|
73 | <div> |
---|
74 | <input type="checkbox" id="showall" name="show" value="all" |
---|
75 | checked="${show_all and 'checked' or None}" /> |
---|
76 | <label for="showall">Show deactivated configurations</label> |
---|
77 | </div> |
---|
78 | <div class="buttons"> |
---|
79 | <input type="submit" value="Update" /> |
---|
80 | </div> |
---|
81 | </form> |
---|
82 | |
---|
83 | <py:for each="config in configs"> |
---|
84 | <h2 class="config ${not config.active and 'deactivated' or ''}"> |
---|
85 | <a href="$config.href">$config.label</a> |
---|
86 | </h2> |
---|
87 | ${status_summary(config)} |
---|
88 | <div py:if="config.description" class="description"> |
---|
89 | $config.description |
---|
90 | </div><py:if test="len(config.builds)"> |
---|
91 | <h3 class="builds"><a href="$config.href">Latest builds</a></h3> |
---|
92 | <table class="builds"><tbody><tr> |
---|
93 | <th py:with="youngest_rev = config.youngest_rev"> |
---|
94 | <a href="$youngest_rev.href">[$youngest_rev.display_rev]</a> |
---|
95 | by ${format_author(youngest_rev.author)}<p class="date">$youngest_rev.date</p> |
---|
96 | <p class="message">$youngest_rev.message</p> |
---|
97 | </th> |
---|
98 | <td py:for="build in config.builds" class="$build.cls"><py:choose> |
---|
99 | <py:when test="build.status != 'pending'"> |
---|
100 | <a href="$build.href">$build.platform</a> |
---|
101 | <p class="date">$build.stopped</p> |
---|
102 | ${slave_info(build.slave)} |
---|
103 | ${build_status(build.status)} |
---|
104 | </py:when><py:otherwise> |
---|
105 | <strong>$build.platform</strong> |
---|
106 | <p class="nobuild">No build yet</p> |
---|
107 | </py:otherwise></py:choose> |
---|
108 | </td> |
---|
109 | </tr></tbody></table></py:if> |
---|
110 | </py:for> |
---|
111 | |
---|
112 | </py:when><py:when test="'view_config'"> |
---|
113 | <div id="charts"><py:for each="chart in config.charts"> |
---|
114 | <h3 id="chart_${chart.category}_title" style="text-align: center;"/> |
---|
115 | <div id="chart_${chart.category}" style="${chart.style}"></div> |
---|
116 | <script type="text/javascript"> |
---|
117 | $(document).ready(function() { |
---|
118 | $.getJSON('${chart.href}', function(json) { |
---|
119 | $("#chart_${chart.category}_title").append(json.title); |
---|
120 | json.options['xaxis']['tickFormatter'] = function(rev) { return "[" + rev + "]"; }; |
---|
121 | $.plot($("#chart_${chart.category}"), json.data, json.options); |
---|
122 | }); |
---|
123 | }); |
---|
124 | </script> |
---|
125 | <br /></py:for> |
---|
126 | </div> |
---|
127 | <form py:if="config.can_modify" id="prefs" method="post" |
---|
128 | class="activation"><py:choose> |
---|
129 | <div py:when="not config.active" class="help"> |
---|
130 | This build configuration is currently inactive.<br /> |
---|
131 | No builds will be initiated for this configuration<br /> |
---|
132 | until it is activated. |
---|
133 | </div> |
---|
134 | <div py:otherwise="" class="help"> |
---|
135 | This configuration is currently active. |
---|
136 | </div></py:choose> |
---|
137 | <div class="buttons" py:choose=""> |
---|
138 | <input type="hidden" name="action" value="edit" /> |
---|
139 | <input py:when="config.active" type="submit" name="deactivate" |
---|
140 | value="Deactivate" /> |
---|
141 | <input py:otherwise="" type="submit" name="activate" |
---|
142 | value="Activate" /> |
---|
143 | </div> |
---|
144 | </form> |
---|
145 | <p class="path"> |
---|
146 | Repository path: |
---|
147 | <a py:if="config.path" href="$config.browser_href">$config.path</a> |
---|
148 | ${not config.path and '—' or ''} |
---|
149 | <py:if test="config.min_rev or config.max_rev"> |
---|
150 | (<py:if test="config.min_rev">starting at |
---|
151 | <a href="$config.min_rev_href">[$config.min_rev]</a></py:if> |
---|
152 | <py:if test="config.min_rev and config.max_rev">, </py:if> |
---|
153 | <py:if test="config.max_rev">up to |
---|
154 | <a href="$config.max_rev_href">[$config.max_rev]</a></py:if>) |
---|
155 | </py:if> |
---|
156 | </p> |
---|
157 | ${status_summary(config)} |
---|
158 | <div py:if="config.description" class="description"> |
---|
159 | $config.description |
---|
160 | </div> |
---|
161 | <div class="buttons"> |
---|
162 | ${attach_file_form(config.attachments)} |
---|
163 | </div> |
---|
164 | ${list_of_attachments(config.attachments, compact=True)} |
---|
165 | |
---|
166 | <table py:if="config.platforms and config.builds" |
---|
167 | class="listing" id="builds"> |
---|
168 | <thead><tr> |
---|
169 | <th class="chgset"><abbr title="Changeset">Chgset</abbr></th> |
---|
170 | <th py:for="platform in config.platforms">$platform.name</th> |
---|
171 | </tr></thead> |
---|
172 | <tbody py:if="config.builds"> |
---|
173 | <tr py:for="rev_num in config.revisions" |
---|
174 | py:with="rev = config.builds[rev_num]"> |
---|
175 | <th class="chgset" scope="row"> |
---|
176 | <a href="$rev.href" title="View Changeset">[$rev.display_rev]</a> |
---|
177 | </th><py:for each="platform in config.platforms"><py:choose> |
---|
178 | <td py:when="platform.id in rev" py:with="build = rev[platform.id]" |
---|
179 | class="$build.cls"> |
---|
180 | <div class="info"> |
---|
181 | <a href="$build.href" title="View build results"> |
---|
182 | $build.id |
---|
183 | ${build_status(build.status)} |
---|
184 | </a> |
---|
185 | ${slave_info(build.slave)} |
---|
186 | ${build_time(build)} |
---|
187 | </div> |
---|
188 | ${build_steps(build.steps)} |
---|
189 | </td> |
---|
190 | <td py:otherwise="">—</td></py:choose></py:for> |
---|
191 | </tr> |
---|
192 | </tbody> |
---|
193 | </table> |
---|
194 | <br style="clear: right"/> |
---|
195 | |
---|
196 | </py:when><py:when test="'view-inprogress'"> |
---|
197 | <py:for each="config in configs"> |
---|
198 | <h2 class="config ${not config.active and 'deactivated' or ''}"> |
---|
199 | <a href="$config.href">$config.label</a> |
---|
200 | </h2> |
---|
201 | <table class="listing" id="builds"> |
---|
202 | <thead><tr> |
---|
203 | <th class="chgset" abbrev="Changeset">Chgset</th><th>Build</th> |
---|
204 | </tr></thead><tbody> |
---|
205 | <tr py:for="build in config.builds"> |
---|
206 | <th class="chgset" scope="row"> |
---|
207 | <a href="$build.rev_href" title="View Changeset">[$build.rev]</a> |
---|
208 | </th> |
---|
209 | <td class="$build.cls"> |
---|
210 | <div class="info"> |
---|
211 | <a href="$build.href" title="View build results"> |
---|
212 | $build.id: <strong class="status">$build.platform</strong> |
---|
213 | </a> |
---|
214 | ${slave_info(build.slave)} |
---|
215 | ${build_time(build)} |
---|
216 | </div> |
---|
217 | ${build_steps(build.steps)} |
---|
218 | </td> |
---|
219 | </tr></tbody> |
---|
220 | </table></py:for></py:when> |
---|
221 | </py:choose></div> |
---|
222 | </body> |
---|
223 | </html> |
---|