on recent commits.
"""
-from buildfarm import data
-from buildfarm.sqldb import StormCachingBuildFarm
+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
parser = optparse.OptionParser("import-and-analyse [options]")
(opts, args) = parser.parse_args()
-buildfarm = StormCachingBuildFarm()
+resource.setrlimit(resource.RLIMIT_RSS, (300000, 300000))
+resource.setrlimit(resource.RLIMIT_DATA, (300000, 300000))
+
+buildfarm = BuildFarm(timeout=40.0)
smtp = smtplib.SMTP()
smtp.connect()
-def check_and_send_mails(tree, host, compiler, cur, old):
- t = buildfarm.trees[tree]
+def check_and_send_mails(cur, old):
+
+ if cur.tree is "waf":
+ # no point sending emails, as the email addresses are invalid
+ return
- (cur_rev, cur_rev_timestamp) = cur.revision_details()
- cur_status = cur.status()
+ if cur.tree is "samba_3_waf":
+ # no emails for this until it stabilises a bit
+ return
- (old_rev, old_rev_timestamp) = old.revision_details()
- old_status = old.status()
+ t = buildfarm.trees[cur.tree]
+ diff = BuildDiff(t, old, cur)
- if not cur_status.regressed_since(old_status):
+ 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
recipients = set()
change_log = ""
- for rev in t.get_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 += """
Build status for new revision %(cur_rev)s is %(cur_status)s
Build status for old revision %(old_rev)s was %(old_status)s
-See http://build.samba.org/?function=View+Build;host=%(host)s;tree=%(tree)s;compiler=%(compiler)s
+See %(build_link)s
The build may have been broken by one of the following commits:
%(change_log)s
""" % {
- "tree": tree.encode("utf-8"),
- "host": host.encode("utf-8"),
- "compiler": compiler.encode("utf-8"),
+ "tree": cur.tree, "host": cur.host, "compiler": cur.compiler,
"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" % (tree, t.branch, host, 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:
- smtp.send(msg["From"], [msg["To"]], msg.as_string())
+ smtp.sendmail(msg["From"], [msg["To"]], msg.as_string())
else:
print msg.as_string()
continue
if not opts.dry_run:
+ old_build = build
try:
- build = buildfarm.builds.upload_build(build)
- except data.MissingRevisionInfo:
+ build = buildfarm.builds.upload_build(old_build)
+ except MissingRevisionInfo:
print "No revision info in %r, skipping" % build
continue
try:
- (rev, rev_timestamp) = build.revision_details()
- except data.MissingRevisionInfo:
+ rev = build.revision_details()
+ except MissingRevisionInfo:
print "No revision info in %r, skipping" % build
continue
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)
- except data.NoSuchBuildError:
+ 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 data.NoSuchBuildError:
- if opts.verbose >= 1:
- print "Previous build %s has disappeared" % prev_build
- else:
- check_and_send_mails(build.tree, build.host, build.compiler, build, prev_build)
+ check_and_send_mails(build, prev_build)
if not opts.dry_run:
- # When the new web script is introduced, kill the build here:
- # build.remove()
+ old_build.remove()
buildfarm.commit()
smtp.quit()