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

Reply via email to