Title: [91677] trunk/Tools
Revision
91677
Author
[email protected]
Date
2011-07-25 10:51:07 -0700 (Mon, 25 Jul 2011)

Log Message

Overhaul garden-o-matic frontend to integrate revision history and failures
https://bugs.webkit.org/show_bug.cgi?id=65089

Reviewed by Dimitri Glazkov.

This is a major overhaul of the garden-o-matic frontend.  The new UI
integrates the revision history information with failures.  Failures
appear in context adjacent to the revisions that caused them (which are
highlighted).  Each buildbot receives a collumn to the left, which
indicates which revisions that bot has tested and whether that bot
showed the indicated failures.

Failures are selectable with checkboxes, and can then either be
examined or rebaselined.

* BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/Trac.js:
* BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/base.js:
* BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/garden-o-matic.html:
* BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/main.css:
* BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/main.js:
* BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/results.js:
* BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/results_unittests.js:
* BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/ui.js:
* BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/ui_unittests.js:

Modified Paths

Added Paths

Diff

Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/Trac.js (91676 => 91677)


--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/Trac.js	2011-07-25 17:47:31 UTC (rev 91676)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/Trac.js	2011-07-25 17:51:07 UTC (rev 91677)
@@ -62,6 +62,9 @@
             continue;
         if (findReviewer(line))
             continue;
+        // Old-style commit message.
+        if (/^\d\d\d\d-\d\d-\d\d/.exec(line))
+            continue;
         if (line.length > 0)
             return line;
     }

Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/base.js (91676 => 91677)


