Fix encoding when updating platform.
[build-farm.git] / import-and-analyse.py
index 921e156f404eb07b5e5e68b083c3ad2343a6c325..2318cc1351874ab161501b72a9ee10a94c91fc7c 100755 (executable)
@@ -11,13 +11,13 @@ on recent commits.
 """
 
 from buildfarm.build import (
+    BuildDiff,
     MissingRevisionInfo,
     NoSuchBuildError,
     )
 from buildfarm import BuildFarm
 from buildfarm.web import build_uri
 from email.mime.text import MIMEText
-import logging
 import optparse
 import resource
 import smtplib
@@ -37,24 +37,27 @@ smtp = smtplib.SMTP()
 smtp.connect()
 
 def check_and_send_mails(cur, old):
-    t = buildfarm.trees[cur.tree]
 
-    cur_rev = cur.revision_details()
-    cur_status = cur.status()
+    if cur.tree is "waf":
+        # no point sending emails, as the email addresses are invalid
+        return
 
-    old_rev = old.revision_details()
-    old_status = old.status()
+    if cur.tree is "samba_3_waf":
+        # no emails for this until it stabilises a bit
+        return
 
-    if not cur_status.regressed_since(old_status):
+    t = buildfarm.trees[cur.tree]
+    diff = BuildDiff(t, old, cur)
+
+    if not diff.is_regression():
         if opts.verbose >= 3:
-            print "... hasn't regressed since %s: %s" % (old_rev, old_status)
+            print "... hasn't regressed since %s: %s" % (diff.old_rev, diff.old_status)
         return
 
-    branch = t.get_branch()
     recipients = set()
     change_log = ""
 
-    for rev in branch.log(from_rev=cur.revision, exclude_revs=set([old.revision])):
+    for rev in diff.revisions():
         recipients.add(rev.author)
         recipients.add(rev.committer)
         change_log += """
@@ -83,15 +86,15 @@ The build may have been broken by one of the following commits:
         "change_log": change_log,
         "scm": t.scm,
         "branch": t.branch,
-        "cur_rev": cur_rev,
-        "old_rev": old_rev,
-        "cur_status": cur_status,
-        "old_status": old_status,
+        "cur_rev": diff.new_rev,
+        "old_rev": diff.old_rev,
+        "cur_status": diff.new_status,
+        "old_status": diff.old_status,
         "build_link": build_uri("http://build.samba.org/build.cgi", cur)
         }
 
     msg = MIMEText(body)
-    msg["Subject"] = "BUILD of %s:%s BROKEN on %s with %s AT REVISION %s" % (cur.tree, t.branch, cur.host, cur.compiler, cur_rev)
+    msg["Subject"] = "BUILD of %s:%s BROKEN on %s with %s AT REVISION %s" % (cur.tree, t.branch, cur.host, cur.compiler, diff.new_rev)
     msg["From"] = "\"Build Farm\" <build@samba.org>"
     msg["To"] = ",".join(recipients)
     if not opts.dry_run:
@@ -125,22 +128,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()