<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[161440] trunk/Tools</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/161440">161440</a></dd>
<dt>Author</dt> <dd>ap@apple.com</dd>
<dt>Date</dt> <dd>2014-01-07 11:35:29 -0800 (Tue, 07 Jan 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Improve display of failed builds at build.webkit.org/dashboard
https://bugs.webkit.org/show_bug.cgi?id=126542
&lt;rdar://problem/15753550&gt;

Reviewed by Timothy Hatcher.

* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotBuilderQueueView.js:
Instead of hardcoding step name, look for the first step that failed.
While at it, added a popover with more links. There are multiple, and it's good
to have a choice of which one to look at in each situation.

* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotIteration.js:
(BuildbotIteration.prototype.get successful): Being successful is not the opposite
of having failed. Many iterations are interrupted for whatever reason internal to
Buildbot, and these are suppoed to be orange, not red.
(BuildbotIteration.prototype.get productive): Changed to exclude inerrupted iterations,
not only WillRetry ones.
(BuildbotIteration.prototype.get failed): Changed to only include iterations that
actually failed, more likely indicating a problem with code base.
(BuildbotIteration.prototype.get firstFailedStepName):
(BuildbotIteration.prototype.failureLogURL): Expose informaiton about failure.
(BuildbotIteration.prototype.get failureLogs): Ditto.
(BuildbotIteration.prototype.update): Store complete results for the failed step.
Not every failure stops the iteration, so we could have multiple failed steps,
but let's see if seeing just the first one will be enough.

* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueue.js:
(BuildbotQueue.prototype.get firstRecentUnsuccessfulIteration): Updated to work in
terms of successful iterations.
(BuildbotQueue.prototype.get mostRecentSuccessfulIteration): Ditto.

* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotTesterQueueView.js:
(BuildbotTesterQueueView.prototype.update.appendBuilderQueueStatus): Updated to work in
terms of successful iterations.

* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/WebKitBuildbot.js:
Removed code to create a path to build output, we now take it from results JSON.

* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Styles/QueueView.css:
Added styles for the new popover.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBuildbotBuilderQueueViewjs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotBuilderQueueView.js</a></li>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBuildbotIterationjs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotIteration.js</a></li>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBuildbotQueuejs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueue.js</a></li>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBuildbotTesterQueueViewjs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotTesterQueueView.js</a></li>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsWebKitBuildbotjs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/WebKitBuildbot.js</a></li>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardStylesQueueViewcss">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Styles/QueueView.css</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBuildbotBuilderQueueViewjs"></a>
<div class="modfile"><h4>Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotBuilderQueueView.js (161439 => 161440)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotBuilderQueueView.js        2014-01-07 19:30:34 UTC (rev 161439)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotBuilderQueueView.js        2014-01-07 19:35:29 UTC (rev 161440)
</span><span class="lines">@@ -62,36 +62,43 @@
</span><span class="cx">         {
</span><span class="cx">             this._appendPendingRevisionCount(queue);
</span><span class="cx"> 
</span><del>-            var firstRecentFailedIteration = queue.firstRecentFailedIteration;
-            if (firstRecentFailedIteration &amp;&amp; firstRecentFailedIteration.loaded) {
</del><ins>+            var firstRecentUnsuccessfulIteration = queue.firstRecentUnsuccessfulIteration;
+            if (firstRecentUnsuccessfulIteration &amp;&amp; firstRecentUnsuccessfulIteration.loaded) {
</ins><span class="cx">                 var failureCount = queue.recentFailedIterationCount;
</span><del>-                var message = this.revisionContentForIteration(firstRecentFailedIteration);
-                if (firstRecentFailedIteration.webkitCompilationFailed) {
-                    // Link directly to compiler output.
-                    // FIXME: Results JSON may contain multiple log links, including one for nicely filtered result.
-                    // Which one is best to use? Do we want the filtered one in a popover?
-                    var url = queue.buildbot.buildLogURLForIteration(firstRecentFailedIteration);
</del><ins>+                var message = this.revisionContentForIteration(firstRecentUnsuccessfulIteration);
+                if (firstRecentUnsuccessfulIteration.failed) {
+                    // Assume it was a build step that failed, and link directly to output.
+                    var url = firstRecentUnsuccessfulIteration.failureLogURL(&quot;build log&quot;);
+                    if (!url)
+                        url = firstRecentUnsuccessfulIteration.failureLogURL(&quot;stdio&quot;);
</ins><span class="cx">                     var status = StatusLineView.Status.Bad;
</span><del>-                } else {
-                    // Some other step failed, link to main buildbot page for the iteration.
-                    var url = queue.buildbot.buildPageURLForIteration(firstRecentFailedIteration);
</del><ins>+                } else
</ins><span class="cx">                     var status = StatusLineView.Status.Danger;
</span><del>-                }
-                var status = new StatusLineView(message, status, failureCount &gt; 1 ? &quot;failures since&quot; : firstRecentFailedIteration.text, failureCount &gt; 1 ? failureCount : null, url);
</del><ins>+
+                // Show a popover when the URL is not a main build page one, because there are usually multiple logs, and it's good to provide a choice.
+                var needsPopover = !!url;
+
+                // Some other step failed, link to main buildbot page for the iteration.
+                if (!url)
+                    url = queue.buildbot.buildPageURLForIteration(firstRecentUnsuccessfulIteration);
+                var status = new StatusLineView(message, status, failureCount &gt; 1 ? &quot;failures since&quot; : firstRecentUnsuccessfulIteration.text, failureCount &gt; 1 ? failureCount : null, url);
</ins><span class="cx">                 this.element.appendChild(status.element);
</span><ins>+
+                if (needsPopover)
+                    new PopoverTracker(status.statusBubbleElement, this._presentPopoverFailureLogs.bind(this), firstRecentUnsuccessfulIteration);
</ins><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             var mostRecentSuccessfulIteration = queue.mostRecentSuccessfulIteration;
</span><span class="cx">             if (mostRecentSuccessfulIteration &amp;&amp; mostRecentSuccessfulIteration.loaded) {
</span><span class="cx">                 var message = this.revisionContentForIteration(mostRecentSuccessfulIteration);
</span><span class="cx">                 var url = queue.buildbot.buildPageURLForIteration(mostRecentSuccessfulIteration);
</span><del>-                var status = new StatusLineView(message, StatusLineView.Status.Good, firstRecentFailedIteration ? &quot;last successful build&quot; : &quot;latest build&quot;, null, url);
</del><ins>+                var status = new StatusLineView(message, StatusLineView.Status.Good, firstRecentUnsuccessfulIteration ? &quot;last successful build&quot; : &quot;latest build&quot;, null, url);
</ins><span class="cx">                 this.element.appendChild(status.element);
</span><span class="cx">             } else {
</span><del>-                var status = new StatusLineView(&quot;unknown&quot;, StatusLineView.Status.Neutral, firstRecentFailedIteration ? &quot;last successful build&quot; : &quot;latest build&quot;);            
</del><ins>+                var status = new StatusLineView(&quot;unknown&quot;, StatusLineView.Status.Neutral, firstRecentUnsuccessfulIteration ? &quot;last successful build&quot; : &quot;latest build&quot;);            
</ins><span class="cx">                 this.element.appendChild(status.element);
</span><span class="cx"> 
</span><del>-                if (firstRecentFailedIteration) {
</del><ins>+                if (firstRecentUnsuccessfulIteration) {
</ins><span class="cx">                     // We have a failed iteration but no successful. It might be further back in time.
</span><span class="cx">                     // Update all the iterations so we get more history.
</span><span class="cx">                     queue.iterations.forEach(function(iteration) { iteration.update(); });
</span><span class="lines">@@ -120,5 +127,45 @@
</span><span class="cx">         appendBuildArchitecture.call(this, this.universalDebugQueues, this.hasMultipleDebugBuilds ? &quot;Debug (Universal)&quot; : &quot;Debug&quot;);
</span><span class="cx">         appendBuildArchitecture.call(this, this.sixtyFourBitDebugQueues, this.hasMultipleDebugBuilds ? &quot;Debug (64-bit)&quot; : &quot;Debug&quot;);
</span><span class="cx">         appendBuildArchitecture.call(this, this.thirtyTwoBitDebugQueues, this.hasMultipleDebugBuilds ? &quot;Debug (32-bit)&quot; : &quot;Debug&quot;);
</span><ins>+    },
+
+    _presentPopoverFailureLogs: function(element, popover, iteration)
+    {
+        var content = document.createElement(&quot;div&quot;);
+        content.className = &quot;build-logs-popover&quot;;
+
+        function addLog(name, url) {
+            var line = document.createElement(&quot;a&quot;);
+            line.className = &quot;build-log-link&quot;;
+            line.href = url;
+            line.textContent = name;
+            line.target = &quot;_blank&quot;;
+            content.appendChild(line);
+        }
+
+        var title = document.createElement(&quot;div&quot;);
+        title.className = &quot;build-logs-popover-title&quot;;
+        title.textContent = iteration.queue.id;
+        content.appendChild(title);
+        
+        var builderPageLine = document.createElement(&quot;a&quot;);
+        builderPageLine.className = &quot;build-page-link&quot;;
+        builderPageLine.href = iteration.queue.buildbot.buildPageURLForIteration(iteration);
+        builderPageLine.textContent = &quot;build #&quot; + iteration.id;
+        builderPageLine.target = &quot;_blank&quot;;
+        content.appendChild(builderPageLine);
+
+        var logsHeadingLine = document.createElement(&quot;div&quot;);
+        logsHeadingLine.className = &quot;build-logs-heading&quot;;
+        logsHeadingLine.textContent = iteration.firstFailedStepName + &quot; failed&quot;;
+        content.appendChild(logsHeadingLine);
+
+        for (var i = 0, end = iteration.failureLogs.length; i &lt; end; ++i)
+            addLog(iteration.failureLogs[i][0], iteration.failureLogs[i][1]);
+
+        var rect = Dashboard.Rect.rectFromClientRect(element.getBoundingClientRect());
+        popover.content = content;
+        popover.present(rect, [Dashboard.RectEdge.MIN_Y, Dashboard.RectEdge.MAX_Y, Dashboard.RectEdge.MAX_X, Dashboard.RectEdge.MIN_X]);
+        return true;
</ins><span class="cx">     }
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBuildbotIterationjs"></a>
<div class="modfile"><h4>Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotIteration.js (161439 => 161440)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotIteration.js        2014-01-07 19:30:34 UTC (rev 161439)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotIteration.js        2014-01-07 19:35:29 UTC (rev 161440)
</span><span class="lines">@@ -76,11 +76,53 @@
</span><span class="cx">         this._finished = x;
</span><span class="cx">     },
</span><span class="cx"> 
</span><ins>+    get successful()
+    {
+        return this._result === BuildbotIteration.SUCCESS;
+    },
+
</ins><span class="cx">     get productive()
</span><span class="cx">     {
</span><del>-        return this.loaded &amp;&amp; this._finished &amp;&amp; !this.willRetry;
</del><ins>+        return this.loaded &amp;&amp; this._finished &amp;&amp; this._result !== BuildbotIteration.EXCEPTION &amp;&amp; this._result !== BuildbotIteration.RETRY;
</ins><span class="cx">     },
</span><span class="cx"> 
</span><ins>+    // It is not a real failure if Buildbot itself failed with codes like EXCEPTION or RETRY.
+    get failed()
+    {
+        return this._result === BuildbotIteration.FAILURE;
+    },
+
+    get firstFailedStepName()
+    {
+        if (!this._firstFailedStep)
+            return undefined;
+        return this._firstFailedStep.name;
+    },
+
+    failureLogURL: function(kind)
+    {
+        if (!this.failed)
+            return undefined;
+
+        console.assert(this._firstFailedStep);
+
+        for (var i = 0; i &lt; this._firstFailedStep.logs.length; ++i) {
+            if (this._firstFailedStep.logs[i][0] == kind)
+                return this._firstFailedStep.logs[i][1];
+        }
+
+        return undefined;
+    },
+
+    get failureLogs()
+    {
+        if (!this.failed)
+            return undefined;
+
+        console.assert(this._firstFailedStep);
+        return this._firstFailedStep.logs;
+    },
+
</ins><span class="cx">     get previousProductiveIteration()
</span><span class="cx">     {
</span><span class="cx">         for (var i = 0; i &lt; this.queue.iterations.length - 1; ++i) {
</span><span class="lines">@@ -164,10 +206,6 @@
</span><span class="cx">             var internalRevisionProperty = data.properties.findFirst(function(property) { return property[0] === &quot;internal_got_revision&quot;; });
</span><span class="cx">             this.internalRevision = internalRevisionProperty ? parseInt(internalRevisionProperty[1], 10) : null;
</span><span class="cx"> 
</span><del>-            var compileWebKitStep = data.steps.findFirst(function(step) { return step.name === &quot;compile-webkit&quot;; });
-            if (compileWebKitStep)
-                this.webkitCompilationFailed = compileWebKitStep.results[0] !== BuildbotIteration.SUCCESS;
-
</del><span class="cx">             var layoutTestResults = collectTestResults.call(this, data, &quot;layout-test&quot;);
</span><span class="cx">             this.layoutTestResults = layoutTestResults ? new BuildbotTestResults(this, layoutTestResults) : null;
</span><span class="cx"> 
</span><span class="lines">@@ -191,9 +229,11 @@
</span><span class="cx"> 
</span><span class="cx">             this.loaded = true;
</span><span class="cx"> 
</span><del>-            this.failed = !!data.results;
-            this.willRetry = data.results === BuildbotIteration.RETRY;
</del><ins>+            this._firstFailedStep = data.steps.findFirst(function(step) { return step.results[0] === BuildbotIteration.FAILURE; });
</ins><span class="cx"> 
</span><ins>+            console.assert(data.results === null || typeof data.results === &quot;number&quot;);
+            this._result = data.results;
+
</ins><span class="cx">             this.text = data.text.join(&quot; &quot;);
</span><span class="cx"> 
</span><span class="cx">             if (!data.currentStep)
</span></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBuildbotQueuejs"></a>
<div class="modfile"><h4>Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueue.js (161439 => 161440)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueue.js        2014-01-07 19:30:34 UTC (rev 161439)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueue.js        2014-01-07 19:35:29 UTC (rev 161440)
</span><span class="lines">@@ -88,20 +88,20 @@
</span><span class="cx">         return this.iterations[0];
</span><span class="cx">     },
</span><span class="cx"> 
</span><del>-    get firstRecentFailedIteration()
</del><ins>+    get firstRecentUnsuccessfulIteration()
</ins><span class="cx">     {
</span><span class="cx">         if (!this.iterations.length)
</span><span class="cx">             return null;
</span><span class="cx"> 
</span><span class="cx">         for (var i = 0; i &lt; this.iterations.length; ++i) {
</span><del>-            if (!this.iterations[i].finished || this.iterations[i].failed)
</del><ins>+            if (!this.iterations[i].finished || !this.iterations[i].successful)
</ins><span class="cx">                 continue;
</span><del>-            if (this.iterations[i - 1] &amp;&amp; this.iterations[i - 1].failed)
</del><ins>+            if (this.iterations[i - 1] &amp;&amp; this.iterations[i - 1].finished &amp;&amp; !this.iterations[i - 1].successful)
</ins><span class="cx">                 return this.iterations[i - 1];
</span><span class="cx">             return null;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (this.iterations[this.iterations.length - 1].failed)
</del><ins>+        if (!this.iterations[this.iterations.length - 1].successful)
</ins><span class="cx">             return this.iterations[this.iterations.length - 1];
</span><span class="cx"> 
</span><span class="cx">         return null;
</span><span class="lines">@@ -121,7 +121,7 @@
</span><span class="cx">     get mostRecentSuccessfulIteration()
</span><span class="cx">     {
</span><span class="cx">         for (var i = 0; i &lt; this.iterations.length; ++i) {
</span><del>-            if (!this.iterations[i].finished || this.iterations[i].failed)
</del><ins>+            if (!this.iterations[i].finished || !this.iterations[i].successful)
</ins><span class="cx">                 continue;
</span><span class="cx">             return this.iterations[i];
</span><span class="cx">         }
</span></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBuildbotTesterQueueViewjs"></a>
<div class="modfile"><h4>Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotTesterQueueView.js (161439 => 161440)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotTesterQueueView.js        2014-01-07 19:30:34 UTC (rev 161439)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotTesterQueueView.js        2014-01-07 19:35:29 UTC (rev 161440)
</span><span class="lines">@@ -66,7 +66,7 @@
</span><span class="cx">                 var perlTestResults = iteration.perlTestResults || {failureCount: 0};
</span><span class="cx">                 var bindingTestResults = iteration.bindingTestResults || {errorOccurred: false};
</span><span class="cx"> 
</span><del>-                if (!iteration.failed) {
</del><ins>+                if (iteration.successful) {
</ins><span class="cx">                     var status = new StatusLineView(messageElement, StatusLineView.Status.Good, &quot;all tests passed&quot;);
</span><span class="cx">                     limit = 0;
</span><span class="cx">                 } else if (!iteration.productive) {
</span></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsWebKitBuildbotjs"></a>
<div class="modfile"><h4>Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/WebKitBuildbot.js (161439 => 161440)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/WebKitBuildbot.js        2014-01-07 19:30:34 UTC (rev 161439)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/WebKitBuildbot.js        2014-01-07 19:35:29 UTC (rev 161440)
</span><span class="lines">@@ -59,11 +59,6 @@
</span><span class="cx">     constructor: WebKitBuildbot,
</span><span class="cx">     __proto__: Buildbot.prototype,
</span><span class="cx"> 
</span><del>-    buildLogURLForIteration: function(iteration)
-    {
-        return this.baseURL + &quot;builders/&quot; + encodeURIComponent(iteration.queue.id) + &quot;/builds/&quot; + iteration.id + &quot;/steps/compile-webkit/logs/stdio/text&quot;;
-    },
-
</del><span class="cx">     layoutTestResultsDirectoryURLForIteration: function(iteration)
</span><span class="cx">     {
</span><span class="cx">         return this.baseURL + &quot;results/&quot; + encodeURIComponent(iteration.queue.id) + &quot;/&quot; + encodeURIComponent(&quot;r&quot; + iteration.openSourceRevision + &quot; (&quot; + iteration.id + &quot;)&quot;);
</span></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardStylesQueueViewcss"></a>
<div class="modfile"><h4>Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Styles/QueueView.css (161439 => 161440)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Styles/QueueView.css        2014-01-07 19:30:34 UTC (rev 161439)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Styles/QueueView.css        2014-01-07 19:35:29 UTC (rev 161440)
</span><span class="lines">@@ -63,6 +63,26 @@
</span><span class="cx">     height: 7px;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+.build-logs-popover {
+    font-family: &quot;HelveticaNeue-Light&quot;, &quot;Helvetica Neue&quot;, sans-serif;
+    color: rgb(145, 135, 95);
+    font-size: 12px;
+    text-align: left;
+    padding: 1px 6px 1px 6px;
+}
+
+.build-logs-popover .build-logs-heading {
+    display: inline;
+}
+
+.build-logs-popover .build-page-link {
+    display: block;
+}
+
+.build-logs-popover .build-log-link {
+    padding-left: 5px;
+}
+
</ins><span class="cx"> .test-results-popover {
</span><span class="cx">     font-family: &quot;HelveticaNeue-Light&quot;, &quot;Helvetica Neue&quot;, sans-serif;
</span><span class="cx">     color: rgb(145, 135, 95);
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (161439 => 161440)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2014-01-07 19:30:34 UTC (rev 161439)
+++ trunk/Tools/ChangeLog        2014-01-07 19:35:29 UTC (rev 161440)
</span><span class="lines">@@ -1,3 +1,46 @@
</span><ins>+2014-01-07  Alexey Proskuryakov  &lt;ap@apple.com&gt;
+
+        Improve display of failed builds at build.webkit.org/dashboard
+        https://bugs.webkit.org/show_bug.cgi?id=126542
+        &lt;rdar://problem/15753550&gt;
+
+        Reviewed by Timothy Hatcher.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotBuilderQueueView.js:
+        Instead of hardcoding step name, look for the first step that failed.
+        While at it, added a popover with more links. There are multiple, and it's good
+        to have a choice of which one to look at in each situation.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotIteration.js:
+        (BuildbotIteration.prototype.get successful): Being successful is not the opposite
+        of having failed. Many iterations are interrupted for whatever reason internal to
+        Buildbot, and these are suppoed to be orange, not red.
+        (BuildbotIteration.prototype.get productive): Changed to exclude inerrupted iterations,
+        not only WillRetry ones.
+        (BuildbotIteration.prototype.get failed): Changed to only include iterations that
+        actually failed, more likely indicating a problem with code base.
+        (BuildbotIteration.prototype.get firstFailedStepName):
+        (BuildbotIteration.prototype.failureLogURL): Expose informaiton about failure.
+        (BuildbotIteration.prototype.get failureLogs): Ditto.
+        (BuildbotIteration.prototype.update): Store complete results for the failed step.
+        Not every failure stops the iteration, so we could have multiple failed steps,
+        but let's see if seeing just the first one will be enough.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueue.js:
+        (BuildbotQueue.prototype.get firstRecentUnsuccessfulIteration): Updated to work in
+        terms of successful iterations.
+        (BuildbotQueue.prototype.get mostRecentSuccessfulIteration): Ditto.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotTesterQueueView.js:
+        (BuildbotTesterQueueView.prototype.update.appendBuilderQueueStatus): Updated to work in
+        terms of successful iterations.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/WebKitBuildbot.js:
+        Removed code to create a path to build output, we now take it from results JSON.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Styles/QueueView.css:
+        Added styles for the new popover.
+
</ins><span class="cx"> 2014-01-07  Gergo Balogh  &lt;geryxyz@inf.u-szeged.hu&gt;
</span><span class="cx"> 
</span><span class="cx">         defined constants should use all uppercase names with words separated by underscores.
</span></span></pre>
</div>
</div>

</body>
</html>