Variety of fixes all over the place
[blender-buildbot.git] / templates / build.html
1 {% extends "layout.html" %}
2 {% import 'forms.html' as forms %}
3 {% from "change_macros.html" import change with context %}
4
5 {% block content %}
6 <div class="container">
7
8 <h1 style="white-space: nowrap;">
9 Builder <a href="{{ path_to_builder }}">{{ b.getBuilder().getName() }}</a>
10 Build #{{ b.getNumber() }}
11 </h1>
12
13 {% if not b.isFinished() %}
14   <h2>Build In Progress:</h2>
15
16   {% if when_time %}
17     <p>ETA: {{ when_time }} [{{ when }}]</p>
18   {% endif %}
19
20   {{ current_step }}
21   
22   {% if authz.advertiseAction('stopBuild', request) %}
23     <h2>Stop Build</h2>
24     {{ forms.stop_build(build_url+"/stop", authz, on_all=False, short=False, label='This Build') }}
25   {% endif %}
26 {% else %}
27   <h2>Results:</h2>
28
29   
30   <p><span class="btn-{% if result_css ==  "success" %}{{ result_css }}{% else %}danger{% endif %} btn btn-default btn-block btn-squishy disabled">   
31     {{ b.getText()|join(' ')|capitalize }}
32         </span>
33   </p>
34    
35   {% if b.getTestResults() %}
36     <h3><a href="{{ tests_link }}"/></h3>
37   {% endif %}
38 {% endif %}
39
40 <h2>
41 {% if sourcestamps|count == 1 %}
42 SourceStamp:
43 {% else %}
44 SourceStamps:
45 {% endif %}
46 </h2>
47
48 {% for sourcestamps_row in sourcestamps | batch(3, '&nbsp;') %}
49 <div class="row flex">
50 {% for ss in sourcestamps_row %}
51 <div class="col-md-4">
52 <div class="box">
53 <h3>{{ ss.codebase }}</h3>
54     <table class="table table-striped table-hover box">
55     {% set ss_class = cycler('alt','') %}
56
57     {% if ss.project %}
58       <tr class="{{ ss_class.next() }}"><td>Project</td><td>{{ ss.project|projectlink }}</td></tr>
59     {% endif %}
60
61     {% if ss.repository %}
62       <tr class="{{ ss_class.next() }}"><td>Repository</td><td>{{ ss.repository|repolink }}</td></tr>
63     {% endif %}
64
65     {% if ss.branch %}
66       <tr class="{{ ss_class.next() }}"><td>Branch</td><td>{{ ss.branch|e }}</td></tr>
67     {% endif %}
68
69     {% if ss.revision %}
70       <tr class="{{ ss_class.next() }}"><td>Revision</td><td>{{ ss.revision|revlink(ss.repository) }}</td></tr>
71     {% endif %}
72
73     {% if got_revisions[ss.codebase] %}
74       <tr class="{{ ss_class.next() }}"><td>Got Revision</td><td>{{ got_revisions[ss.codebase]|revlink(ss.repository) }}</td></tr>
75     {% endif %}
76
77     {% if ss.patch %}
78       <tr class="{{ ss_class.next() }}"><td>Patch</td><td>YES</td></tr>
79     {% endif %}
80
81     {% if ss.changes %}
82       <tr class="{{ ss_class.next() }}"><td>Changes</td><td><a href="#changes-{{ ss.codebase }}">{{ ss.changes|count }} change{{ 's' if ss.changes|count > 1 else '' }}</a></td></tr>
83     {% endif %}
84
85     {% if not ss.branch and not ss.revision and not ss.patch and not ss.changes %}
86       <tr class="{{ ss_class.next() }}"><td colspan="2" align="center">Build of most recent revision</td></tr>
87     {% endif %}
88     </table>
89 </div></div>
90 {% endfor %}
91 </div>
92 {% endfor %}
93
94 {#
95  # TODO: turn this into a table, or some other sort of definition-list
96  # that doesn't take up quite so much vertical space
97  #}
98    
99 <h2>BuildSlave:</h2>
100   
101 {% if slave_url %}  
102   <a href="{{ slave_url|e }}">{{ b.getSlavename()|e }}</a>
103 {% else %}
104   {{ b.getSlavename()|e }} 
105 {% endif %}
106
107 <h2>Reason:</h2>
108 <p>
109 {{ b.getReason()|e }}
110 </p>
111
112 <h2>Steps and Logfiles:</h2>
113
114 {#
115  # TODO:
116  #       urls = self.original.getURLs()
117  #       ex_url_class = "BuildStep external"
118  #       for name, target in urls.items():
119  #           text.append('[<a href="%s" class="%s">%s</a>]' %
120  #                       (target, ex_url_class, html.escape(name)))
121  #}
122
123 {# TODO(sergey): Move hardcoded span with inline-block into a CSS class. #}
124
125 <ol>
126 {% for s in steps %}
127   <li>
128     <span style="display: inline-block; width: 40%;"><a href="{{ s.link }}">{{ s.name }}</a></span>
129     <span style="display: inline-block; width: 25%;">
130       <span class="label label-info">{{ s.text }} &nbsp; {{ '( ' + s.time_to_run + ' )' if s.time_to_run else '' }}</span>
131     </span>
132     <span style="display: inline-block; width: 30%; padding-left: 12pt;">
133     <ol>
134       {% set item_class = cycler('alt', '') %}
135       {% for l in s.logs %}
136         <a class="btn btn-default" href="{{ l.link }}">{{ l.name }}</a>
137       {% else %}
138         <a class="btn btn-default disabled" href="#" >- no logs -</a>
139       {% endfor %}
140       {% for u in s.urls %}
141         <a class="btn btn-default" href="{{ u.url }}">{{ u.logname }}</a>
142       {% endfor %}
143     </ol>
144     </span>
145   </li>
146 {% endfor %}
147 </ol>
148
149 </div>
150 <div class="container">
151
152 <h2>Build Properties:</h2>
153
154 <table class="table table-striped table-hover box">
155 <tr><th>Name</th><th>Value</th><th>Source</th></tr>
156
157 {% for p in properties %}
158 {% if p.source != "Force Build Form" %}
159   <tr class="{{ loop.cycle('alt', '') }}">
160     <td>{{ p.name|e }}</td>
161     {% if p.short_value %}
162         <td>{{ p.short_value|e }} .. [property value too long]</td>
163     {% else %}
164         {% if p.value is not mapping %}
165             <td>{{ p.value|e }}</td>
166         {% else %}
167             <td>
168                 <table class="table table-striped table-hove">
169                     {%- for key, value in p.value.items() recursive %}
170                         <tr><td>{{ key|e }}</td><td>{{ value|e }}</td></tr>
171                     {% endfor %}
172                 </table>
173             </td>
174         {% endif %}
175     {% endif %}
176     <td>{{ p.source|e }}</td>
177   </tr>
178 {% endif %}
179 {% endfor %}
180 </table>
181 <h2>Forced Build Properties:</h2>
182 <table class="table table-striped table-hover box">
183 <tr><th>Name</th><th>Label</th><th>Value</th></tr>
184
185 {% for p in properties %}
186     {% if p.source == "Force Build Form" %}
187   <tr class="{{ loop.cycle('alt', '') }}">
188     <td>{{ p.name|e }}</td>
189     <td>
190     {% if p.label %}
191     {{ p.label }}
192     {% endif %}    
193     </td>
194     {% if p.text %}
195     <td><textarea readonly cols="{{p.cols}}" rows="{{p.rows}}">{{ p.text|e }}</textarea></td>
196     {% else %}
197     <td>{{ p.value|e }}</td>
198     {% endif %}
199   </tr>
200   {% endif %}    
201 {% endfor %}
202 </table>
203
204 <h2>Responsible Users:</h2>
205
206 {% if responsible_users %}
207   <ol>
208   {% for u in responsible_users %}
209      <li class="{{ loop.cycle('alt', '') }}">{{ u|user }}</li>
210   {% endfor %}
211   </ol>
212 {% else %}
213   <p>no responsible users</p>
214 {% endif %}
215
216
217 <h2>Timing:</h2>
218 <table class="table table-striped table-hover box">
219   <tr class="alt"><td>Start</td><td>{{ start }}</td></tr>
220 {% if end %}
221   <tr><td>End</td><td>{{ end }}</td></tr>
222 {% endif %}
223   <tr {{ 'class="alt"' if end else '' }}><td>Elapsed</td><td>{{ elapsed }}</td></tr>
224 </table>
225
226   {% if authz.advertiseAction('forceBuild', request) %}
227     <h3>Resubmit Build:</h3>
228     {{ forms.rebuild_build(build_url+"/rebuild", authz, sourcestamps[0]) }}
229   {% endif %}
230
231 </div>
232
233 <br style="clear:both"/>
234   
235 {% if has_changes %}
236     <div class="column">
237       <h2>All Changes:</h2>
238         {% for ss in sourcestamps %}
239             {% if ss.changes %}
240             <h3 id="changes-{{ ss.codebase }}"> {{ ss.codebase }}:</h3>
241             <ol>
242                   {% for c in ss.changes %}
243                     <li><h3>Change #{{ c.number }}</h3>
244                       {{ change(c.asDict()) }}
245                     </li>
246                   {% endfor %}
247             </ol>
248             {% endif %}
249         {% endfor %}
250     </div>
251 {% endif %}
252
253 {% endblock %}