land: Add separate treestagebuilder for subunit.
authorJelmer Vernooij <jelmer@samba.org>
Sat, 2 Oct 2010 11:26:36 +0000 (13:26 +0200)
committerJelmer Vernooij <jelmer@samba.org>
Sat, 2 Oct 2010 11:26:36 +0000 (13:26 +0200)
script/land.py

index cd25e0a05a960f98b923af460d46ecf02c666012..dcd266b47f19d48044c66cd62cd3e9914480a8a8 100755 (executable)
@@ -90,22 +90,15 @@ class TreeStageBuilder(object):
     """Handle building of a particular stage for a tree.
     """
 
-    def __init__(self, tree, name, command, output_mime_type, fail_quickly=False):
+    def __init__(self, tree, name, command, fail_quickly=False):
         self.tree = tree
         self.name = name
         self.command = command
-        self.output_mime_type = output_mime_type
         self.fail_quickly = fail_quickly
         self.status = None
 
     def start(self):
-        if self.output_mime_type == "text/x-subunit":
-            if self.fail_quickly:
-                self.command += " | %s --fail-immediately" % (os.path.join(os.path.dirname(__file__), "selftest/filter-subunit"))
-            self.command += " | %s --immediate" % (os.path.join(os.path.dirname(__file__), "selftest/format-subunit"))
-        print '%s: [%s] Running %s' % (self.name, self.stage, self.command)
-        self.proc = Popen(self.command, shell=True, cwd=self.tree.dir,
-                          stdout=self.tree.stdout, stderr=self.tree.stderr, stdin=self.tree.stdin)
+        raise NotImplementedError(self.start)
 
     def poll(self):
         self.status = self.proc.poll()
@@ -122,6 +115,37 @@ class TreeStageBuilder(object):
             self.proc.wait()
             self.proc = None
 
+    @property
+    def failure_reason(self):
+        return "failed '%s' with status %d" % (self.cmd, self.status)
+
+    @property
+    def failed(self):
+        return (os.WIFSIGNALED(self.status) or os.WEXITSTATUS(self.status) != 0)
+
+
+class PlainTreeStageBuilder(TreeStageBuilder):
+
+    def start(self):
+        print '%s: [%s] Running %s' % (self.name, self.stage, self.command)
+        self.proc = Popen(self.command, shell=True, cwd=self.tree.dir,
+                          stdout=self.tree.stdout, stderr=self.tree.stderr, stdin=self.tree.stdin)
+
+
+class SubunitTreeStageBuilder(TreeStageBuilder):
+
+    def __init__(self, tree, name, command, fail_quickly=False):
+        super(SubunitTreeStageBuilder, self).__init__(tree, name, command, fail_quickly)
+        self.failed_tests = []
+
+    def start(self):
+        if self.fail_quickly:
+            self.command += " | %s --fail-immediately" % (os.path.join(os.path.dirname(__file__), "selftest/filter-subunit"))
+        self.command += " | %s --immediate" % (os.path.join(os.path.dirname(__file__), "selftest/format-subunit"))
+        print '%s: [%s] Running' % (self.name, self.stage)
+        self.proc = Popen(self.command, shell=True, cwd=self.tree.dir,
+                          stdout=self.tree.stdout, stderr=self.tree.stderr, stdin=self.tree.stdin)
+
 
 class TreeBuilder(object):
     '''handle build of one directory'''
@@ -166,7 +190,12 @@ class TreeBuilder(object):
             return
         (stage_name, cmd, output_mime_type) = self.sequence[self.next]
         cmd = cmd.replace("${PREFIX}", "--prefix=%s" % self.prefix)
-        self.stage = TreeStageBuilder(self, stage_name, cmd, output_mime_type, self.fail_quickly)
+        if output_mime_type == "text/plain":
+            self.stage = PlainTreeStageBuilder(self, stage_name, cmd, self.fail_quickly)
+        elif output_mime_type == "text/x-subunit":
+            self.stage = SubunitTreeStageBuilder(self, stage_name, cmd, self.fail_quickly)
+        else:
+            raise Exception("Unknown output mime type %s" % output_mime_type)
         self.next += 1
 
     def remove_logs(self):
@@ -186,11 +215,11 @@ class TreeBuilder(object):
 
     @property
     def failed(self):
-        return (os.WIFSIGNALED(self.status) or os.WEXITSTATUS(self.status) != 0)
+        return self.stage.failed
 
     @property
     def failure_reason(self):
-        return "%s: [%s] failed '%s' with status %d" % (self.name, self.stage.name, self.stage.cmd, self.stage.status)
+        return "%s: [%s] %s" % (self.name, self.stage.name, self.stage.failure_reason)
 
 
 class BuildList(object):