Chromium Code Reviews| Index: third_party/buildbot_8_4p1/buildbot/status/web/status_json.py |
| diff --git a/third_party/buildbot_8_4p1/buildbot/status/web/status_json.py b/third_party/buildbot_8_4p1/buildbot/status/web/status_json.py |
| index b656563257e3b0dbe89ca0e3fe26b330c1e7d99b..054432cc6e962b6cdf7731826706071531dd5b32 100644 |
| --- a/third_party/buildbot_8_4p1/buildbot/status/web/status_json.py |
| +++ b/third_party/buildbot_8_4p1/buildbot/status/web/status_json.py |
| @@ -16,6 +16,7 @@ |
| """Simple JSON exporter.""" |
| +import collections |
| import datetime |
| import os |
| import re |
| @@ -635,21 +636,39 @@ class SlaveJsonResource(JsonResource): |
| self.builders.append(builderName) |
| return self.builders |
| + def getSlaveBuildMap(self, buildcache, buildercache): |
| + for builderName in self.getBuilders(): |
| + if builderName not in buildercache: |
| + # This builder hasn't been processed in this request yet. |
|
iannucci
2013/06/30 08:16:16
obvious comment is obvious? :)
|
| + buildercache.add(builderName) |
| + builder_status = self.status.getBuilder(builderName) |
| + for i in range(1, builder_status.buildCacheSize - 1): |
| + build_status = builder_status.getBuild(-i) |
|
iannucci
2013/06/30 08:16:16
This loop construction looks ugly, but I'm assumin
|
| + if not build_status or not build_status.isFinished(): |
| + # If not finished, it will appear in runningBuilds. |
| + break |
| + slave = buildcache[build_status.getSlavename()] |
|
iannucci
2013/06/30 08:16:16
how is slavename guaranteed to exist in buildcache
Mike Stip (use stip instead)
2013/06/30 08:29:54
collections.defaultdict(dict)
|
| + slave.setdefault(builderName, []).append( |
| + build_status.getNumber()) |
| + return buildcache[self.name] |
| + |
| def asDict(self, request): |
| + if not hasattr(request, 'requestdata'): |
| + request.requestdata = {} |
| + if 'buildcache' not in request.requestdata: |
| + # buildcache is used to cache build information across multiple |
| + # invocations of SlaveJsonResource. It should be set to an empty |
| + # collections.defaultdict(dict). |
| + request.requestdata['buildcache'] = collections.defaultdict(dict) |
| + |
| + # Tracks which builders have been stored in the buildcache. |
| + request.requestdata['buildercache'] = set() |
| + |
|
iannucci
2013/06/30 08:16:16
I think this whole block could be:
if not hasattr
Mike Stip (use stip instead)
2013/06/30 08:29:54
twisted doesn't seem to have a place to stash appl
|
| results = self.slave_status.asDict() |
| # Enhance it by adding more informations. |
|
iannucci
2013/06/30 08:16:16
depluaralize information while you're at it :)
|
| - results['builders'] = {} |
| - for builderName in self.getBuilders(): |
| - builds = [] |
| - builder_status = self.status.getBuilder(builderName) |
| - for i in range(1, builder_status.buildCacheSize - 1): |
| - build_status = builder_status.getBuild(-i) |
| - if not build_status or not build_status.isFinished(): |
| - # If not finished, it will appear in runningBuilds. |
| - break |
| - if build_status.getSlavename() == self.name: |
| - builds.append(build_status.getNumber()) |
| - results['builders'][builderName] = builds |
| + results['builders'] = self.getSlaveBuildMap( |
| + request.requestdata['buildcache'], |
| + request.requestdata['buildercache']) |
| return results |