The branch, master has been updated via 7ad25b7 When uploading, automatically create subunit file. via c034d6c Support extracting subunit files. from 8f5dc74 Fix last instance of StormCachingBUildFarm.
http://gitweb.samba.org/?p=build-farm.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 7ad25b7ed094a77ada88436fe3e0fa819421fde3 Author: Jelmer Vernooij <jel...@samba.org> Date: Sat Dec 4 02:55:46 2010 +0100 When uploading, automatically create subunit file. commit c034d6c44e76a57091a135a537a0581a49c8f828 Author: Jelmer Vernooij <jel...@samba.org> Date: Sat Dec 4 02:49:02 2010 +0100 Support extracting subunit files. ----------------------------------------------------------------------- Summary of changes: buildfarm/build.py | 40 +++++++++++++++++++++++++--------------- buildfarm/tests/test_build.py | 25 +++++++++++++++++++++++-- tools/fix.py | 19 ++++++++++++++++++- 3 files changed, 66 insertions(+), 18 deletions(-) Changeset truncated at 500 lines: diff --git a/buildfarm/build.py b/buildfarm/build.py index a2ea904..b64695f 100644 --- a/buildfarm/build.py +++ b/buildfarm/build.py @@ -160,13 +160,13 @@ def extract_phase_output(f): output = None re_action = re.compile("^ACTION (PASSED|FAILED):\s+(.*)$") for l in f: - if l.startwith("Running action "): + if l.startswith("Running action "): name = l[len("Running action "):].strip() output = [] continue m = re_action.match(l) if m: - assert name == m.group(1) + assert name == m.group(2).strip(), "%r != %r" % (name, m.group(2)) yield name, output name = None output = [] @@ -178,7 +178,7 @@ def extract_test_output(f): for name, output in extract_phase_output(f): if name == "test": return output - return None + raise NoTestOutput() def build_status_from_logs(log, err): @@ -268,6 +268,10 @@ class NoSuchBuildError(Exception): self.rev = rev +class NoTestOutput(Exception): + """The build did not have any associated test output.""" + + class Build(object): """A single build of a tree on a particular host using a particular compiler. """ @@ -317,7 +321,10 @@ class Build(object): def read_subunit(self): """read the test output as subunit""" - return StringIO("".join(extract_test_output(self.read_log()))) + try: + return open(self.basename+".subunit", "r") + except IOError: + raise NoTestOutput() def read_log(self): """read full log file""" @@ -527,20 +534,23 @@ class BuildResultStore(object): rev = build.revision_details() new_basename = self.build_fname(build.tree, build.host, build.compiler, rev) - try: - existing_build = self.get_build(build.tree, build.host, build.compiler, rev) - except NoSuchBuildError: - if os.path.exists(new_basename+".log"): - os.remove(new_basename+".log") - if os.path.exists(new_basename+".err"): - os.remove(new_basename+".err") - else: - existing_build.remove_logs() + if os.path.exists(new_basename+".log"): + os.remove(new_basename+".log") + if os.path.exists(new_basename+".err"): + os.remove(new_basename+".err") os.link(build.basename+".log", new_basename+".log") if os.path.exists(build.basename+".err"): os.link(build.basename+".err", new_basename+".err") - new_basename = self.build_fname(build.tree, build.host, build.compiler, - rev) + try: + subunit_output = extract_test_output(build.read_log()) + except NoTestOutput: + pass + else: + f = open(new_basename+".subunit", 'w') + try: + f.writelines(subunit_output) + finally: + f.close() new_build = StormBuild(new_basename, build.tree, build.host, build.compiler, rev) new_build.checksum = build.log_checksum() diff --git a/buildfarm/tests/test_build.py b/buildfarm/tests/test_build.py index 4c2d0f0..b3c7a45 100755 --- a/buildfarm/tests/test_build.py +++ b/buildfarm/tests/test_build.py @@ -18,15 +18,15 @@ from cStringIO import StringIO import os import testtools -import unittest from buildfarm.build import ( Build, - BuildResultStore, BuildStatus, NoSuchBuildError, + NoTestOutput, UploadBuildResultStore, build_status_from_logs, + extract_test_output, ) from buildfarm import BuildFarm @@ -402,3 +402,24 @@ class UploadBuildResultStoreTests(UploadBuildResultStoreTestBase,BuildFarmTestCa self.x = UploadBuildResultStore( os.path.join(self.path, "data", "upload")) + + +class ExtractSubunitTests(testtools.TestCase): + + def extract_test_output(self, log): + try: + return "".join(extract_test_output(StringIO(log))) + except NoTestOutput: + return None + + def test_not_present(self): + self.assertEquals(None, self.extract_test_output("")) + + def test_simple(self): + self.assertEquals("FOO\n", self.extract_test_output(""" + +Running action test +FOO +ACTION PASSED: test + +""")) diff --git a/tools/fix.py b/tools/fix.py index 9cec88f..b4cc172 100755 --- a/tools/fix.py +++ b/tools/fix.py @@ -8,11 +8,13 @@ from buildfarm.build import ( build_status_from_logs, LogFileMissing, MissingRevisionInfo, + NoTestOutput, revision_from_log, + extract_test_output, ) from buildfarm.hostdb import NoSuchHost -from buildfarm.sqldb import BuildFarm, StormBuild +from buildfarm import BuildFarm, StormBuild buildfarm = BuildFarm() @@ -58,4 +60,19 @@ for build in store.find(StormBuild, StormBuild.host_id == None): except NoSuchHost, e: print "Unable to find host %s" % e.name + +for build in store.find(StormBuild, StormBuild.basename != None): + subunit_path = build.basename + ".subunit" + if os.path.exists(subunit_path): + continue + try: + test_output = "".join(extract_test_output(build.read_log())) + except (LogFileMissing, NoTestOutput): + continue + f = open(subunit_path, 'w') + try: + f.write(test_output) + finally: + f.close() + buildfarm.commit() -- build.samba.org