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..c3579390f43626750fc88daec81598f4da89fedc 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,38 @@ 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: |
+ buildercache.add(builderName) |
+ 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 |
+ slave = buildcache[build_status.getSlavename()] |
+ slave.setdefault(builderName, []).append( |
+ build_status.getNumber()) |
+ return buildcache[self.name] |
+ |
def asDict(self, request): |
+ if not hasattr(request, 'custom_data'): |
+ request.custom_data = {} |
+ if 'buildcache' not in request.custom_data: |
+ # buildcache is used to cache build information across multiple |
+ # invocations of SlaveJsonResource. It should be set to an empty |
+ # collections.defaultdict(dict). |
+ request.custom_data['buildcache'] = collections.defaultdict(dict) |
+ |
+ # Tracks which builders have been stored in the buildcache. |
+ request.custom_data['buildercache'] = set() |
+ |
results = self.slave_status.asDict() |
- # Enhance it by adding more informations. |
- 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 |
+ # Enhance it by adding more information. |
+ results['builders'] = self.getSlaveBuildMap( |
+ request.custom_data['buildcache'], |
+ request.custom_data['buildercache']) |
return results |