Author: mattip <matti.pi...@gmail.com> 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 pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit