Subunit diff.
authorjelmer@samba.org <jelmer@samba.org>
Sat, 4 Dec 2010 04:11:27 +0000 (05:11 +0100)
committerjelmer@samba.org <jelmer@samba.org>
Sat, 4 Dec 2010 04:11:27 +0000 (05:11 +0100)
buildfarm/build.py
buildfarm/tests/test_build.py
buildfarm/web/__init__.py
import-and-analyse.py

index 1c73cb23191d95bb5f29cc0e493ae0d3e88d9530..4108ac0acb268d292f357084c3020ba7527fc2a1 100644 (file)
@@ -581,7 +581,7 @@ class BuildResultStore(object):
             raise NoSuchBuildError(None, None, None, None)
         return ret
 
-    def get_previous_revision(self, tree, host, compiler, revision):
+    def get_previous_build(self, tree, host, compiler, revision):
         from buildfarm.sqldb import Cast
         cur_build = self.get_build(tree, host, compiler, revision)
 
@@ -595,9 +595,9 @@ class BuildResultStore(object):
         prev_build = result.first()
         if prev_build is None:
             raise NoSuchBuildError(tree, host, compiler, revision)
-        return prev_build.revision
+        return prev_build
 
-    def get_latest_revision(self, tree, host, compiler):
+    def get_latest_build(self, tree, host, compiler):
         result = self.store.find(StormBuild,
             StormBuild.tree == tree,
             StormBuild.host == host,
@@ -606,4 +606,4 @@ class BuildResultStore(object):
         build = result.first()
         if build is None:
             raise NoSuchBuildError(tree, host, compiler)
-        return build.revision
+        return build
index b3c7a4531c256709eb4057bb82504e2e01d9acb3..6facb793fb661c0b86526353391b2601c73744b1 100755 (executable)
@@ -52,16 +52,16 @@ BUILD COMMIT REVISION: myrev
 BUILD COMMIT REVISION: myotherrev
 """)
         self.x.upload_build(Build(path[:-4], "tdb", "charis", "cc"))
-        self.assertRaises(NoSuchBuildError, self.x.get_previous_revision, "tdb", "charis", "cc", "unknown")
-        self.assertRaises(NoSuchBuildError, self.x.get_previous_revision, "tdb", "charis", "cc", "myrev")
-        self.assertEquals("myrev", self.x.get_previous_revision("tdb", "charis", "cc", "myotherrev"))
+        self.assertRaises(NoSuchBuildError, self.x.get_previous_build, "tdb", "charis", "cc", "unknown")
+        self.assertRaises(NoSuchBuildError, self.x.get_previous_build, "tdb", "charis", "cc", "myrev")
+        self.assertEquals("myrev", self.x.get_previous_build("tdb", "charis", "cc", "myotherrev").revision)
 
     def test_get_latest_revision(self):
         path = self.create_mock_logfile("tdb", "charis", "cc", "22", contents="""
 BUILD COMMIT REVISION: myrev
 """)
         self.x.upload_build(Build(path[:-4], "tdb", "charis", "cc"))
-        self.assertEquals("myrev", self.x.get_latest_revision("tdb", "charis", "cc"))
+        self.assertEquals("myrev", self.x.get_latest_build("tdb", "charis", "cc").revision)
 
     def test_build_fname(self):
         self.assertEquals(
@@ -160,11 +160,11 @@ BUILD COMMIT REVISION: myrev
         build = Build(path[:-4], "tdb", "charis", "cc")
         self.assertRaises(Exception, self.x.upload_build, build)
 
-    def test_get_previous_revision(self):
-        self.assertRaises(NoSuchBuildError, self.x.get_previous_revision, "tdb", "charis", "cc", "12")
+    def test_get_previous_build(self):
+        self.assertRaises(NoSuchBuildError, self.x.get_previous_build, "tdb", "charis", "cc", "12")
 
     def test_get_latest_revision_none(self):
-        self.assertRaises(NoSuchBuildError, self.x.get_latest_revision, "tdb", "charis", "cc")
+        self.assertRaises(NoSuchBuildError, self.x.get_latest_build, "tdb", "charis", "cc")
 
     def test_get_old_builds_none(self):
         self.assertEquals([],
index f58cb9a699cb98ee8a3066a93870706c4975cde8..ebbbd3607ae063ba26be0d6a44735fe1e6d594d7 100755 (executable)
@@ -466,7 +466,15 @@ class ViewBuildPage(BuildFarmPage):
 
         yield "<div id='log'>"
 
-        yield "<p><a href='%s/+subunit'>Subunit output</a></p>" % build_uri(myself, build)
+        yield "<p><a href='%s/+subunit'>Subunit output</a>" % build_uri(myself, build)
+        try:
+            previous_build = self.buildfarm.builds.get_previous_build(build.tree, build.host, build.compiler. build.revision)
+        except NoSuchBuildError:
+            pass
+        else:
+            yield ", <a href='%s/+subunit-diff/%s'>diff against previous</a>" % (
+                build_uri(myself, build), previous.log_checksum())
+        yield "</p>"
         yield "<p><a href='%s/+stdout'>Standard output (as plain text)</a>, " % build_uri(myself, build)
         yield "<a href='%s/+stderr'>Standard error (as plain text)</a>" % build_uri(myself, build)
         yield "</p>"
@@ -1011,6 +1019,16 @@ class BuildFarmApp(object):
                         ('Content-type', 'text/plain; charset=utf-8'),
                         ('Content-Disposition', 'attachment; filename="%s.%s.%s-%s.err"' % (build.tree, build.host, build.compiler, build.revision))])
                     yield build.read_err().read()
+                elif subfn == "+subunit-diff":
+                    start_response('200 OK', [
+                        ('Content-type', 'text/plain; charset=utf-8')])
+                    subunit_this = build.read_subunit().readlines()
+                    other_build_checksum = wsgiref.util.shift_path_info(environ)
+                    other_build = self.buildfarm.builds.get_by_checksum(other_build_checksum)
+                    subunit_other = other_build.read_subunit().readlines()
+                    import difflib
+                    yield "".join(difflib.unified_diff(subunit_other, subunit_this))
+
                 elif subfn in ("", None):
                     start_response('200 OK', [
                         ('Content-type', 'text/html; charset=utf-8')])
index 921e156f404eb07b5e5e68b083c3ad2343a6c325..2273b42ea2dbc5b92a486b1d038db43be160682c 100755 (executable)
@@ -125,22 +125,15 @@ for build in buildfarm.get_new_builds():
     try:
         if opts.dry_run:
             # Perhaps this is a dry run and rev is not in the database yet?
-            prev_rev = buildfarm.builds.get_latest_revision(build.tree, build.host, build.compiler)
+            prev_build = buildfarm.builds.get_latest_build(build.tree, build.host, build.compiler)
         else:
-            prev_rev = buildfarm.builds.get_previous_revision(build.tree, build.host, build.compiler, rev)
+            prev_build = buildfarm.builds.get_previous_build(build.tree, build.host, build.compiler, rev)
     except NoSuchBuildError:
         if opts.verbose >= 1:
             print "Unable to find previous build for %s,%s,%s" % (build.tree, build.host, build.compiler)
         # Can't send a nastygram until there are 2 builds..
     else:
-        try:
-            assert prev_rev is not None
-            prev_build = buildfarm.builds.get_build(build.tree, build.host, build.compiler, prev_rev)
-        except NoSuchBuildError:
-            if opts.verbose >= 1:
-                print "Previous build %s has disappeared" % prev_build
-        else:
-            check_and_send_mails(build, prev_build)
+        check_and_send_mails(build, prev_build)
 
     if not opts.dry_run:
         old_build.remove()