Fixes for distinct builds.
authorJelmer Vernooij <jelmer@samba.org>
Mon, 22 Nov 2010 00:18:51 +0000 (01:18 +0100)
committerJelmer Vernooij <jelmer@samba.org>
Mon, 22 Nov 2010 00:18:51 +0000 (01:18 +0100)
buildfarm/__init__.py
buildfarm/sqldb.py
buildfarm/tests/test_buildfarm.py

index d5a4aa427e9dc7500c3e588dd7938eb61521851a..509b024ef619bc34ecad72bfee07e73107705789 100644 (file)
@@ -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
index 28f6d8d65bef351a794306210b383a0a662e5a72..50193101dd7dd7edd51ed446f453960330636538 100644 (file)
@@ -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()
index a2af72a267fc896b07232daea76266883d6b7acf..a988be3cdf7c273175344892374e2c2927271d49 100644 (file)
@@ -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",