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 |