| 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
|
|
|
|
|
|
|