1   
  2   
  3   
  4   
  5   
  6   
  7   
  8   
  9   
 10   
 11   
 12   
 13   
 14   
 15   
 16  from twisted.internet import defer 
 17  from buildbot.status.web.base import HtmlResource 
 18  from buildbot.status.web.base import build_get_class, path_to_builder, path_to_build 
 19  from buildbot.sourcestamp import SourceStamp 
 22   
 24 -    def getPageTitle(self, request): 
  25          status = self.getStatus(request) 
 26          p = status.getTitle() 
 27          if p: 
 28              return "BuildBot: %s" % p 
 29          else: 
 30              return "BuildBot" 
  31   
 32       
 33       
 35          if "reload" in request.args: 
 36              try: 
 37                  reload_time = int(request.args["reload"][0]) 
 38                  return max(reload_time, 15) 
 39              except ValueError: 
 40                  pass 
 41          return None 
  42   
 63   
 64      @defer.deferredGenerator 
 92   
 94          """Given two source stamps, we want to assign them to the same row if 
 95          they are the same version of code, even if they differ in minor detail. 
 96   
 97          This function returns an appropriate comparison key for that. 
 98          """ 
 99          return (ss.branch, ss.revision, ss.patch) 
 100   
127   
 153   
155       
156      status = None 
157      changemaster = None 
158   
159      @defer.deferredGenerator 
160 -    def content(self, request, cxt): 
 161          """This method builds the regular grid display. 
162          That is, build stamps across the top, build hosts down the left side 
163          """ 
164   
165           
166          numBuilds = int(request.args.get("width", [5])[0]) 
167          categories = request.args.get("category", []) 
168          branch = request.args.get("branch", [ANYBRANCH])[0] 
169          if branch == 'trunk': branch = None 
170   
171           
172          status = self.getStatus(request) 
173          stamps = self.getRecentSourcestamps(status, numBuilds, categories, branch) 
174   
175          cxt['refresh'] = self.get_reload_time(request) 
176   
177          cxt.update({'categories': categories, 
178                      'branch': branch, 
179                      'ANYBRANCH': ANYBRANCH, 
180                      'stamps': map(SourceStamp.asDict, stamps) 
181                     }) 
182           
183          sortedBuilderNames = status.getBuilderNames()[:] 
184          sortedBuilderNames.sort() 
185           
186          cxt['builders'] = [] 
187   
188          for bn in sortedBuilderNames: 
189              builds = [None] * len(stamps) 
190   
191              builder = status.getBuilder(bn) 
192              if categories and builder.category not in categories: 
193                  continue 
194   
195              for build in self.getRecentBuilds(builder, numBuilds, branch): 
196                  ss = build.getSourceStamp(absolute=True) 
197                  key= self.getSourceStampKey(ss) 
198                  for i in range(len(stamps)): 
199                      if key == self.getSourceStampKey(stamps[i]) and builds[i] is None: 
200                          builds[i] = build 
201   
202              wfd = defer.waitForDeferred( 
203                      self.builder_cxt(request, builder)) 
204              yield wfd 
205              b = wfd.getResult() 
206   
207              b['builds'] = [] 
208              for build in builds: 
209                  b['builds'].append(self.build_cxt(request, build)) 
210              cxt['builders'].append(b) 
211   
212          template = request.site.buildbot_service.templates.get_template("grid.html") 
213          yield template.render(**cxt) 
  214   
217       
218      status = None 
219      changemaster = None 
220      default_rev_order = "asc" 
221   
222      @defer.deferredGenerator 
223 -    def content(self, request, cxt): 
 224          """This method builds the transposed grid display. 
225          That is, build hosts across the top, build stamps down the left side 
226          """ 
227   
228           
229          numBuilds = int(request.args.get("length", [5])[0]) 
230          categories = request.args.get("category", []) 
231          branch = request.args.get("branch", [ANYBRANCH])[0] 
232          if branch == 'trunk': branch = None 
233   
234          rev_order = request.args.get("rev_order", [self.default_rev_order])[0] 
235          if rev_order not in ["asc", "desc"]: 
236              rev_order = self.default_rev_order 
237   
238          cxt['refresh'] = self.get_reload_time(request) 
239   
240           
241          status = self.getStatus(request) 
242          stamps = self.getRecentSourcestamps(status, numBuilds, categories, branch) 
243   
244          cxt.update({'categories': categories, 
245                      'branch': branch, 
246                      'ANYBRANCH': ANYBRANCH, 
247                      'stamps': map(SourceStamp.asDict, stamps), 
248                      }) 
249   
250          sortedBuilderNames = status.getBuilderNames()[:] 
251          sortedBuilderNames.sort() 
252           
253          cxt['sorted_builder_names'] = sortedBuilderNames 
254          cxt['builder_builds'] = builder_builds = [] 
255          cxt['builders'] = builders = [] 
256          cxt['range'] = range(len(stamps)) 
257          if rev_order == "desc": 
258              cxt['range'].reverse() 
259           
260          for bn in sortedBuilderNames: 
261              builds = [None] * len(stamps) 
262   
263              builder = status.getBuilder(bn) 
264              if categories and builder.category not in categories: 
265                  continue 
266   
267              for build in self.getRecentBuilds(builder, numBuilds, branch): 
268                  ss = build.getSourceStamp(absolute=True) 
269                  key = self.getSourceStampKey(ss) 
270                  for i in range(len(stamps)): 
271                      if key == self.getSourceStampKey(stamps[i]) and builds[i] is None: 
272                          builds[i] = build 
273   
274              wfd = defer.waitForDeferred( 
275                      self.builder_cxt(request, builder)) 
276              yield wfd 
277              builders.append(wfd.getResult()) 
278   
279              builder_builds.append(map(lambda b: self.build_cxt(request, b), builds)) 
280   
281          template = request.site.buildbot_service.templates.get_template('grid_transposed.html') 
282          yield template.render(**cxt) 
  283