return False
if ("panic" in self.other_failures and
not "panic" in older.other_failures):
+ # If this build introduced panics, then that's always worse.
return True
if len(self.stages) < len(older.stages):
# Less stages completed
return True
- for ((old_name, old_result), (new_name, new_result)) in zip(
- older.stages, self.stages):
- assert old_name == new_name
- if new_result > old_result:
+ old_stages = dict(older.stages)
+ new_stages = dict(self.stages)
+ for name, new_result in new_stages.iteritems():
+ try:
+ old_result = old_stages[name]
+ except KeyError:
+ continue
+ if new_result == old_result:
+ continue
+ if new_result < 0 and old_result >= 0:
return True
+ elif new_result >= 0 and old_result < 0:
+ return False
+ else:
+ return (abs(new_result) > abs(old_result))
return False
def __cmp__(self, other):
except IOError:
raise LogFileMissing()
+ def has_log(self):
+ try:
+ f = self.read_log()
+ except LogFileMissing:
+ return False
+ else:
+ f.close()
+ return True
+
def read_err(self):
"""read full err file"""
try:
def get_by_checksum(self, checksum):
from buildfarm.sqldb import Cast
result = self.store.find(StormBuild,
- Cast(StormBuild.checksum, "TEXT") == Cast(checksum, "TEXT"))
- ret = result.one()
+ Cast(StormBuild.checksum, "TEXT") == Cast(checksum, "TEXT")).order_by(Desc(StormBuild.upload_time))
+ ret = result.first()
if ret is None:
raise NoSuchBuildError(None, None, None, None)
return ret
if build is None:
raise NoSuchBuildError(tree, host, compiler)
return build
+
+
+class BuildDiff(object):
+ """Represents the difference between two builds."""
+
+ def __init__(self, tree, old, new):
+ self.tree = tree
+ self.old = old
+ self.new = new
+ self.new_rev = new.revision_details()
+ self.new_status = new.status()
+
+ self.old_rev = old.revision_details()
+ self.old_status = old.status()
+
+ def is_regression(self):
+ """Is there a regression in new build since old build?"""
+ return self.new_status.regressed_since(self.old_status)
+
+ def revisions(self):
+ """Returns the revisions introduced since old in new."""
+ branch = self.tree.get_branch()
+ return branch.log(from_rev=self.new.revision, exclude_revs=set([self.old.revision]))