[SCM] build.samba.org - branch master updated

Jelmer Vernooij jelmer at samba.org
Fri Dec 3 18:55:16 MST 2010


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 <jelmer at samba.org>
Date:   Sat Dec 4 02:55:46 2010 +0100

    When uploading, automatically create subunit file.

commit c034d6c44e76a57091a135a537a0581a49c8f828
Author: Jelmer Vernooij <jelmer at 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


More information about the samba-cvs mailing list