Changeset 91240 in webkit
- Timestamp:
- Jul 19, 2011 12:37:01 AM (13 years ago)
- Location:
- trunk/Tools
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Tools/ChangeLog
r91233 r91240 1 2011-07-19 Adam Barth <abarth@webkit.org> 2 3 garden-o-matic should live update as conditions change on the buildbot 4 https://bugs.webkit.org/show_bug.cgi?id=64646 5 6 Reviewed by Eric Seidel. 7 8 This patch causes the garden-o-matic display to update every 10 minutes 9 to show the latest failures. This patch required a moderately large 10 refactoring of main.js to make the display incremental instead of 11 all-at-once. 12 13 * Scripts/webkitpy/tool/servers/data/gardeningserver/base.js: 14 * Scripts/webkitpy/tool/servers/data/gardeningserver/main.css: 15 * Scripts/webkitpy/tool/servers/data/gardeningserver/main.js: 16 * Scripts/webkitpy/tool/servers/data/gardeningserver/ui.js: 17 1 18 2011-07-18 Tab Atkins <jackalmage@gmail.com> 2 19 -
trunk/Tools/Scripts/webkitpy/tool/servers/data/gardeningserver/base.js
r90866 r91240 98 98 }; 99 99 100 base.RequestTracker = function(requestsInFlight, callback, args) 101 { 102 this.m_requestsInFlight = requestsInFlight; 103 this.m_callback = callback; 104 this.m_args = args || []; 105 }; 106 107 base.RequestTracker.prototype.requestComplete = function() 108 { 109 --this.m_requestsInFlight; 110 if (!this.m_requestsInFlight) 111 this.m_callback.apply(null, this.m_args); 112 }; 113 100 114 })(); -
trunk/Tools/Scripts/webkitpy/tool/servers/data/gardeningserver/base_unittests.js
r90880 r91240 49 49 }); 50 50 51 test("RequestTracker", 3, function() { 52 var ready = false; 53 var tracker = new base.RequestTracker(1, function() { 54 ok(ready); 55 }); 56 ready = true; 57 tracker.requestComplete(); 58 ready = false; 59 60 tracker = new base.RequestTracker(2, function(parameter) { 61 ok(ready); 62 equals(parameter, 'argument'); 63 }, ['argument']); 64 tracker.requestComplete(); 65 ready = true; 66 tracker.requestComplete(); 67 ready = false; 68 69 tracker = new base.RequestTracker(0, function() { 70 ok(false); 71 }); 72 tracker.requestComplete(); 73 }); 74 51 75 test("filterTree", 2, function() { 52 76 var tree = { -
trunk/Tools/Scripts/webkitpy/tool/servers/data/gardeningserver/main.css
r91197 r91240 88 88 } 89 89 90 .results-summary tbody tr { 91 display: none; 92 } 93 90 94 .results-summary ul { 91 95 margin: 0px; … … 160 164 } 161 165 162 .results-summary .test[data-new-test="true"] .what a[draggable]::before {163 content: '(new)';164 margin: 0 3px;165 }166 167 166 /* If we've only seen a given test failure once, we dim it so as not to distract the gardener. */ 168 .results-summary .test[data-failure-count="1"] [data-new-test="false"]{167 .results-summary .test[data-failure-count="1"] { 169 168 -webkit-transition: 1s opacity; 170 169 opacity: 0.5; -
trunk/Tools/Scripts/webkitpy/tool/servers/data/gardeningserver/main.js
r91197 r91240 48 48 } 49 49 50 function showResults(onsuccess) 50 function togglePartyTime(hasFailures) 51 { 52 if (!hasFailures) { 53 $('.results').text('No failures. Party time!'); 54 var partyTime = $('<div class="partytime"><img src="partytime.gif"></div>'); 55 $('.results').append(partyTime); 56 partyTime.fadeIn(1200).delay(7000).fadeOut(); 57 return; 58 } 59 $('.results').empty(); 60 } 61 62 function ensureResultsSummaryContainer() 63 { 64 var container = $('.results-summary'); 65 if (container.length) 66 return container; 67 container = ui.regressionsContainer(); 68 $('.results').append(container); 69 return container; 70 } 71 72 function detachRepairedTestsAndPrepareTestMap(unexpectedFailures) 73 { 74 var testMap = {}; 75 76 $('.test').each(function() { 77 var testSummary = $(this); 78 var testName = testSummary.attr(config.kTestNameAttr); 79 if (!(testName in unexpectedFailures)) 80 testSummary.slideUp(function() { testSummary.detach(); }); 81 else 82 testMap[testName] = testSummary; 83 }); 84 85 return testMap; 86 } 87 88 function prepareTestSummary(testName, resultNodesByBuilder, callback) 89 { 90 var testSummary = ui.summarizeTest(testName, resultNodesByBuilder); 91 var builderNameList = base.keys(resultNodesByBuilder); 92 93 results.unifyRegressionRanges(builderNameList, testName, function(oldestFailingRevision, newestPassingRevision) { 94 $('.when', testSummary).append(ui.summarizeRegressionRange(oldestFailingRevision, newestPassingRevision)); 95 }); 96 97 results.countFailureOccurances(builderNameList, testName, function(failureCount) { 98 $(testSummary).attr(config.kFailureCountAttr, failureCount); 99 $('.how-many', testSummary).text(ui.failureCount(failureCount)); 100 }); 101 102 callback(testSummary); 103 } 104 105 function updateResultsSummary(callback) 51 106 { 52 107 results.fetchResultsByBuilder(config.kBuilders, function(resultsByBuilder) { 53 108 var unexpectedFailures = results.unexpectedFailuresByTest(resultsByBuilder); 54 109 var hasFailures = !$.isEmptyObject(unexpectedFailures) 55 if (!hasFailures) { 56 $('.results').text('No failures. Party time!'); 57 var partyTime = $('<div class="partytime"><img src="partytime.gif"></div>'); 58 $('.results').append(partyTime); 59 partyTime.fadeIn(1200).delay(7000).fadeOut(); 60 } else { 61 var regressions = ui.regressionsContainer(); 62 63 $.each(unexpectedFailures, function(testName, resultNodesByBuilder) { 64 var testSummary = ui.summarizeTest(testName, resultNodesByBuilder); 65 $('tbody', regressions).append(testSummary); 66 67 var builderNameList = base.keys(resultNodesByBuilder); 68 results.unifyRegressionRanges(builderNameList, testName, function(oldestFailingRevision, newestPassingRevision) { 69 $('.when', testSummary).append(ui.summarizeRegressionRange(oldestFailingRevision, newestPassingRevision)); 70 if (!newestPassingRevision) 71 return; 72 checkout.existsAtRevision(checkout.subversionURLForTest(testName), newestPassingRevision, function(testExistedBeforeFailure) { 73 $(testSummary).attr('data-new-test', !testExistedBeforeFailure); 74 }); 75 }); 76 results.countFailureOccurances(builderNameList, testName, function(failureCount) { 77 $(testSummary).attr(config.kFailureCountAttr, failureCount); 78 $('.how-many', testSummary).text(ui.failureCount(failureCount)); 79 }); 110 111 togglePartyTime(hasFailures); 112 setIconState(hasFailures); 113 114 var container = ensureResultsSummaryContainer(); 115 var testMap = detachRepairedTestsAndPrepareTestMap(unexpectedFailures); 116 117 var newTestSummaries = $(); 118 var requestTracker = new base.RequestTracker(base.keys(unexpectedFailures).length, function() { 119 newTestSummaries.fadeIn(); 120 callback() 121 }); 122 123 $.each(unexpectedFailures, function(testName, resultNodesByBuilder) { 124 prepareTestSummary(testName, resultNodesByBuilder, function(testSummary) { 125 var existingElement = testMap[testName]; 126 if (existingElement) { 127 existingElement.replaceWith(testSummary); 128 requestTracker.requestComplete(); 129 return; 130 } 131 $('tbody', container).append(testSummary); 132 newTestSummaries = newTestSummaries.add(testSummary); 133 requestTracker.requestComplete(); 80 134 }); 81 $('.results').append(regressions); 82 } 83 setIconState(hasFailures); 84 onsuccess(); 135 }); 85 136 }); 86 137 } … … 88 139 function showResultsDetail() 89 140 { 90 var test Block= $(this).parents('.test');141 var testSummary = $(this).parents('.test'); 91 142 var builderName = $(this).attr(config.kBuilderNameAttr); 92 var testName = $('.what', testBlock).text();143 var testName = testSummary.attr(config.kTestNameAttr); 93 144 94 145 // FIXME: It's lame that we have two different representations of multiple failure types. 95 var failureTypes = test Block.attr(config.kFailureTypesAttr);146 var failureTypes = testSummary.attr(config.kFailureTypesAttr); 96 147 var failureTypeList = failureTypes.split(' '); 97 148 … … 167 218 function update() 168 219 { 220 displayOnButterbar('Loading...'); 221 updateResultsSummary(dismissButterbar); 169 222 checkBuilderStatuses(); 170 223 } … … 175 228 176 229 $(document).ready(function() { 177 showResults(function() {178 $('.butterbar').fadeOut();179 });180 230 g_updateTimerId = window.setInterval(update, config.kUpdateFrequency); 181 231 update(); -
trunk/Tools/Scripts/webkitpy/tool/servers/data/gardeningserver/results.js
r91196 r91240 178 178 ResultsCache.prototype.get = function(key, callback) 179 179 { 180 if ( key in this._cache) {180 if (this._cache[key]) { 181 181 callback(this._cache[key]); 182 182 return; -
trunk/Tools/Scripts/webkitpy/tool/servers/data/gardeningserver/ui.js
r91197 r91240 55 55 '</tr>'); 56 56 $('.what a', block).text(testName).attr('href', ui.urlForTest(testName)).attr('class', unexpectedResults.join(' ')); 57 block.attr(config.kTestNameAttr, testName); 57 58 block.attr(config.kFailureTypesAttr, unexpectedResults); 58 59
Note: See TracChangeset
for help on using the changeset viewer.