Index: third_party/buildbot_8_4p1/README.chromium |
diff --git a/third_party/buildbot_8_4p1/README.chromium b/third_party/buildbot_8_4p1/README.chromium |
index 2e79182bbd5ab615c5f42cb99a42892bb386b690..02dc085785c1ffe9b2d5aae7d8b07eca87374f5b 100644 |
--- a/third_party/buildbot_8_4p1/README.chromium |
+++ b/third_party/buildbot_8_4p1/README.chromium |
@@ -2947,3 +2947,69 @@ index ed12ea0..32e1bd3 100644 |
def __init__(self, **kwargs): |
self.factory = (self.__class__, dict(kwargs)) |
+ |
+ |
+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 b656563..e48542d 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 |
+ |
+ |