Add download folder
[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>
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
55     <table class="table table-striped table-hover box">
56     {% set ss_class = cycler('alt','') %}
57
58     {% if ss.project %}
59       <tr class="{{ ss_class.next() }}"><td class="left">Project</td><td>{{ ss.project|projectlink }}</td></tr>
60     {% endif %}
61
62     {% if ss.repository %}
63       <tr class="{{ ss_class.next() }}"><td class="left">Repository</td><td>{{ ss.repository|repolink }}</td></tr>
64     {% endif %}
65
66     {% if ss.branch %}
67       <tr class="{{ ss_class.next() }}"><td class="left">Branch</td><td>{{ ss.branch|e }}</td></tr>
68     {% endif %}
69
70     {% if ss.revision %}
71       <tr class="{{ ss_class.next() }}"><td class="left">Revision</td><td>{{ ss.revision|revlink(ss.repository) }}</td></tr>
72     {% endif %}
73
74     {% if got_revisions[ss.codebase] %}
75       <tr class="{{ ss_class.next() }}"><td class="left">Got Revision</td><td>{{ got_revisions[ss.codebase]|revlink(ss.repository) }}</td></tr>
76     {% endif %}
77
78     {% if ss.patch %}
79       <tr class="{{ ss_class.next() }}"><td class="left">Patch</td><td>YES</td></tr>
80     {% endif %}
81
82     {% if ss.changes %}
83       <tr class="{{ ss_class.next() }}"><td class="left">Changes</td><td><a href="#changes-{{ ss.codebase }}">{{ ss.changes|count }} change{{ 's' if ss.changes|count > 1 else '' }}</a></td></tr>
84     {% endif %}
85
86     {% if not ss.branch and not ss.revision and not ss.patch and not ss.changes %}
87       <tr class="{{ ss_class.next() }}"><td class="left" colspan="2">Build of most recent revision</td></tr>
88     {% endif %}
89     </table>
90         </div></div>
91 {% endfor %}
92 </div>
93 {% endfor %}
94
95 {#
96  # TODO: turn this into a table, or some other sort of definition-list
97  # that doesn't take up quite so much vertical space
98  #}
99    
100 <h2>BuildSlave:</h2>
101   
102 {% if slave_url %}  
103   <a href="{{ slave_url|e }}">{{ b.getSlavename()|e }}</a>
104 {% else %}
105   {{ b.getSlavename()|e }} 
106 {% endif %}
107
108 <h2>Reason:</h2>
109 <p>
110 {{ b.getReason()|e }}
111 </p>
112
113 <h2>Steps and Logfiles:</h2>
114
115 {#
116  # TODO:
117  #       urls = self.original.getURLs()
118  #       ex_url_class = "BuildStep external"
119  #       for name, target in urls.items():
120  #           text.append('[<a href="%s" class="%s">%s</a>]' %
121  #                       (target, ex_url_class, html.escape(name)))
122  #}
123
124 <ol>
125 {% for s in steps %}
126   <li>
127     <div class="{{ s.css_class }} result">
128       <a href="{{ s.link }}">{{ s.name }}</a> 
129           <span class="pull-right label label-info">{{ s.text }} &nbsp;
130 {{ '( ' + s.time_to_run + ' )' if s.time_to_run else '' }}</span>
131     </div>
132
133     <ol>
134       {% set item_class = cycler('alt', '') %}
135       {% for l in s.logs %}
136         <li class="{{ item_class.next() }}"><a class="btn btn-default" href="{{ l.link }}">{{ l.name }}</a></li>
137       {% else %}
138         <li class="{{ item_class.next() }}"><a class="btn btn-default disabled" href="#" >- no logs -</a></li>
139       {% endfor %}
140     
141       {% for u in s.urls %}
142         <li class="{{ item_class.next() }}"><a class="btn btn-default" href="{{ u.url }}">{{ u.logname }}</a></li>
143       {% endfor %}
144     </ol>  
145   </li>
146 {% endfor %}
147 </ol>
148
149 </div>
150 <div class="container">
151
152 <h2>Build Properties:</h2>
153
154 <table class="table">
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 class="left">{{ 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">
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">
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 class="left">{{ p.name|e }}</td>
189     <td class="left">
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">
219   <tr class="alt"><td class="left">Start</td><td>{{ start }}</td></tr>
220 {% if end %}
221   <tr><td class="left">End</td><td>{{ end }}</td></tr>
222 {% endif %}
223   <tr {{ 'class="alt"' if end else '' }}><td class="left">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 %}