The branch, master has been updated via f0b686e Fixes for distinct builds. from 131284c Fix formatting.
http://gitweb.samba.org/?p=build-farm.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit f0b686e7287ea9acc67054a5fb705906cbac2d06 Author: Jelmer Vernooij <jel...@samba.org> Date: Mon Nov 22 01:18:51 2010 +0100 Fixes for distinct builds. ----------------------------------------------------------------------- Summary of changes: buildfarm/__init__.py | 9 +++++++-- buildfarm/sqldb.py | 19 +++++++++++++------ buildfarm/tests/test_buildfarm.py | 4 ++-- 3 files changed, 22 insertions(+), 10 deletions(-) Changeset truncated at 500 lines: diff --git a/buildfarm/__init__.py b/buildfarm/__init__.py index d5a4aa4..509b024 100644 --- a/buildfarm/__init__.py +++ b/buildfarm/__init__.py @@ -141,7 +141,9 @@ class BuildFarm(object): def get_new_builds(self): hostnames = set([host.name for host in self.hostdb.hosts()]) for build in self.upload_builds.get_new_builds(): - if build.tree in self.trees and build.compiler in self.compilers and build.host in hostnames: + if (build.tree in self.trees and + build.compiler in self.compilers and + build.host in hostnames): yield build def get_last_builds(self): @@ -160,9 +162,12 @@ class BuildFarm(object): def get_host_builds(self, host): from buildfarm import data + ret = [] for compiler in self.compilers: for tree in sorted(self.trees.keys()): try: - yield self.get_build(tree, host, compiler) + ret.append(self.get_build(tree, host, compiler)) except data.NoSuchBuildError: pass + ret.sort(reverse=True) + return ret diff --git a/buildfarm/sqldb.py b/buildfarm/sqldb.py index 28f6d8d..5019310 100644 --- a/buildfarm/sqldb.py +++ b/buildfarm/sqldb.py @@ -240,6 +240,16 @@ class StormCachingBuildResultStore(BuildResultStore): return ret +def distinct_builds(builds): + done = set() + for build in builds: + key = (build.tree, build.compiler, build.host) + if key in done: + continue + done.add(key) + yield build + + class StormCachingBuildFarm(BuildFarm): def __init__(self, path=None, store=None, timeout=0.5): @@ -265,18 +275,15 @@ class StormCachingBuildFarm(BuildFarm): def get_host_builds(self, host): result = self._get_store().find(StormBuild, StormBuild.host == host) - return result.group_by(StormBuild.compiler, StormBuild.tree) + return distinct_builds(result.order_by(Desc(StormBuild.upload_time))) def get_tree_builds(self, tree): result = self._get_store().find(StormBuild, StormBuild.tree == tree) - return result.group_by(StormBuild.host, StormBuild.compiler).order_by( - Desc(StormBuild.upload_time)) + return distinct_builds(result.order_by(Desc(StormBuild.upload_time))) def get_last_builds(self): result = self._get_store().find(StormBuild) - return result.group_by( - StormBuild.tree, StormBuild.compiler, StormBuild.host).order_by( - Desc(StormBuild.upload_time)) + return distinct_builds(result.order_by(Desc(StormBuild.upload_time))) def commit(self): self.store.commit() diff --git a/buildfarm/tests/test_buildfarm.py b/buildfarm/tests/test_buildfarm.py index a2af72a..a988be3 100644 --- a/buildfarm/tests/test_buildfarm.py +++ b/buildfarm/tests/test_buildfarm.py @@ -89,14 +89,14 @@ class BuildFarmTestBase(object): self.assertEquals([], list(self.x.get_tree_builds("trival"))) def test_get_tree_builds(self): - path = self.upload_mock_logfile(self.x.builds, "tdb", "myhost", "cc", + path = self.upload_mock_logfile(self.x.builds, "tdb", "myhost", "gcc", stdout_contents="BUILD COMMIT REVISION: 12\n", mtime=1200) path = self.upload_mock_logfile(self.x.builds, "tdb", "myhost", "cc", stdout_contents="BUILD COMMIT REVISION: 13\n", mtime=1300) path = self.upload_mock_logfile(self.x.builds, "tdb", "myhost", "cc", stdout_contents="BUILD COMMIT REVISION: 42\n", mtime=4200) builds = list(self.x.get_tree_builds("tdb")) - self.assertEquals(["42", "13", "12"], [x.revision for x in builds]) + self.assertEquals(["42", "12"], [x.revision for x in builds]) def test_get_last_builds(self): path = self.upload_mock_logfile(self.x.builds, "other", "myhost", "cc", -- build.samba.org