[ews] status bubbles should show details from all the builds in case build is retried
https://bugs.webkit.org/show_bug.cgi?id=203117

Reviewed by Jonathan Bedard.

* BuildSlaveSupport/ews-app/ews/views/statusbubble.py:
(StatusBubble._build_bubble): Display messages from all the builds (including retried builds) for a patch on a queue.
(StatusBubble._steps_messages_from_multiple_builds): Method to generate status using information from all the retried builds.
(StatusBubble.get_all_builds_for_queue): Method to get all the builds instead of just the latest one.
(StatusBubble.get_latest_build_for_queue): Modified to use the new get_all_builds_for_queue() method.


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@251256 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Tools/BuildSlaveSupport/ews-app/ews/views/statusbubble.py b/Tools/BuildSlaveSupport/ews-app/ews/views/statusbubble.py
index 5f649c6..16d234c 100644
--- a/Tools/BuildSlaveSupport/ews-app/ews/views/statusbubble.py
+++ b/Tools/BuildSlaveSupport/ews-app/ews/views/statusbubble.py
@@ -73,7 +73,10 @@
             if self._is_builder_queue(queue):
                 bubble['name'] = StatusBubble.BUILDER_ICON + '  ' + bubble['name']
 
-        build, is_parent_build = self.get_latest_build_for_queue(patch, queue, self._get_parent_queue(queue))
+        builds, is_parent_build = self.get_all_builds_for_queue(patch, queue, self._get_parent_queue(queue))
+        build = None
+        if builds:
+            build = builds[0]
         if not self._should_show_bubble_for_build(build):
             return None
 
@@ -94,7 +97,7 @@
                 bubble['state'] = 'provisional-fail'
             else:
                 bubble['state'] = 'started'
-            bubble['details_message'] = 'Build is in-progress. Recent messages:\n\n' + self._steps_messages(build)
+            bubble['details_message'] = 'Build is in-progress. Recent messages:' + self._steps_messages_from_multiple_builds(builds)
         elif build.result == Buildbot.SUCCESS:
             if is_parent_build:
                 if patch.modified < (timezone.now() - datetime.timedelta(days=StatusBubble.DAYS_TO_CHECK)):
@@ -103,13 +106,13 @@
                     # added after the patch was submitted, or build request for that patch was cancelled.
                     return None
                 bubble['state'] = 'started'
-                bubble['details_message'] = 'Build is in-progress. Recent messages:\n\n' + self._steps_messages(build) + '\n\nWaiting to run tests.'
+                bubble['details_message'] = 'Build is in-progress. Recent messages:' + self._steps_messages_from_multiple_builds(builds) + '\n\nWaiting to run tests.'
             else:
                 bubble['state'] = 'pass'
                 bubble['details_message'] = 'Pass'
         elif build.result == Buildbot.WARNINGS:
             bubble['state'] = 'pass'
-            bubble['details_message'] = 'Warning\n\n' + self._steps_messages(build)
+            bubble['details_message'] = 'Warning' + self._steps_messages_from_multiple_builds(builds)
         elif build.result == Buildbot.FAILURE:
             bubble['state'] = 'fail'
             bubble['details_message'] = self._most_recent_step_message(build)
@@ -125,16 +128,16 @@
 
         elif build.result == Buildbot.EXCEPTION:
             bubble['state'] = 'error'
-            bubble['details_message'] = 'An unexpected error occured. Recent messages:\n\n' + self._steps_messages(build)
+            bubble['details_message'] = 'An unexpected error occured. Recent messages:' + self._steps_messages_from_multiple_builds(builds)
         elif build.result == Buildbot.RETRY:
             bubble['state'] = 'provisional-fail'
-            bubble['details_message'] = 'Build is being retried. Recent messages:\n\n' + self._steps_messages(build)
+            bubble['details_message'] = 'Build is being retried. Recent messages:' + self._steps_messages_from_multiple_builds(builds)
         elif build.result == Buildbot.CANCELLED:
             bubble['state'] = 'fail'
-            bubble['details_message'] = 'Build was cancelled. Recent messages:\n\n' + self._steps_messages(build)
+            bubble['details_message'] = 'Build was cancelled. Recent messages:' + self._steps_messages_from_multiple_builds(builds)
         else:
             bubble['state'] = 'error'
-            bubble['details_message'] = 'An unexpected error occured. Recent messages:\n\n' + self._steps_messages(build)
+            bubble['details_message'] = 'An unexpected error occured. Recent messages:' + self._steps_messages_from_multiple_builds(builds)
 
         if 'details_message' in bubble:
             bubble['details_message'] = builder_full_name + '\n\n' + bubble['details_message']
@@ -180,6 +183,12 @@
     def _steps_messages(self, build):
         return '\n'.join([step.state_string for step in build.step_set.all().order_by('uid') if self._should_display_step(step)])
 
+    def _steps_messages_from_multiple_builds(self, builds):
+        message = ''
+        for build in reversed(builds):
+            message += '\n\n' + self._steps_messages(build)
+        return message
+
     def _should_display_step(self, step):
         return not filter(lambda step_to_hide: re.search(step_to_hide, step.state_string), StatusBubble.STEPS_TO_HIDE)
 
@@ -196,6 +205,12 @@
         return recent_step.state_string
 
     def get_latest_build_for_queue(self, patch, queue, parent_queue=None):
+        builds, is_parent_build = self.get_all_builds_for_queue(patch, queue, parent_queue)
+        if not builds:
+            return (None, None)
+        return (builds[0], is_parent_build)
+
+    def get_all_builds_for_queue(self, patch, queue, parent_queue=None):
         builds = self.get_builds_for_queue(patch, queue)
         is_parent_build = False
         if not builds and parent_queue:
@@ -204,7 +219,7 @@
         if not builds:
             return (None, None)
         builds.sort(key=lambda build: build.started_at, reverse=True)
-        return (builds[0], is_parent_build)
+        return (builds, is_parent_build)
 
     def get_builds_for_queue(self, patch, queue):
         return [build for build in patch.build_set.all() if build.builder_display_name == queue]
diff --git a/Tools/ChangeLog b/Tools/ChangeLog
index 602ebfc..13c2afc 100644
--- a/Tools/ChangeLog
+++ b/Tools/ChangeLog
@@ -1,3 +1,16 @@
+2019-10-17  Aakash Jain  <aakash_jain@apple.com>
+
+        [ews] status bubbles should show details from all the builds in case build is retried
+        https://bugs.webkit.org/show_bug.cgi?id=203117
+
+        Reviewed by Jonathan Bedard.
+
+        * BuildSlaveSupport/ews-app/ews/views/statusbubble.py:
+        (StatusBubble._build_bubble): Display messages from all the builds (including retried builds) for a patch on a queue.
+        (StatusBubble._steps_messages_from_multiple_builds): Method to generate status using information from all the retried builds. 
+        (StatusBubble.get_all_builds_for_queue): Method to get all the builds instead of just the latest one.
+        (StatusBubble.get_latest_build_for_queue): Modified to use the new get_all_builds_for_queue() method.
+
 2019-10-17  Emilio Cobos Álvarez  <emilio@crisal.io>
 
         [GTK] Explicitly use Python 2 in jhbuild-wrapper