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 |