--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/base.js	2011-07-25 17:47:31 UTC (rev 91676)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/base.js	2011-07-25 17:51:07 UTC (rev 91677)
@@ -2,6 +2,13 @@
 
 (function(){
 
+base.asInteger = function(stringOrInteger)
+{
+    if (typeof stringOrInteger == 'string')
+        return parseInt(stringOrInteger);
+    return stringOrInteger;
+};
+
 base.endsWith = function(string, suffix)
 {
     if (suffix.length > string.length)
@@ -10,6 +17,11 @@
     return string.lastIndexOf(suffix) == expectedIndex;
 };
 
+base.repeatString = function(string, count)
+{
+    return new Array(count + 1).join(string);
+};
+
 base.joinPath = function(parent, child)
 {
     if (parent.length == 0)
@@ -111,6 +123,32 @@
         this._callback.apply(null, this._args);
 };
 
+base.callInParallel = function(functionList, callback)
+{
+    var requestTracker = new base.RequestTracker(functionList.length, callback);
+
+    $.each(functionList, function(index, func) {
+        func(function() {
+            requestTracker.requestComplete();
+        });
+    });
+};
+
+base.callInSequence = function(functionList, callback)
+{
+    var nextIndex = 0;
+
+    function callNext()
+    {
+        if (nextIndex >= functionList.length)
+            callback();
+
+        functionList[nextIndex].call(null, callNext);
+    }
+
+    callNext();
+};
+
 base.CallbackIterator = function(callback, listOfArgumentArrays)
 {
     this._callback = callback;

Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/garden-o-matic.html (91676 => 91677)


--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/garden-o-matic.html	2011-07-25 17:47:31 UTC (rev 91676)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/garden-o-matic.html	2011-07-25 17:51:07 UTC (rev 91677)
@@ -12,16 +12,11 @@
 <body>
 <div class="butterbar"><span class="status">Loading...</span></div>
 <div class="infobar"><span class="status"></span></div>
-<div class="recent-history"></div>
-<div class="results">
-    <div class="content"></div>
-    <div class="toolbar">
-        <div class="actions">
-            <button class="triage">Triage Failures</button>
-            <button class="rebaseline-selected">Rebaseline Selected</button>
-        </div>
-    </div>
+<div class="actions">
+    <button class="show-selected-failures">Show Selected Failures</button>
+    <button class="rebaseline-selected">Rebaseline Selected</button>
 </div>
+<div class="recent-history"></div>
 <div class="results-detail">
     <div class="toolbar">
         <div class="actions">
@@ -39,6 +34,7 @@
 <script src=""
 <script src=""
 <script src=""
+<script src=""
 <script src=""
 </body>
 </html>

Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/main.css (91676 => 91677)


--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/main.css	2011-07-25 17:47:31 UTC (rev 91676)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/main.css	2011-07-25 17:51:07 UTC (rev 91677)
@@ -18,15 +18,15 @@
 td, th {
     overflow: hidden;
     vertical-align: top;
-    border-right: 1px solid #c6c6c6;
+    /* border-right: 1px solid #c6c6c6; */
 }
 
 td:last-of-type, th:last-of-type {
-    border-right: 0px;
+    /* border-right: 0px; */
 }
 
 th {
-    border-bottom: 1px solid #c6c6c6;
+    /* border-bottom: 1px solid #c6c6c6; */
 }
 
 button {
@@ -137,69 +137,51 @@
 /*** recent-history ***/
 
 .recent-history {
-    width: 300px;
-    float: left;
 }
 
-.changelog .entry {
-    margin: 10px 5px;
+.recent-history .builder {
+    width: 5px;
+    border-right: 1px solid #f5f5f5;
 }
 
-.changelog .details, .changelog .details a {
-    color: #555;
+.recent-history .built {
+    background-color: #c6c6c6;
 }
 
-.changelog .author {
-    font-style: italic;
+.recent-history td[data-failure-types] {
+    background-color: Black;
 }
 
-/*** results-summary ***/
-
-.results .toolbar {
-    text-align: center;
-    display: none;
+.changelog .result {
+    padding: 3px 0px;
+    border-top: 2px solid white;
+    border-bottom: 2px solid white;
 }
 
-table.results-summary {
-    width: auto;
-    table-layout: auto;
-    margin: 5px;
-    border: 1px solid #c6c6c6;
+.changelog .test {
+    padding-left: 3px;
 }
 
-.results-summary td, .results-summary th {
-    padding: 4px;
+.changelog .entry {
+    padding: 5px 0px 5px 3px;
 }
 
-.results-summary tbody tr {
-    display: none;
+.changelog .possible-regression {
+    background-color: PapayaWhip;
 }
 
-.results-summary ul {
-    margin: 0px;
-    padding: 0px;
-    list-style: none;
-    display: inline-block;
+.changelog .details, .changelog .details a {
+    color: #555;
 }
 
-.results-summary li {
-    display: inline-block;
-    margin: 0px 5px;
+.changelog .author {
+    font-style: italic;
 }
 
-.results-summary a {
-    font-weight: normal;
-}
-
-.results-summary .what a {
-    text-decoration: none;
-    padding: 1px 2px;
-    color: black;
-}
-
 .test-name.IMAGE\+TEXT::after {
     content: 'IMAGE+TEXT';
     font-weight: normal;
+    text-decoration: none;
     color: white;
     background-color: Indigo;
     font-size: 10px;
@@ -211,6 +193,7 @@
 .test-name.IMAGE::after {
     content: 'IMAGE';
     font-weight: normal;
+    text-decoration: none;
     color: white;
     background-color: MidnightBlue;
     font-size: 10px;
@@ -222,6 +205,7 @@
 .test-name.TIMEOUT::after {
     content: 'TIMEOUT';
     font-weight: normal;
+    text-decoration: none;
     color: white;
     background-color: DarkGoldenRod;
     font-size: 10px;
@@ -233,6 +217,7 @@
 .test-name.TEXT::after {
     content: 'TEXT';
     font-weight: normal;
+    text-decoration: none;
     color: white;
     background-color: DodgerBlue;
     font-size: 10px;
@@ -244,6 +229,7 @@
 .test-name.CRASH::after {
     content: 'CRASH';
     font-weight: normal;
+    text-decoration: none;
     color: white;
     background-color: Tomato;
     font-size: 10px;
@@ -252,12 +238,6 @@
     border-radius: 4px;
 }
 
-/* If we've only seen a given test failure once, we dim it so as not to distract the gardener. */
-.results-summary .test[data-failure-count="1"] {
-    -webkit-transition: 1s opacity;
-    opacity: 0.5;
-}
-
 /*** results-detail ***/
 
 .results-detail {

Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/main.js (91676 => 91677)


--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/main.js	2011-07-25 17:47:31 UTC (rev 91676)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/main.js	2011-07-25 17:51:07 UTC (rev 91677)
@@ -4,9 +4,9 @@
 
 var g_updateTimerId = 0;
 var g_resultsDetailsIterator = null;
+var g_treeState = {};
 
 var kBuildFailedInfobarType = 'build-failed';
-var kCommitLogLength = 20;
 
 function dismissButterbar()
 {
@@ -59,127 +59,34 @@
         button.attr('disabled', true)
 }
 
-function togglePartyTime(hasFailures)
+function showResultsDetail(testName, builderName, failureTypeList)
 {
-    if (!hasFailures) {
-        $('.results .content').text('No failures. Party time!');
-        var partyTime = $('<div class="partytime"><img src=""
-        $('.results .content').append(partyTime);
-        partyTime.fadeIn(1200).delay(7000).fadeOut();
-        return;
-    }
-    $('.results .content').empty();
-}
-
-function ensureResultsSummaryContainer()
-{
-    var container = $('.results-summary');
-    if (container.length)
-        return container;
-    container = ui.regressionsContainer();
-    $('.results .content').append(container);
-    return container;
-}
-
-function detachRepairedTestsAndPrepareTestMap(unexpectedFailures)
-{
-    var testMap = {};
-
-    $('.test').each(function() {
-        var testSummary = $(this);
-        var testName = testSummary.attr(config.kTestNameAttr);
-        if (!(testName in unexpectedFailures))
-            testSummary.slideUp(function() { testSummary.detach(); });
-        else
-            testMap[testName] = testSummary;
-    });
-
-    return testMap;
-}
-
-function prepareTestSummary(testName, resultNodesByBuilder, callback)
-{
-    var testSummary = ui.summarizeTest(testName, resultNodesByBuilder);
-    var builderNameList = base.keys(resultNodesByBuilder);
-
-    if (!kFastLoadingDEBUG) {
-        results.unifyRegressionRanges(builderNameList, testName, function(oldestFailingRevision, newestPassingRevision) {
-            $('.when', testSummary).append(ui.summarizeRegressionRange(oldestFailingRevision, newestPassingRevision));
-        });
-
-        results.countFailureOccurances(builderNameList, testName, function(failureCount) {
-            $(testSummary).attr(config.kFailureCountAttr, failureCount);
-            $('.how-many', testSummary).text(ui.failureCount(failureCount));
-        });
-    }
-
-    callback(testSummary);
-}
-
-function updateResultsSummary(callback)
-{
-    results.fetchResultsByBuilder(config.kBuilders, function(resultsByBuilder) {
-        var unexpectedFailures = results.unexpectedFailuresByTest(resultsByBuilder);
-        var hasFailures = !$.isEmptyObject(unexpectedFailures)
-
-        togglePartyTime(hasFailures);
-        setIconState(hasFailures);
-
-        var container = ensureResultsSummaryContainer();
-        var testMap = detachRepairedTestsAndPrepareTestMap(unexpectedFailures);
-
-        var newTestSummaries = $();
-        var requestTracker = new base.RequestTracker(base.keys(unexpectedFailures).length, function() {
-            newTestSummaries.fadeIn();
-            $('.results .toolbar').fadeIn();
-            callback()
-        });
-
-        $.each(unexpectedFailures, function(testName, resultNodesByBuilder) {
-            prepareTestSummary(testName, resultNodesByBuilder, function(testSummary) {
-                var existingElement = testMap[testName];
-                if (existingElement) {
-                    existingElement.replaceWith(testSummary);
-                    requestTracker.requestComplete();
-                    return;
-                }
-                $('tbody', container).append(testSummary);
-                newTestSummaries = newTestSummaries.add(testSummary);
-                requestTracker.requestComplete();
-            });
-        });
-    });
-}
-
-function showResultsDetail(testName, selectedBuilderName, failureTypeListByBuilder)
-{
-    var builderNameList = base.keys(failureTypeListByBuilder);
-    var failureTypeList = failureTypeListByBuilder[selectedBuilderName];
     var failureTypes = failureTypeList.join(' ');
 
     var content = $('.results-detail .content');
 
-    if ($('.failure-details', content).attr(config.kBuilderNameAttr) == selectedBuilderName &&
+    if ($('.failure-details', content).attr(config.kBuilderNameAttr) == builderName &&
         $('.failure-details', content).attr(config.kTestNameAttr) == testName &&
         $('.failure-details', content).attr(config.kFailureTypesAttr) == failureTypes)
         return;
 
     displayOnButterbar('Loading...');
 
-    results.fetchResultsURLs(selectedBuilderName, testName, failureTypeList, function(resultsURLs) {
+    results.fetchResultsURLs(builderName, testName, failureTypeList, function(resultsURLs) {
         var status = $('.results-detail .toolbar .status');
 
         status.empty();
         content.empty();
 
-        status.append(ui.failureDetailsStatus(testName, selectedBuilderName, failureTypes, builderNameList));
+        // FIXME: We should be passing the full list of failing builder names as the fourth argument.
+        status.append(ui.failureDetailsStatus(testName, builderName, failureTypes, [builderName]));
         content.append(ui.failureDetails(resultsURLs));
 
         toggleButton($('.results-detail .actions .next'), g_resultsDetailsIterator.hasNext());
         toggleButton($('.results-detail .actions .previous'), g_resultsDetailsIterator.hasPrevious());
         toggleButton($('.results-detail .actions .rebaseline'), results.canRebaseline(failureTypeList));
 
-        $('.failure-details', content).attr(config.kBuilderNameAttr, selectedBuilderName);
+        $('.failure-details', content).attr(config.kBuilderNameAttr, builderName);
         $('.failure-details', content).attr(config.kTestNameAttr, testName);
         $('.failure-details', content).attr(config.kFailureTypesAttr, failureTypes);
 
@@ -211,114 +118,124 @@
     g_resultsDetailsIterator.callPrevious();
 }
 
-function resultsDetailArgumentsForBuilderElement(builderBlock)
+function rebaselineResults()
 {
-    var selectedBuilderName = builderBlock.attr(config.kBuilderNameAttr);
+    var failureDetails = $('.failure-details', $(this).parents('.results-detail'));
 
-    var testSummary = builderBlock.parents('.test');
-    var testName = testSummary.attr(config.kTestNameAttr);
-
-    // FIXME: It's lame that we have two different representations of multiple failure types.
-    var failureTypes = testSummary.attr(config.kFailureTypesAttr);
+    var builderName = failureDetails.attr(config.kBuilderNameAttr);
+    var testName = failureDetails.attr(config.kTestNameAttr);
+    var failureTypes = failureDetails.attr(config.kFailureTypesAttr);
     var failureTypeList = failureTypes.split(' ');
 
-    var failureTypeListByBuilder = {}
-    $('.where .builder-name', testSummary).each(function() {
-        var builderName = $(this).attr(config.kBuilderNameAttr);
-        // FIXME: We should understand that tests can fail in different ways
-        // on different builders.
-        failureTypeListByBuilder[builderName] = failureTypeList;
-    });
-
-    return [testName, selectedBuilderName, failureTypeListByBuilder];
+    displayOnButterbar('Rebaselining...');
+    checkout.rebaseline(builderName, testName, failureTypeList, dismissButterbar);
 }
 
-function prepareResultsDetailsIterator(query)
+function selectedFailures()
 {
-    var listOfResultsDetailArguments = [];
+    var failures = [];
 
-    query.each(function() {
-        var resultsDetailArguments = resultsDetailArgumentsForBuilderElement($(this));
-        listOfResultsDetailArguments.push(resultsDetailArguments);
-    });
-
-    return new base.CallbackIterator(showResultsDetail, listOfResultsDetailArguments);
-}
-
-function triageFailures()
-{
-    g_resultsDetailsIterator = prepareResultsDetailsIterator($('.results .test .builder-name'));
-    g_resultsDetailsIterator.callNext();
-}
-
-function rebaselineSelected()
-{
-    var rebaselineTasks = [];
-
-    $('.results .test input:checkbox').each(function() {
+    $('.test input:checkbox').each(function() {
         if (!this.checked)
             return;
-        var testSummary = $(this).parents('.test');
+        var testSummary = $(this).parents('.result');
         var testName = testSummary.attr(config.kTestNameAttr);
-        $('.builder-name', testSummary).each(function() {
-            var builderName = $(this).attr(config.kBuilderNameAttr);
+        $('.builder', testSummary).each(function() {
             var failureTypes = $(this).attr(config.kFailureTypesAttr);
+            if (!failureTypes)
+                return
             var failureTypeList = failureTypes.split(' ');
-            rebaselineTasks.push({
-                'builderName': builderName,
+            var builderName = $(this).attr(config.kBuilderNameAttr);
+            failures.push({
                 'testName': testName,
+                'builderName': builderName,
                 'failureTypeList': failureTypeList,
             });
         });
     });
 
+    return failures;
+}
+
+function rebaselineSelected()
+{
     displayOnButterbar('Rebaselining...');
-    checkout.rebaselineAll(rebaselineTasks, dismissButterbar);
+    checkout.rebaselineAll(selectedFailures(), dismissButterbar);
 }
 
-function rebaselineResults()
+function showSelectedFailures()
 {
-    var failureDetails = $('.failure-details', $(this).parents('.results-detail'));
+    var argumentList = selectedFailures().map(function(failureDescription) {
+        return [failureDescription.testName, failureDescription.builderName, failureDescription.failureTypeList];
+    });
+    g_resultsDetailsIterator = new base.CallbackIterator(showResultsDetail, argumentList);
+    g_resultsDetailsIterator.callNext();
+}
 
-    var builderName = failureDetails.attr(config.kBuilderNameAttr);
-    var testName = failureDetails.attr(config.kTestNameAttr);
-    var failureTypes = failureDetails.attr(config.kFailureTypesAttr);
-    var failureTypeList = failureTypes.split(' ');
+function rowsInRevisionRange(earliestRevision, latestRevision)
+{
+    var earliestRevision = base.asInteger(earliestRevision);
+    var latestRevision = base.asInteger(latestRevision);
 
-    displayOnButterbar('Rebaselining...');
-    checkout.rebaseline(builderName, testName, failureTypeList, dismissButterbar);
+    var rows = [];
+    $('.recent-history tr').each(function() {
+        var revision = parseInt($(this).attr(config.kRevisionAttr));
+        if (earliestRevision <= revision && revision <= latestRevision)
+            rows.push(this);
+    });
+
+    return $(rows);
 }
 
-function updateRecentCommits()
+function rowsBeforeRevision(latestRevision)
 {
-    trac.recentCommitData('trunk', kCommitLogLength, function(commitDataList) {
-        var recentHistory  = $('.recent-history');
-        recentHistory.empty();
-        recentHistory.append(ui.commitLog(commitDataList));
-    });
+    return rowsInRevisionRange(0, latestRevision)
 }
 
-function checkBuilderStatuses()
+function showRecentCommits()
 {
-    results.fetchBuildersWithCompileErrors(function(builderNameList) {
-        if (!builderNameList.length) {
-            hideInfobarIfOfType(kBuildFailedInfobarType);
-            return;
-        }
-        displayInfobar(ui.infobarMessageForCompileErrors(builderNameList), kBuildFailedInfobarType);
+    $('.recent-history').empty().append(ui.changelog(model.state.recentCommits));
+}
+
+function showBuilderProgress()
+{
+    $.each(model.state.resultsByBuilder, function(builderName, resultsTree) {
+        var builderIndex = config.kBuilders.indexOf(builderName);
+        rowsBeforeRevision(resultsTree.revision).each(function() {
+            $($(this).children()[builderIndex]).addClass('built');
+        });
     });
 }
 
+function showUnexpectedFailure(failureAnalysis)
+{
+    var impliedFirstFailingRevision = failureAnalysis.newestPassingRevision + 1;
+    var regressionRows = rowsInRevisionRange(impliedFirstFailingRevision, failureAnalysis.oldestFailingRevision);
+
+    // FIXME: We need to create more rows if regressionRows.length is zero.
+
+    $('.entry', regressionRows).addClass('possible-regression');
+
+    var failureSummary = ui.summarizeFailure(failureAnalysis).attr(config.kRevisionAttr, impliedFirstFailingRevision);
+    regressionRows.last().after(failureSummary);
+
+    // FIXME: We should just compute this for failureSummary instead of recomputing the whole page.
+    showBuilderProgress();
+}
+
 function update()
 {
-    displayOnButterbar('Loading...');
-    updateResultsSummary(dismissButterbar);
-    updateRecentCommits();
-    checkBuilderStatuses();
+    base.callInParallel([model.updateRecentCommits, model.updateResultsByBuilder], function() {
+        showRecentCommits();
+        showBuilderProgress();
+        model.analyzeUnexpectedFailures(showUnexpectedFailure);
+        dismissButterbar();
+    });
 }
 
-$('.results .toolbar .triage').live('click', triageFailures);
-$('.results .toolbar .rebaseline-selected').live('click', rebaselineSelected);
+$('.show-selected-failures').live('click', showSelectedFailures);
+$('.rebaseline-selected').live('click', rebaselineSelected);
+
 $('.results-detail .actions .next').live('click', nextResultsDetail);
 $('.results-detail .actions .previous').live('click', previousResultsDetail);
 $('.results-detail .actions .rebaseline').live('click', rebaselineResults);

Added: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/model.js (0 => 91677)


--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/model.js	                        (rev 0)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/model.js	2011-07-25 17:51:07 UTC (rev 91677)
@@ -0,0 +1,42 @@
+var model = model || {};
+
+(function () {
+
+var kCommitLogLength = 20;
+
+model.state = {};
+
+model.updateRecentCommits = function(callback)
+{
+    trac.recentCommitData('trunk', kCommitLogLength, function(commitDataList) {
+        model.state.recentCommits = commitDataList;
+        callback();
+    });
+};
+
+model.updateResultsByBuilder = function(callback)
+{
+    results.fetchResultsByBuilder(config.kBuilders, function(resultsByBuilder) {
+        model.state.resultsByBuilder = resultsByBuilder;
+        callback();
+    });
+};
+
+model.analyzeUnexpectedFailures = function(callback)
+{
+    var unexpectedFailures = results.unexpectedFailuresByTest(model.state.resultsByBuilder);
+    $.each(unexpectedFailures, function(testName, resultNodesByBuilder) {
+        var builderNameList = base.keys(resultNodesByBuilder);
+        results.unifyRegressionRanges(builderNameList, testName, function(oldestFailingRevision, newestPassingRevision) {
+            var failureAnalysis = {
+                'testName': testName,
+                'resultNodesByBuilder': resultNodesByBuilder,
+                'oldestFailingRevision': oldestFailingRevision,
+                'newestPassingRevision': newestPassingRevision,
+            };
+            callback(failureAnalysis);
+        });
+    });
+};
+
+})();

Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/results.js (91676 => 91677)


--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/results.js	2011-07-25 17:47:31 UTC (rev 91676)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/results.js	2011-07-25 17:51:07 UTC (rev 91677)
@@ -202,22 +202,17 @@
     return !!node.actual;
 }
 
-results.BuilderResults = function(resultsJSON)
+results.unexpectedFailures = function(resultsTree)
 {
-    this._resultsJSON = resultsJSON;
+    return base.filterTree(resultsTree.tests, isResultNode, isUnexpectedFailure);
 };
 
-results.BuilderResults.prototype.unexpectedFailures = function()
-{
-    return base.filterTree(this._resultsJSON.tests, isResultNode, isUnexpectedFailure);
-};
-
 results.unexpectedFailuresByTest = function(resultsByBuilder)
 {
     var unexpectedFailures = {};
 
-    $.each(resultsByBuilder, function(builderName, builderResults) {
-        $.each(builderResults.unexpectedFailures(), function(testName, resultNode) {
+    $.each(resultsByBuilder, function(builderName, resultsTree) {
+        $.each(results.unexpectedFailures(resultsTree), function(testName, resultNode) {
             unexpectedFailures[testName] = unexpectedFailures[testName] || {};
             unexpectedFailures[testName][builderName] = resultNode;
         });
@@ -483,7 +478,7 @@
 results.fetchResultsForBuilder = function(builderName, callback)
 {
     base.jsonp(resultsSummaryURL(builderName, kResultsName), function(resultsTree) {
-        callback(new results.BuilderResults(resultsTree));
+        callback(resultsTree);
     });
 };
 

Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/results_unittests.js (91676 => 91677)


--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/results_unittests.js	2011-07-25 17:47:31 UTC (rev 91676)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/results_unittests.js	2011-07-25 17:51:07 UTC (rev 91677)
@@ -39,9 +39,8 @@
     "revision": "90430"
 };
 
-test("BuilderResults.unexpectedFailures", 1, function() {
-    var builderResults = new results.BuilderResults(kExampleResultsJSON);
-    var unexpectedFailures = builderResults.unexpectedFailures();
+test("unexpectedFailures", 1, function() {
+    var unexpectedFailures = results.unexpectedFailures(kExampleResultsJSON);
     deepEqual(unexpectedFailures, {
         "userscripts/another-test.html": {
             "expected": "PASS",
@@ -51,9 +50,8 @@
 });
 
 test("unexpectedFailuresByTest", 1, function() {
-    var builderResults = new results.BuilderResults(kExampleResultsJSON);
     var unexpectedFailuresByTest = results.unexpectedFailuresByTest({
-        "Mock Builder": builderResults
+        "Mock Builder": kExampleResultsJSON
     });
     deepEqual(unexpectedFailuresByTest, {
         "userscripts/another-test.html": {

Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/ui.js (91676 => 91677)


--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/ui.js	2011-07-25 17:47:31 UTC (rev 91676)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/ui.js	2011-07-25 17:51:07 UTC (rev 91677)
@@ -24,68 +24,6 @@
     return 'http://trac.webkit.org/browser/trunk/LayoutTests/' + testName;
 }
 
-ui.urlForRevisionRange = function(firstRevision, lastRevision)
-{
-    if (firstRevision != lastRevision)
-        return 'http://trac.webkit.org/log/trunk/?rev=' + lastRevision + '&stop_rev=' + firstRevision + '&limit=100&verbose=on';
-    return 'http://trac.webkit.org/changeset/' + firstRevision;
-};
-
-ui.regressionsContainer = function()
-{
-    return $(
-        '<table class="results-summary">' +
-            '<thead>' +
-                '<tr>' +
-                    '<th></th><th>Test</th><th>Bot</th><th>Regression Range</th><th>Frequency</th>' +
-            '</thead>' +
-            '<tbody></tbody>' +
-        '</table>');
-};
-
-ui.summarizeTest = function(testName, resultNodesByBuilder)
-{
-    var unexpectedResults = results.collectUnexpectedResults(resultNodesByBuilder);
-    var block = $(
-        '<tr class="test">' +
-          '<td><input type="checkbox"></td>' +
-          '<td class="what"><a class="test-name"></a></td>' +
-          '<td class="where"><ul></ul></td>' +
-          '<td class="when"></td>' +
-          '<td class="how-many"></td>' +
-        '</tr>');
-    var failureTypes = unexpectedResults.join(' ');
-    $('.test-name', block).text(testName).attr('href', ui.urlForTest(testName)).addClass(failureTypes);
-    block.attr(config.kTestNameAttr, testName);
-    block.attr(config.kFailureTypesAttr, failureTypes);
-
-    var where = $('.where', block);
-    $.each(resultNodesByBuilder, function(builderName, resultNode) {
-        var listElement = $('<li class="builder-name"></li>');
-        listElement.attr(config.kBuilderNameAttr, builderName).attr(config.kFailureTypesAttr, results.unexpectedResults(resultNode)).text(displayNameForBuilder(builderName));
-        where.append(listElement);
-    });
-
-    return block;
-};
-
-ui.summarizeRegressionRange = function(oldestFailingRevision, newestPassingRevision)
-{
-    if (!oldestFailingRevision || !newestPassingRevision)
-        return $('<div class="regression-range">Unknown</div>');
-
-    var impliedFirstFailingRevision = newestPassingRevision + 1;
-
-    var href = "" oldestFailingRevision);
-    var text = impliedFirstFailingRevision == oldestFailingRevision ?
-        displayNameForRevision(impliedFirstFailingRevision) :
-        displayNameForRevision(impliedFirstFailingRevision) + '-' + displayNameForRevision(oldestFailingRevision);
-
-    var block = $('<div class="regression-range"><a target="_blank"></a></div>');
-    $('a', block).attr('href', href).text(text)
-    return block;
-};
-
 ui.infobarMessageForCompileErrors = function(builderNameList)
 {
     var block = $('<div class="compile-errors">Build Failed:<ul></ul></div>');
@@ -100,15 +38,6 @@
     return block;
 };
 
-ui.failureCount = function(failureCount)
-{
-    if (failureCount < 1)
-        return '';
-    if (failureCount == 1)
-        return 'Seen once.';
-    return 'Seen ' + failureCount + ' times.';
-};
-
 ui.failureDetailsStatus = function(testName, selectedBuilderName, failureTypes, builderNameList)
 {
     var block = $('<span><span class="test-name"></span><span class="builder-list"></span></span>');
@@ -144,21 +73,73 @@
     return block;
 };
 
-ui.commitLog = function(commitDataList)
+function builderTableDataCells(resultNodesByBuilder)
 {
-    var block = $('<div class="changelog"></div>');
+    if (!resultNodesByBuilder)
+        resultNodesByBuilder = {};
 
+    var list = [];
+
+    $.each(config.kBuilders, function(index, builderName) {
+        var block = $('<td class="builder"></td>');
+        block.attr('title', displayNameForBuilder(builderName));
+        block.attr(config.kBuilderNameAttr, builderName);
+
+        if (builderName in resultNodesByBuilder) {
+            var unexpectedFailures = results.unexpectedResults(resultNodesByBuilder[builderName]);
+            var failureTypes = unexpectedFailures.join(' ');
+            block.attr(config.kFailureTypesAttr, failureTypes);
+        }
+
+        list.push(block[0])
+    });
+
+    return $(list);
+}
+
+ui.summarizeFailure = function(failureAnalysis)
+{
+    var block = $('<tr class="result"></tr>');
+    block.append(builderTableDataCells(failureAnalysis.resultNodesByBuilder));
+    block.append(
+        '<td class="test">' +
+          '<div class="what"><input type="checkbox"> <a class="test-name"></a></div>' +
+        '</td></tr>');
+    block.attr(config.kTestNameAttr, failureAnalysis.testName);
+
+    var unexpectedResults = results.collectUnexpectedResults(failureAnalysis.resultNodesByBuilder);
+    var failureTypes = unexpectedResults.join(' ');
+    $('.test-name', block).text(failureAnalysis.testName).attr('href', ui.urlForTest(failureAnalysis.testName)).addClass(failureTypes);
+
+    return block;
+};
+
+ui.commitEntry = function(commitData)
+{
+    var entry = $('<td class="entry"></td>');
+
+    entry.append('<div class="summary"></div><div class="details"><a target="_blank" class="revision"></a> <span class="author"></span> <span class="reviewer-container">(Reviewer: <span class="reviewer"></span>)</span></div><div class="regressions"></div>');
+    $('.summary', entry).text(commitData.summary);
+    $('.revision', entry).attr('href', trac.changesetURL(commitData.revision)).text(displayNameForRevision(commitData.revision));
+    $('.author', entry).text(commitData.author);
+    if (commitData.reviewer)
+        $('.reviewer', entry).text(commitData.reviewer);
+    else
+        $('.reviewer-container', entry).detach();
+
+    return entry;
+}
+
+ui.changelog = function(commitDataList)
+{
+    var block = $('<table class="changelog"><tbody></tbody></table>');
+
     $.each(commitDataList, function(index, commitData) {
-        var entry = $('<div class="entry"><div class="summary"></div><div class="details"><a target="_blank" class="revision"></a> <span class="author"></span> <span class="reviewer-container">(Reviewer: <span class="reviewer"></span>)</span></div></div>');
-        entry.attr(config.kRevisionAttr, commitData.revision);
-        $('.summary', entry).text(commitData.summary);
-        $('.revision', entry).attr('href', trac.changesetURL(commitData.revision)).text(displayNameForRevision(commitData.revision));
-        $('.author', entry).text(commitData.author);
-        if (commitData.reviewer)
-            $('.reviewer', entry).text(commitData.reviewer);
-        else
-            $('.reviewer-container', entry).detach();
-        block.append(entry);
+        var row = $('<tr class="revision"></tr>');
+        row.append(builderTableDataCells());
+        row.attr(config.kRevisionAttr, commitData.revision);
+        row.append(ui.commitEntry(commitData));
+        $('tbody', block).append(row);
     });
 
     return block;

Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/ui_unittests.js (91676 => 91677)


--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/ui_unittests.js	2011-07-25 17:47:31 UTC (rev 91676)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/ui_unittests.js	2011-07-25 17:51:07 UTC (rev 91677)
@@ -21,48 +21,6 @@
     }
 }
 
-test("summarizeTest", 3, function() {
-    var testName = 'userscripts/another-test.html';
-    var summary = ui.summarizeTest(testName, kExampleResultsByTest[testName]);
-    var summaryHTML = summary.html();
-    ok(summaryHTML.indexOf('scrollbars/custom-scrollbar-with-incomplete-style.html') == -1);
-    ok(summaryHTML.indexOf('userscripts/another-test.html') != -1);
-    ok(summaryHTML.indexOf('Mock Builder') != -1);
-});
-
-test("summarizeTest (data attributes)", 2, function() {
-    var testName = 'userscripts/taco.html';
-    var summary = ui.summarizeTest(testName, {
-        "Mock Builder": {
-            "expected": "PASS",
-            "actual": "TEXT IMAGE+TEXT"
-        }
-    });
-    equal(summary.attr(config.kTestNameAttr), "userscripts/taco.html");
-    equal(summary.attr(config.kFailureTypesAttr), "TEXT IMAGE+TEXT");
-});
-
-test("summarizeRegressionRange", 3, function() {
-    var summaryWithMultipleRevisions = ui.summarizeRegressionRange(0, 0);
-    summaryWithMultipleRevisions.wrap('<wrapper></wrapper>');
-    equal(summaryWithMultipleRevisions.parent().html(), '<div class="regression-range">Unknown</div>');
-
-    var summaryWithMultipleRevisions = ui.summarizeRegressionRange(90424, 90426);
-    summaryWithMultipleRevisions.wrap('<wrapper></wrapper>');
-    equal(summaryWithMultipleRevisions.parent().html(), '<div class="regression-range"><a target="_blank" href=""
-
-    var summaryWithOneRevision = ui.summarizeRegressionRange(90425, 90426);
-    summaryWithOneRevision.wrap('<wrapper></wrapper>');
-    equal(summaryWithOneRevision.parent().html(), '<div class="regression-range"><a target="_blank" href=""
-});
-
-test("failureCount", 4, function() {
-    equal(ui.failureCount(0), '');
-    equal(ui.failureCount(1), 'Seen once.');
-    equal(ui.failureCount(2), 'Seen 2 times.');
-    equal(ui.failureCount(3), 'Seen 3 times.');
-});
-
 test("infobarMessageForCompileErrors", 1, function() {
     var message = ui.infobarMessageForCompileErrors(['Mock Builder', 'Another Builder']);
     message.wrap('<wrapper></wrapper>');

Modified: trunk/Tools/ChangeLog (91676 => 91677)


--- trunk/Tools/ChangeLog	2011-07-25 17:47:31 UTC (rev 91676)
+++ trunk/Tools/ChangeLog	2011-07-25 17:51:07 UTC (rev 91677)
@@ -1,3 +1,30 @@
+2011-07-25  Adam Barth  <[email protected]>
+
+        Overhaul garden-o-matic frontend to integrate revision history and failures
+        https://bugs.webkit.org/show_bug.cgi?id=65089
+
+        Reviewed by Dimitri Glazkov.
+
+        This is a major overhaul of the garden-o-matic frontend.  The new UI
+        integrates the revision history information with failures.  Failures
+        appear in context adjacent to the revisions that caused them (which are
+        highlighted).  Each buildbot receives a collumn to the left, which
+        indicates which revisions that bot has tested and whether that bot
+        showed the indicated failures.
+
+        Failures are selectable with checkboxes, and can then either be
+        examined or rebaselined.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/Trac.js:
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/base.js:
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/garden-o-matic.html:
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/main.css:
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/main.js:
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/results.js:
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/results_unittests.js:
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/ui.js:
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/ui_unittests.js:
+
 2011-07-25  Holger Hans Peter Freyther  <[email protected]>
 
         [buildbot] Add Qt Linux MIPSEL Configuration
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to