1 from __future__ import generators
2
3 import sys, time, os.path
4 import urllib
5
6 from buildbot import util
7 from buildbot import version
8 from buildbot.status.web.base import HtmlResource
9
10
11 from buildbot.status.web.base import build_get_class
12
13
14 if hasattr(sys, "frozen"):
15
16 here = os.path.dirname(sys.executable)
17 grid_css = os.path.abspath(os.path.join(here, "grid.css"))
18 else:
19
20 up = os.path.dirname
21 grid_css = os.path.abspath(os.path.join(up(__file__), "grid.css"))
22
24
33
37
38
39
41 if "reload" in request.args:
42 try:
43 reload_time = int(request.args["reload"][0])
44 return max(reload_time, 15)
45 except ValueError:
46 pass
47 return None
48
49 - def head(self, request):
50 head = ''
51 reload_time = self.get_reload_time(request)
52 if reload_time is not None:
53 head += '<meta http-equiv="refresh" content="%d">\n' % reload_time
54 return head
55
56
57
58
59
60
61
62
63
64
65
66
67
68
89
123
125 text = stamp.getText()
126 return '<td valign="bottom" class="sourcestamp">%s</td>\n' % \
127 "<br />".join(text)
128
161
163
164 status = None
165 control = None
166 changemaster = None
167
168 - def __init__(self, allowForce=True, css=None):
173
174
175 - def body(self, request):
176 """This method builds the regular grid display.
177 That is, build stamps across the top, build hosts down the left side
178 """
179
180
181 numBuilds = int(request.args.get("width", [5])[0])
182 categories = request.args.get("category", [])
183 branch = request.args.get("branch", [ANYBRANCH])[0]
184 if branch == 'trunk': branch = None
185
186
187 status = self.getStatus(request)
188 stamps = self.getRecentSourcestamps(status, numBuilds, categories, branch)
189
190 projectURL = status.getProjectURL()
191 projectName = status.getProjectName()
192
193 data = '<table class="Grid" border="0" cellspacing="0">\n'
194 data += '<tr>\n'
195 data += '<td class="title"><a href="%s">%s</a>' % (projectURL, projectName)
196 if categories:
197 if len(categories) > 1:
198 data += '\n<br /><b>Categories:</b><br/>%s' % ('<br/>'.join(categories))
199 else:
200 data += '\n<br /><b>Category:</b> %s' % categories[0]
201 if branch != ANYBRANCH:
202 data += '\n<br /><b>Branch:</b> %s' % (branch or 'trunk')
203 data += '</td>\n'
204 for stamp in stamps:
205 data += self.stamp_td(stamp)
206 data += '</tr>\n'
207
208 sortedBuilderNames = status.getBuilderNames()[:]
209 sortedBuilderNames.sort()
210 for bn in sortedBuilderNames:
211 builds = [None] * len(stamps)
212
213 builder = status.getBuilder(bn)
214 if categories and builder.category not in categories:
215 continue
216
217 build = builder.getBuild(-1)
218 while build and None in builds:
219 ss = build.getSourceStamp(absolute=True)
220 for i in range(len(stamps)):
221 if ss == stamps[i] and builds[i] is None:
222 builds[i] = build
223 build = build.getPreviousBuild()
224
225 data += '<tr>\n'
226 data += self.builder_td(request, builder)
227 for build in builds:
228 data += self.build_td(request, build)
229 data += '</tr>\n'
230
231 data += '</table>\n'
232
233
234 data += '<hr /><div class="footer">\n'
235
236 welcomeurl = self.path_to_root(request) + "index.html"
237 data += '[<a href="%s">welcome</a>]\n' % welcomeurl
238 data += "<br />\n"
239
240 data += '<a href="http://buildbot.sourceforge.net/">Buildbot</a>'
241 data += "-%s " % version
242 if projectName:
243 data += "working for the "
244 if projectURL:
245 data += "<a href=\"%s\">%s</a> project." % (projectURL,
246 projectName)
247 else:
248 data += "%s project." % projectName
249 data += "<br />\n"
250 data += ("Page built: " +
251 time.strftime("%a %d %b %Y %H:%M:%S",
252 time.localtime(util.now()))
253 + "\n")
254 data += '</div>\n'
255 return data
256
258
259 status = None
260 control = None
261 changemaster = None
262
263 - def __init__(self, allowForce=True, css=None):
268
269
270 - def body(self, request):
271 """This method builds the transposed grid display.
272 That is, build hosts across the top, ebuild stamps down the left side
273 """
274
275
276 numBuilds = int(request.args.get("length", [5])[0])
277 categories = request.args.get("category", [])
278 branch = request.args.get("branch", [ANYBRANCH])[0]
279 if branch == 'trunk': branch = None
280
281
282 status = self.getStatus(request)
283 stamps = self.getRecentSourcestamps(status, numBuilds, categories, branch)
284
285 projectURL = status.getProjectURL()
286 projectName = status.getProjectName()
287
288 data = '<table class="Grid" border="0" cellspacing="0">\n'
289 data += '<tr>\n'
290 data += '<td class="title"><a href="%s">%s</a>' % (projectURL, projectName)
291 if categories:
292 if len(categories) > 1:
293 data += '\n<br /><b>Categories:</b><br/>%s' % ('<br/>'.join(categories))
294 else:
295 data += '\n<br /><b>Category:</b> %s' % categories[0]
296 if branch != ANYBRANCH:
297 data += '\n<br /><b>Branch:</b> %s' % (branch or 'trunk')
298 data += '</td>\n'
299
300 sortedBuilderNames = status.getBuilderNames()[:]
301 sortedBuilderNames.sort()
302
303 builder_builds = {}
304
305 for bn in sortedBuilderNames:
306 builds = [None] * len(stamps)
307
308 builder = status.getBuilder(bn)
309 if categories and builder.category not in categories:
310 continue
311
312 build = builder.getBuild(-1)
313 while build and None in builds:
314 ss = build.getSourceStamp(absolute=True)
315 for i in range(len(stamps)):
316 if ss == stamps[i] and builds[i] is None:
317 builds[i] = build
318 build = build.getPreviousBuild()
319
320 data += self.builder_td(request, builder)
321 builder_builds[bn] = builds
322
323 data += '</tr>\n'
324
325 for i in range(len(stamps)):
326 data += '<tr>\n'
327 data += self.stamp_td(stamps[i])
328 for bn in sortedBuilderNames:
329 data += self.build_td(request, builder_builds[bn][i])
330 data += '</tr>\n'
331
332 data += '</table>\n'
333
334
335 data += '<hr /><div class="footer">\n'
336
337 welcomeurl = self.path_to_root(request) + "index.html"
338 data += '[<a href="%s">welcome</a>]\n' % welcomeurl
339 data += "<br />\n"
340
341 data += '<a href="http://buildbot.sourceforge.net/">Buildbot</a>'
342 data += "-%s " % version
343 if projectName:
344 data += "working for the "
345 if projectURL:
346 data += "<a href=\"%s\">%s</a> project." % (projectURL,
347 projectName)
348 else:
349 data += "%s project." % projectName
350 data += "<br />\n"
351 data += ("Page built: " +
352 time.strftime("%a %d %b %Y %H:%M:%S",
353 time.localtime(util.now()))
354 + "\n")
355 data += '</div>\n'
356 return data
357