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