Chromium Code Reviews| 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..390adc740af5190c61f89970d7630af0d38b0e9a 100644 | 
| --- a/third_party/buildbot_8_4p1/README.chromium | 
| +++ b/third_party/buildbot_8_4p1/README.chromium | 
| @@ -8,6 +8,7 @@ Make hidden steps stay hidden even if not finished, add brDoStepIf | 
| to support buildrunner. | 
| + | 
| 
 
iannucci
2013/06/30 08:16:16
don't need this, I think?
 
Mike Stip (use stip instead)
2013/06/30 08:29:54
Done, now sure how that snuck in.
 
 | 
| diff --git a/third_party/buildbot_8_4p1/buildbot/process/buildstep.py b/third_party/buildbot_8_4p1/buildbot/process/buildstep.py | 
| index 4aa307d..21044ea 100644 | 
| --- a/third_party/buildbot_8_4p1/buildbot/process/buildstep.py | 
| @@ -2947,3 +2948,67 @@ 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..054432c 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. | 
| ++ 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, '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() | 
| ++ | 
| + 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 | 
| ++ results['builders'] = self.getSlaveBuildMap( | 
| ++ request.requestdata['buildcache'], | 
| ++ request.requestdata['buildercache']) | 
| + return results | 
| + | 
| + |