def _open_build_results(self):
from buildfarm import data
- return data.BuildResultStore(os.path.join(self.path, "data", "oldrevs"))
+ path = os.path.join(self.path, "data", "oldrevs")
+ return data.BuildResultStore(path)
def _open_upload_build_results(self):
from buildfarm import data
- return data.UploadBuildResultStore(os.path.join(self.path, "data", "upload"))
+ path = os.path.join(self.path, "data", "upload")
+ return data.UploadBuildResultStore(path)
def _open_hostdb(self):
from buildfarm import hostdb
yield build
def get_last_builds(self):
- return self.get_new_builds()
+ return sorted(self.get_new_builds(), reverse=True)
def get_tree_builds(self, tree):
- yielded = set()
+ ret = []
for build in self.builds.get_all_builds():
if build.tree == tree:
- if not (build.host, build.compiler) in yielded:
- yielded.add((build.host, build.compiler))
- yield build
+ ret.append(build)
+ ret.sort(reverse=True)
+ return ret
def get_host_builds(self, host):
from buildfarm import data
self.compiler = compiler
self.commit_revision = self.revision = rev
+ def __cmp__(self, other):
+ return cmp(
+ (self.upload_time, self.revision, self.host, self.tree, self.compiler),
+ (other.upload_time, other.revision, other.host, other.tree, other.compiler))
+
def __eq__(self, other):
- return (self.log_checksum() == other.log_checksum())
+ return (isinstance(other, Build) and
+ self.log_checksum() == other.log_checksum())
def __repr__(self):
if self.revision is not None:
def remove(self):
self.remove_logs()
+ @property
+ def upload_time(self):
+ """get timestamp of build"""
+ st = os.stat("%s.log" % self.basename)
+ return st.st_mtime
+
@property
def age(self):
"""get the age of build"""
st = os.stat("%s.log" % self.basename)
- return time.time() - st.st_ctime
+ return time.time() - self.upload_time
def read_log(self):
"""read full log file"""
for build in self.get_all_builds():
if build.tree == tree and build.host == host and build.compiler == compiler:
ret.append(build)
- ret.sort(lambda a, b: cmp(a.age, b.age))
+ ret.sort(lambda a, b: cmp(a.upload_time, b.upload_time))
return ret
def upload_build(self, build):
host = RawStr()
compiler = RawStr()
checksum = RawStr()
- age = Int()
+ upload_time = Int(name="age")
status_str = RawStr(name="status")
commit_revision = RawStr()
new_build = StormBuild(new_basename, build.tree, build.host,
build.compiler, rev)
new_build.checksum = build.log_checksum()
- new_build.age = build.age
+ new_build.upload_time = build.upload_time
new_build.status_str = build.status().__serialize__()
self.store.add(new_build)
return new_build
return self.store.find(StormBuild,
StormBuild.tree == tree,
StormBuild.host == host,
- StormBuild.compiler == compiler).order_by(Desc(StormBuild.age))
+ StormBuild.compiler == compiler).order_by(Desc(StormBuild.upload_time))
class StormCachingBuildFarm(BuildFarm):
def get_tree_builds(self, tree):
return self._get_store().find(StormBuild,
- StormBuild.tree == tree).group_by(StormBuild.compiler, StormBuild.host)
+ StormBuild.tree == tree).order_by(Desc(StormBuild.upload_time))
def get_last_builds(self):
- return self._get_store().find(StormBuild).group_by(StormBuild.tree, StormBuild.compiler, StormBuild.host)
+ return self._get_store().find(StormBuild).group_by(
+ StormBuild.tree, StormBuild.compiler, StormBuild.host).order_by(
+ Desc(StormBuild.upload_time))
def commit(self):
self.store.commit()
"""Test case class that provides a build farm data directory and convenience methods.
"""
- def upload_mock_logfile(self, store, tree, host, compiler, stdout_contents="", stderr_contents=None):
- log_path = self.create_mock_logfile(tree, host, compiler, contents=stdout_contents)
+ def upload_mock_logfile(self, store, tree, host, compiler,
+ stdout_contents="", stderr_contents=None, mtime=None):
+ log_path = self.create_mock_logfile(tree, host, compiler, contents=stdout_contents, mtime=mtime)
if stderr_contents is not None:
- err_path = self.create_mock_logfile(tree, host, compiler, kind="stderr", contents=stderr_contents)
+ err_path = self.create_mock_logfile(tree, host, compiler, kind="stderr", contents=stderr_contents, mtime=mtime)
build = Build(log_path[:-4], tree, host, compiler)
store.upload_build(build)
def create_mock_logfile(self, tree, host, compiler, rev=None,
- kind="stdout", contents="FOO"):
+ kind="stdout", contents="FOO", mtime=None):
basename = "build.%s.%s.%s" % (tree, host, compiler)
if rev is not None:
basename += "-%s" % rev
f.write(contents)
finally:
f.close()
+ if mtime is not None:
+ os.utime(path, (mtime, mtime))
return path
def write_compilers(self, compilers):
def test_get_tree_builds(self):
path = self.upload_mock_logfile(self.x.builds, "tdb", "myhost", "cc",
- "BUILD COMMIT REVISION: 12\n")
+ stdout_contents="BUILD COMMIT REVISION: 12\n", mtime=1200)
path = self.upload_mock_logfile(self.x.builds, "tdb", "myhost", "cc",
- "BUILD COMMIT REVISION: 13\n")
+ stdout_contents="BUILD COMMIT REVISION: 13\n", mtime=1300)
path = self.upload_mock_logfile(self.x.builds, "tdb", "myhost", "cc",
- "BUILD COMMIT REVISION: 42\n")
+ stdout_contents="BUILD COMMIT REVISION: 42\n", mtime=4200)
builds = list(self.x.get_tree_builds("tdb"))
- self.assertEquals(1, len(builds))
- build = builds[0]
- self.assertEquals("42", build.revision)
+ self.assertEquals(["42", "13", "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 COMMIT REVISION: 12\n")
+ "BUILD COMMIT REVISION: 12\n", mtime=1200)
path = self.upload_mock_logfile(self.x.builds, "trivial", "myhost", "cc",
- "BUILD COMMIT REVISION: 13\n")
+ "BUILD COMMIT REVISION: 13\n", mtime=1300)
path = self.upload_mock_logfile(self.x.builds, "trivial", "myhost", "cc",
- "BUILD COMMIT REVISION: 42\n")
+ "BUILD COMMIT REVISION: 42\n", mtime=4200)
builds = list(self.x.get_last_builds())
- builds.sort()
self.assertEquals(2, len(builds))
- build = builds[0]
- self.assertEquals("42", build.revision_details()[0])
- self.assertEquals("trivial", build.tree)
- build = builds[1]
- self.assertEquals("12", build.revision_details()[0])
- self.assertEquals("other", build.tree)
+ self.assertEquals(4200, builds[0].upload_time)
+ self.assertEquals("42", builds[0].revision_details()[0])
+ self.assertEquals("trivial", builds[0].tree)
+ self.assertEquals(1200, builds[1].upload_time)
+ self.assertEquals("12", builds[1].revision_details()[0])
+ self.assertEquals("other", builds[1].tree)
def test_get_host_builds_empty(self):
self.assertEquals([], list(self.x.get_host_builds("myhost")))
def test_build_age_ctime(self):
path = self.create_mock_logfile("tdb", "charis", "cc", "12")
# Set mtime to something in the past
+ os.utime(path, (5, 5))
build = self.x.get_build("tdb", "charis", "cc", "12")
- age = build.age
- self.assertTrue(age >= 0 and age <= 10, "age was %d" % age)
+ self.assertEquals(5, build.upload_time)
def test_read_log(self):
path = self.create_mock_logfile("tdb", "charis", "cc", "12",