Author: mattip <[email protected]>
Branch: coalesce-by-hash
Changeset: r958:f369232d9640
Date: 2015-08-18 23:35 +0300
http://bitbucket.org/pypy/buildbot/changeset/f369232d9640/
Log: test, fix coalescing builds with same hash, different hg revision
numbers
also s/map/builds/ since map should not be a local variable
diff --git a/bot2/pypybuildbot/summary.py b/bot2/pypybuildbot/summary.py
--- a/bot2/pypybuildbot/summary.py
+++ b/bot2/pypybuildbot/summary.py
@@ -233,19 +233,23 @@
class GatherOutcomeSet(object):
- def __init__(self, map):
- self.map = map
+ def __init__(self, builds):
+ self.builds = builds
self._failed = None
self._skipped = None
self._numpassed = None
self._numxfailed = None
- self.revision = map.values()[0].revision
+ # In the case of a hg revision, this is of the form int:hash
+ # where the hashes should be identical, the int values may
+ # vary dependent on build slave repe.
+ # Should we sort, if so by what?
+ self.revision = builds.values()[0].revision
@property
def failed(self):
if self._failed is None:
self._failed = set()
- for prefix, outcome in self.map.items():
+ for prefix, outcome in self.builds.items():
self._failed.update([(prefix,)+ namekey for namekey in
outcome.failed])
return self._failed
@@ -254,7 +258,7 @@
def skipped(self):
if self._skipped is None:
self._skipped = set()
- for prefix, outcome in self.map.items():
+ for prefix, outcome in self.builds.items():
self._skipped.update([(prefix,) + namekey for namekey in
outcome.skipped])
return self._skipped
@@ -263,7 +267,7 @@
def numpassed(self):
if self._numpassed is None:
numpassed = 0
- for prefix, outcome in self.map.items():
+ for prefix, outcome in self.builds.items():
numpassed += outcome.numpassed
self._numpassed = numpassed
return self._numpassed
@@ -272,29 +276,29 @@
def numxfailed(self):
if self._numxfailed is None:
numxfailed = 0
- for prefix, outcome in self.map.items():
+ for prefix, outcome in self.builds.items():
numxfailed += outcome.numxfailed
self._numxfailed = numxfailed
return self._numxfailed
def get_outcome(self, namekey):
which = namekey[0]
- if which not in self.map:
+ if which not in self.builds:
return ' '
- return self.map[which].get_outcome(namekey[1:])
+ return self.builds[which].get_outcome(namekey[1:])
def get_longrepr(self, namekey):
which = namekey[0]
- if which not in self.map:
+ if which not in self.builds:
return ''
- return self.map[which].get_longrepr(namekey[1:])
+ return self.builds[which].get_longrepr(namekey[1:])
def get_key_namekey(self, namekey):
- return self.map[namekey[0]].get_key_namekey(namekey[1:])
+ return self.builds[namekey[0]].get_key_namekey(namekey[1:])
def get_run_infos(self):
all = {}
- for outcome_set in self.map.itervalues():
+ for outcome_set in self.builds.itervalues():
all.update(outcome_set.get_run_infos())
return all
@@ -403,7 +407,7 @@
class_=' '.join(["failSummary", cls]))
def _builder_num(self, outcome_set):
- return outcome_set.map.values()[0].key
+ return outcome_set.builds.values()[0].key
def _label(self, outcome_set):
if self.fixed_builder:
@@ -429,7 +433,7 @@
if self.fixed_builder:
pick = "builder=%s&builds=%d" % self._builder_num(outcome_set)
else:
- pick = "recentrev=%s" % rev
+ pick = "recentrev=%s" % rev.split(':')[-1]
category, branch = self.cur_cat_branch
revtxt = str(rev)
rev_anchor = html.a(revtxt, href="/summary?category=%s&branch=%s&%s" %
@@ -752,6 +756,8 @@
if not test_branch(branch):
continue
got_rev = getProp(build, 'got_revision', None)
+ if got_rev:
+ got_rev = got_rev.split(':')[-1]
if not test_rev(got_rev):
continue
@@ -766,6 +772,8 @@
no_revision_builds.append(build)
else:
rev = got_rev
+ if ':' in rev:
+ rev = rev.split(':')[-1]
buildNumber = build.getNumber()
if fixed_builder:
builds = runs.setdefault((buildNumber, rev), {})
@@ -783,7 +791,6 @@
key = (builderName, buildNumber)
outcome_set = outcome_set_cache.get(status, key)
runBuilds[builderName] = outcome_set
-
return cat_branches
@staticmethod
diff --git a/bot2/pypybuildbot/test/test_summary.py
b/bot2/pypybuildbot/test/test_summary.py
--- a/bot2/pypybuildbot/test/test_summary.py
+++ b/bot2/pypybuildbot/test/test_summary.py
@@ -797,23 +797,31 @@
builder1 = status_builder.BuilderStatus('builder_foo', 'foo',
self.master, '')
builder2 = status_builder.BuilderStatus('builder_bar', 'bar',
self.master, '')
builder3 = status_builder.BuilderStatus('builder_', '', self.master,
'')
+ builder4 = status_builder.BuilderStatus('builder_xyz', 'foo',
self.master, '')
add_builds(builder1, [('60000', "F TEST1\n")])
add_builds(builder2, [('60000', "F TEST2\n")])
add_builds(builder3, [('60000', "F TEST3\n")])
+ add_builds(builder4, [('60000', "F TEST4\n")])
s = summary.Summary(['foo', 'bar'])
- req = FakeRequest([builder1, builder2, builder3])
+ req = FakeRequest([builder1, builder2, builder3, builder4])
out = s.body(req)
rel1 = out.index('TEST1')
rel2 = out.index('TEST2')
rel3 = out.index('TEST3')
+ rel4 = out.index('TEST4')
- assert rel3 > rel2 > rel1
+ assert rel3 > rel2 > rel4 > rel1
- assert "{foo}" in out
- assert "{bar}" in out
+ # since the two foo category builds have the same rev number, they
+ # should appear on the same line. Strip HTML tags and check for the rev
+ plain = re.sub('<[^<]+?>', '', out)
+ relFoo = plain.index("{foo}")
+ relBar = plain.index("{bar}")
+
+ assert plain.count('60000', relFoo, relBar) == 1
def test_two_builds_different_rev_digits(self):
builder = status_builder.BuilderStatus('builder0', '', self.master, '')
@@ -829,6 +837,32 @@
p1000builder0 = out.find('builder0', p1000)
assert p999builder0-p999 == p1000builder0-p1000+1
+ def test_builds_coalesced_by_rev_hash(self):
+ # Two builds with the same category and the same hash should ignore
+ # revision numbers
+ category = 'nightly'
+ builder0 = status_builder.BuilderStatus('builder1', category,
self.master, '')
+ builder1 = status_builder.BuilderStatus('builder0', category,
self.master, '')
+ add_builds(builder0, [('999:abcdefg', "F TEST1\n. b"),
+ ('1000:hijklmn', "F TEST1\n. b")])
+ add_builds(builder1, [('1999:abcdefg', "F TEST3\n. b"),
+ ('2000:hijklmn', "F TEST3\n. b")])
+
+ s = summary.Summary()
+ req = FakeRequest([builder0, builder1])
+ out = s.body(req)
+
+ p999 = out.find('999')
+ p999builder0 = out.find('builder0', p999)
+ p1000 = out.find('1000')
+ p1000builder0 = out.find('builder0', p1000)
+ assert p999builder0-p999 == p1000builder0-p1000+2,'%d != %d' %(
+ p999builder0-p999,
p1000builder0-p1000+1)
+
+ req.args = {'recentrev': ['abcdefg']}
+ out = s.body(req)
+ assert out.count('999') == 1
+
def test_build_times_and_filtering(self):
builder1 = status_builder.BuilderStatus('builder1', '', self.master,
'')
builder2 = status_builder.BuilderStatus('builder2', '', self.master,
'')
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit