Commit a32b1622 authored by ojan@chromium.org's avatar ojan@chromium.org

Simplify failing builder lists.

-Get rid of the "BUILDING" category. In order to make this work,
we'll need to plumb through a list of builders for each testtype/waterfall
combination. While we have that information for the flakiness dashboard,
it just doesn't seem worth it for this feature.
-Stop trying to do complicated things with the builder name
and just show the raw builder name. It takes up more space,
but it scales better to the full list of chromium builders and
is less complexity for sheriffs to understand.
-Once we've done the above, stop plumbing builderLatestRevisions
everywhere. Technically it's dead code now, but Levi's patch
in progress is using it, so I don't feel compelled to delete it.
-Finally, we can now remove config.js entirely.

NOTRY=true

Review URL: https://codereview.chromium.org/409063002

git-svn-id: svn://svn.chromium.org/blink/trunk@178625 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent ba6c117d
...@@ -30,9 +30,8 @@ CTCommitLog.prototype._processXml = function(xml) { ...@@ -30,9 +30,8 @@ CTCommitLog.prototype._processXml = function(xml) {
var author = logentry.getElementsByTagName('author')[0].textContent.trim(); var author = logentry.getElementsByTagName('author')[0].textContent.trim();
var message = logentry.getElementsByTagName('content')[0].textContent.trim(); var message = logentry.getElementsByTagName('content')[0].textContent.trim();
// FIXME: Handle base urls for different repos. // FIXME: Handle base urls for different repos.
// FIXME: This class should import config.js if it keeps using config.*. var commit = new CTCommit(author, message, 'http://src.chromium.org/viewvc/blink');
var commit = new CTCommit(author, message, config.kBlinkRevisionURL);
this.commits[commit.revision] = commit; this.commits[commit.revision] = commit;
}.bind(this)); }.bind(this));
} }
</script> </script>
\ No newline at end of file
...@@ -21,7 +21,7 @@ var kExampleCommitMessage = ...@@ -21,7 +21,7 @@ var kExampleCommitMessage =
"git-svn-id: svn://svn.chromium.org/blink/trunk@158545 bbb929c8-8fbe-4397-9dbb-9b2b20218538"; "git-svn-id: svn://svn.chromium.org/blink/trunk@158545 bbb929c8-8fbe-4397-9dbb-9b2b20218538";
window.CTCommitMock = function() { window.CTCommitMock = function() {
return new CTCommit("mkwst@chromium.org", kExampleCommitMessage, config.kBlinkRevisionURL); return new CTCommit("mkwst@chromium.org", kExampleCommitMessage, 'http://src.chromium.org/viewvc/blink');
}; };
})(); })();
......
...@@ -43,7 +43,6 @@ THE POSSIBILITY OF SUCH DAMAGE. ...@@ -43,7 +43,6 @@ THE POSSIBILITY OF SUCH DAMAGE.
<ol id="qunit-tests"></ol> <ol id="qunit-tests"></ol>
<script src="bower_components/sugar/release/sugar-full.development.js"></script> <script src="bower_components/sugar/release/sugar-full.development.js"></script>
<script src="scripts/config.js"></script>
<script src="scripts/net.js"></script> <script src="scripts/net.js"></script>
<script src="scripts/net_unittests.js"></script> <script src="scripts/net_unittests.js"></script>
<script src="scripts/treestatus.js"></script> <script src="scripts/treestatus.js"></script>
......
/*
* Copyright (C) 2011 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
var config = config || {};
(function() {
config = {
kUpdateFrequency: 1000 * 30,
kBlinkRevisionURL: 'http://src.chromium.org/viewvc/blink',
layoutTestResultsURL: 'https://storage.googleapis.com/chromium-layout-test-archives',
waterfallURL: 'http://build.chromium.org/p/chromium.webkit/waterfall',
// FIXME: All usages of this list need to be replaced.
builders: {
'WebKit XP': {version: 'xp'},
'WebKit Win7': {version: 'win7'},
'WebKit Win7 (dbg)': {version: 'win7', debug: true},
'WebKit Linux': {version: 'lucid', is64bit: true},
// FIXME: Temporarily disabled, because it makes garden-o-matic unusably slow.
// 'WebKit Linux ASAN': {version: 'lucid', is64bit: true},
'WebKit Linux 32': {version: 'lucid'},
'WebKit Linux (dbg)': {version: 'lucid', is64bit: true, debug: true},
'WebKit Linux Leak': {version: 'leak', is64bit: true},
'WebKit Mac10.6': {version: 'snowleopard'},
'WebKit Mac10.6 (dbg)': {version: 'snowleopard', debug: true},
'WebKit Mac10.7': {version: 'lion'},
'WebKit Mac10.7 (dbg)': {version: 'lion', debug: true},
'WebKit Mac10.8': {version: 'mountainlion'},
'WebKit Mac10.8 (retina)': {version: 'retina'},
'WebKit Mac10.9': {version: 'mavericks'},
'WebKit Android (Nexus4)': {version: 'android'},
},
};
})();
...@@ -136,7 +136,8 @@ function failureTypeList(failureBlob) ...@@ -136,7 +136,8 @@ function failureTypeList(failureBlob)
function resultsDirectoryURL(builderName) function resultsDirectoryURL(builderName)
{ {
return config.layoutTestResultsURL + '/' + builderName.replace(/[ .()]/g, '_') + '/results/layout-test-results/'; return 'https://storage.googleapis.com/chromium-layout-test-archives/' +
builderName.replace(/[ .()]/g, '_') + '/results/layout-test-results/';
} }
results.failureInfo = function(testName, builderName, result) results.failureInfo = function(testName, builderName, result)
......
...@@ -13,24 +13,13 @@ var kExampleFailures = [{ ...@@ -13,24 +13,13 @@ var kExampleFailures = [{
"testName": "plugins/gesture-events-scrolled.html", "testName": "plugins/gesture-events-scrolled.html",
"resultNodesByBuilder": { "resultNodesByBuilder": {
"WebKit Win7 (dbg)": { "WebKit Win7 (dbg)": {
"expected": "PASS",
"is_unexpected": true,
"actual": "CRASH", "actual": "CRASH",
"time": 0.9
}, },
"WebKit Mac10.6 (dbg)": { "WebKit Mac10.6 (dbg)": {
"expected": "PASS",
"is_unexpected": true,
"actual": "CRASH", "actual": "CRASH",
"has_stderr": true,
"time": 1.8
}, },
"WebKit Mac10.7": { "WebKit Mac10.7": {
"expected": "PASS",
"is_unexpected": true,
"actual": "TEXT", "actual": "TEXT",
"has_stderr": true,
"time": 3.2
} }
}, },
"oldestFailingRevision": 177164, "oldestFailingRevision": 177164,
...@@ -39,17 +28,10 @@ var kExampleFailures = [{ ...@@ -39,17 +28,10 @@ var kExampleFailures = [{
"testName": "plugins/transformed-events.html", "testName": "plugins/transformed-events.html",
"resultNodesByBuilder": { "resultNodesByBuilder": {
"WebKit Win7 (dbg)": { "WebKit Win7 (dbg)": {
"expected": "PASS",
"is_unexpected": true,
"actual": "TEXT", "actual": "TEXT",
"time": 0.6
}, },
"WebKit Mac10.7": { "WebKit Mac10.7": {
"expected": "PASS",
"is_unexpected": true,
"actual": "CRASH", "actual": "CRASH",
"has_stderr": true,
"time": 3.2
}, },
}, },
"oldestFailingRevision": 177164, "oldestFailingRevision": 177164,
...@@ -70,30 +52,27 @@ var kExampleBuilderLatestRevisions = { ...@@ -70,30 +52,27 @@ var kExampleBuilderLatestRevisions = {
module("ct-builder-grid"); module("ct-builder-grid");
asyncTest("basic", 11, function() { asyncTest("basic", 10, function() {
var grid = document.createElement('ct-builder-grid'); var grid = document.createElement('ct-builder-grid');
grid.failures = kExampleFailures; grid.failures = kExampleFailures;
grid.builderLatestRevisions = kExampleBuilderLatestRevisions;
requestAnimationFrame(function() { requestAnimationFrame(function() {
var rows = grid.shadowRoot.querySelectorAll('tbody tr'); var rows = grid.shadowRoot.querySelectorAll('tbody tr');
equal(rows.length, 3); equal(rows.length, 2);
var row1 = grid.shadowRoot.querySelector('tbody td.CRASH').parentNode; var row1 = grid.shadowRoot.querySelector('tbody td.CRASH').parentNode;
equal(row1.children.length, 3); equal(row1.children.length, 2);
equal(row1.children[1].querySelectorAll('ct-builder').length, 1); equal(row1.children[1].querySelectorAll('ct-builder').length, 3);
equal(row1.children[1].querySelectorAll('ct-builder')[0].builderName, 'WebKit Mac10.7'); equal(row1.children[1].querySelectorAll('ct-builder')[0].builder, 'WebKit Mac10.6 (dbg)');
equal(row1.children[1].querySelectorAll('ct-builder')[1].builder, 'WebKit Mac10.7');
equal(row1.children[2].querySelectorAll('ct-builder').length, 2); equal(row1.children[1].querySelectorAll('ct-builder')[2].builder, 'WebKit Win7 (dbg)');
equal(row1.children[2].querySelectorAll('ct-builder')[0].builderName, 'WebKit Mac10.6 (dbg)');
equal(row1.children[2].querySelectorAll('ct-builder')[1].builderName, 'WebKit Win7 (dbg)');
var row2 = grid.shadowRoot.querySelector('tbody td.TEXT').parentNode; var row2 = grid.shadowRoot.querySelector('tbody td.TEXT').parentNode;
equal(row2.children.length, 3); equal(row2.children.length, 2);
equal(row2.children[1].querySelectorAll('ct-builder').length, 1); equal(row2.children[1].querySelectorAll('ct-builder').length, 2);
equal(row2.children[2].querySelectorAll('ct-builder').length, 1); equal(row2.children[1].querySelectorAll('ct-builder')[0].builder, 'WebKit Mac10.7');
equal(row2.children[1].querySelectorAll('ct-builder')[1].builder, 'WebKit Win7 (dbg)');
notEqual(rows[2].children[0].className.indexOf('BUILDING'), -1);
start(); start();
}); });
}); });
......
...@@ -7,7 +7,7 @@ found in the LICENSE file. ...@@ -7,7 +7,7 @@ found in the LICENSE file.
<link rel="import" href="ct-builder.html"> <link rel="import" href="ct-builder.html">
<!-- Table of failure types, listing the failing builders for each type. --> <!-- Table of failure types, listing the failing builders for each type. -->
<polymer-element name="ct-builder-grid" attributes="failures builderLatestRevisions"> <polymer-element name="ct-builder-grid" attributes="failures">
<template> <template>
<style> <style>
table { table {
...@@ -64,31 +64,15 @@ found in the LICENSE file. ...@@ -64,31 +64,15 @@ found in the LICENSE file.
} }
</style> </style>
<table> <table>
<thead>
<tr>
<td>type</td>
<td>release</td>
<td>debug</td>
</tr>
</thead>
<tbody> <tbody>
<template repeat="{{ type in resultTypes|resultTypeKeys }}"> <template repeat="{{ type in _resultTypes | _keys }}">
<tr> <tr>
<td class="{{ type }}"> <td class="{{ type }}">
<span>{{ type }}</span> <span>{{ type }}</span>
</td> </td>
<td> <td>
<template repeat="{{ builder in resultTypes[type]|keys }}"> <template repeat="{{ builder in _resultTypes[type] | _keys }}">
<template if="{{ !resultTypes[type][builder].debug }}"> <ct-builder builder="{{ builder }}"></ct-builder>
<ct-builder builderName="{{ builder }}"></ct-builder>
</template>
</template>
</td>
<td>
<template repeat="{{ builder in resultTypes[type]|keys }}">
<template if="{{ resultTypes[type][builder].debug }}">
<ct-builder builderName="{{ builder }}"></ct-builder>
</template>
</template> </template>
</td> </td>
</tr> </tr>
...@@ -99,67 +83,24 @@ found in the LICENSE file. ...@@ -99,67 +83,24 @@ found in the LICENSE file.
<script> <script>
Polymer({ Polymer({
failures: [], failures: [],
builderLatestRevisions: {}, _resultTypes: {},
resultTypes: {},
keys: function(obj) { _keys: function(obj) {
return Object.keys(obj).sort(); return Object.keys(obj).sort();
}, },
resultTypeKeys: function(obj) {
// Get the keys, but the BUILDING type should be last.
var keys = this.keys(obj);
var index = keys.indexOf('BUILDING');
if (index != -1) {
var buildingResult = keys.splice(index, 1);
keys.push(buildingResult[0]);
}
return keys;
},
failuresChanged: function() { failuresChanged: function() {
// Create a set of builders for each result type (e.g., text, crash). // Create a set of builders for each result type (e.g., text, crash).
this.resultTypes = {}; this._resultTypes = {};
var passingRevisions = [];
this.failures.forEach(function(failure) { this.failures.forEach(function(failure) {
passingRevisions.push(failure.newestPassingRevision);
var results = failure.resultNodesByBuilder; var results = failure.resultNodesByBuilder;
Object.keys(results, (function(builder) { Object.keys(results, (function(builder) {
var result = results[builder].actual; var result = results[builder].actual;
if (!Object.has(this.resultTypes, result)) if (!this._resultTypes[result])
this.resultTypes[result] = {}; this._resultTypes[result] = {};
this.resultTypes[result][builder] = this._resultTypes[result][builder] = 1;
config.builders[builder];
}).bind(this)); }).bind(this));
}, this); }, this);
var buildingType = this._getBuilding(passingRevisions);
if (!Object.isEmpty(buildingType))
this.resultTypes['BUILDING'] = buildingType;
},
_buildersInFlightForRevision: function(revision) {
return Object.keys(this.builderLatestRevisions).filter(function(builder) {
// FIXME: This should look at all chromium/v8/etc revisions as well.
// Is this concept of "building" builders even useful as is?
return parseInt(this.builderLatestRevisions[builder].blink, 10) < revision;
}.bind(this));
},
_getBuilding: function(revisions) {
var building = {};
var builders = [];
revisions.unique().forEach(function(revision) {
builders.push.apply(builders, this._buildersInFlightForRevision(revision + 1));
}.bind(this));
builders.unique().forEach(function(builder) {
if (!config.builders[builder])
return;
building[builder] = {'debug': config.builders[builder].debug};
});
return building;
}, },
}); });
</script> </script>
......
...@@ -13,14 +13,14 @@ module("ct-builder"); ...@@ -13,14 +13,14 @@ module("ct-builder");
asyncTest("basic", 2, function() { asyncTest("basic", 2, function() {
var builder = document.createElement('ct-builder'); var builder = document.createElement('ct-builder');
builder.builderName = 'WebKit Linux (dbg)'; builder.builder = 'WebKit Linux (dbg)';
builder.async(function() { builder.async(function() {
var html = builder.shadowRoot.innerHTML; var html = builder.shadowRoot.innerHTML;
var a = builder.shadowRoot.querySelector('a'); var a = builder.shadowRoot.querySelector('a');
ok(a); ok(a);
notEqual(a.href.indexOf('WebKit%20Linux%20(dbg)'), -1); notEqual(a.href.indexOf('WebKit+Linux+(dbg)'), -1);
start(); start();
}); });
...@@ -28,13 +28,13 @@ asyncTest("basic", 2, function() { ...@@ -28,13 +28,13 @@ asyncTest("basic", 2, function() {
asyncTest("steps", 3, function() { asyncTest("steps", 3, function() {
var builder = document.createElement('ct-builder'); var builder = document.createElement('ct-builder');
builder.builderName = 'WebKit Linux (dbg)'; builder.builder = 'WebKit Linux (dbg)';
builder.steps = ['gclient_revert', 'compile', 'unittests']; builder.steps = ['gclient_revert', 'compile', 'unittests'];
builder.async(function() { builder.async(function() {
var a = builder.shadowRoot.querySelector('a'); var a = builder.shadowRoot.querySelector('a');
ok(a); ok(a);
notEqual(a.href.indexOf('WebKit%20Linux%20(dbg)'), -1); notEqual(a.href.indexOf('WebKit+Linux+(dbg)'), -1);
notEqual(a.innerText.indexOf('gclient_revert, compile, unittests'), -1); notEqual(a.innerText.indexOf('gclient_revert, compile, unittests'), -1);
start(); start();
......
...@@ -9,52 +9,30 @@ Styled link to a builder composed of the version and architecture, or the ...@@ -9,52 +9,30 @@ Styled link to a builder composed of the version and architecture, or the
builder name if the builder is unknown. If an array is passed to |steps|, the builder name if the builder is unknown. If an array is passed to |steps|, the
link will show the builder name and architecture followed by the steps instead. link will show the builder name and architecture followed by the steps instead.
--> -->
<polymer-element name="ct-builder" attributes="builderName steps"> <polymer-element name="ct-builder" attributes="builder steps">
<template> <template>
<style> <style>
a { a {
border: 1px solid gray; border: 1px solid gray;
color: black; color: black;
display: inline-block; display: inline-block;
font-size: 0px; font-size: 11px;
margin-bottom: 2px; margin-bottom: 2px;
padding: 1px; padding: 1px;
text-decoration: none; text-decoration: none;
} }
span { span {
font-size: 11px;
padding: 0 2px; padding: 0 2px;
} }
.version { .builder {
background-color: #555; background-color: #555;
color: white; color: white;
} }
.version:not(.architecture) {
text-transform: uppercase;
}
.details {
padding-left: 3px;
}
</style> </style>
<a href="{{ builderName|builderURL }}"> <a href="{{ builder|builderURL }}">
<template if="{{ configuration }}"> <span class="builder">{{ builder }}</span>
<span class="version">{{ configuration.version }}</span>
<template if="{{ configuration.is64bit }}">
<template if="{{ stepList }}">
<span class="version architecture">64-bit</span>
</template>
<template if="{{ !stepList }}">
<span>64-bit</span>
</template>
</template>
</template>
<template if="{{ !configuration }}">
<span class="version">{{ builderName }}</span>
</template>
<template if="{{ stepList }}"> <template if="{{ stepList }}">
<span class="details">{{ stepList }}</span> <span class="details">{{ stepList }}</span>
</template> </template>
...@@ -64,17 +42,16 @@ link will show the builder name and architecture followed by the steps instead. ...@@ -64,17 +42,16 @@ link will show the builder name and architecture followed by the steps instead.
Polymer({ Polymer({
steps: [], steps: [],
ready: function() {
this.configuration = config.builders[this.builderName];
},
stepsChanged: function() { stepsChanged: function() {
this.stepList = this.steps.join(', '); this.stepList = this.steps.join(', ');
}, },
builderURL: function() { builderURL: function() {
return config.waterfallURL + '?builder=' + // FIXME: Pass in the waterfall URL instead so this can work with different waterfalls.
encodeURIComponent(this.builderName); var waterfall = 'http://build.chromium.org/p/chromium.webkit';
return waterfall + '/waterfall?' + Object.toQueryString({
builder: this.builder,
});
}, },
}); });
</script> </script>
......
...@@ -21,7 +21,7 @@ found in the LICENSE file. ...@@ -21,7 +21,7 @@ found in the LICENSE file.
} }
</style> </style>
<template repeat="{{ builder in builders|keys }}"> <template repeat="{{ builder in builders|keys }}">
<ct-builder builderName="{{ builder }}" steps="{{ builders[builder] }}"></ct-builder> <ct-builder builder="{{ builder }}" steps="{{ builders[builder] }}"></ct-builder>
</template> </template>
</template> </template>
<script> <script>
......
...@@ -8,7 +8,7 @@ found in the LICENSE file. ...@@ -8,7 +8,7 @@ found in the LICENSE file.
<link rel="import" href="ct-commit-list.html"> <link rel="import" href="ct-commit-list.html">
<link rel="import" href="ct-test-list.html"> <link rel="import" href="ct-test-list.html">
<polymer-element name="ct-failure-card" attributes="failures builderLatestRevisions commits"> <polymer-element name="ct-failure-card" attributes="failures commits">
<template> <template>
<style> <style>
:host { :host {
...@@ -55,7 +55,7 @@ found in the LICENSE file. ...@@ -55,7 +55,7 @@ found in the LICENSE file.
align-self: flex-start; align-self: flex-start;
} }
</style> </style>
<ct-builder-grid failures="{{failures}}" builderLatestRevisions="{{builderLatestRevisions}}"></ct-builder-grid> <ct-builder-grid failures="{{failures}}"></ct-builder-grid>
<div class="failure"> <div class="failure">
<ct-test-list tests="{{failures|testNames}}"></ct-test-list> <ct-test-list tests="{{failures|testNames}}"></ct-test-list>
<ct-commit-list first="{{failures[0].newestPassingRevision + 1}}" <ct-commit-list first="{{failures[0].newestPassingRevision + 1}}"
...@@ -67,7 +67,6 @@ found in the LICENSE file. ...@@ -67,7 +67,6 @@ found in the LICENSE file.
<script> <script>
Polymer({ Polymer({
failures: [], failures: [],
builderLatestRevisions: {},
commits: {}, commits: {},
testNames: function(failures) { testNames: function(failures) {
......
...@@ -6,7 +6,7 @@ found in the LICENSE file. ...@@ -6,7 +6,7 @@ found in the LICENSE file.
<link rel="import" href="ct-failure-card.html"> <link rel="import" href="ct-failure-card.html">
<polymer-element name="ct-failure-stream" attributes="groups builderLatestRevisions commits" noscript> <polymer-element name="ct-failure-stream" attributes="groups commits" noscript>
<template> <template>
<style> <style>
:host { :host {
...@@ -20,7 +20,7 @@ found in the LICENSE file. ...@@ -20,7 +20,7 @@ found in the LICENSE file.
} }
</style> </style>
<template repeat="{{failures in groups}}"> <template repeat="{{failures in groups}}">
<ct-failure-card failures="{{failures}}" builderLatestRevisions="{{builderLatestRevisions}}" commits="{{commits}}"></ct-failure-card> <ct-failure-card failures="{{failures}}" commits="{{commits}}"></ct-failure-card>
</template> </template>
</template> </template>
</polymer-element> </polymer-element>
...@@ -5,7 +5,6 @@ found in the LICENSE file. ...@@ -5,7 +5,6 @@ found in the LICENSE file.
--> -->
<script src="../bower_components/sugar/release/sugar-full.development.js"></script> <script src="../bower_components/sugar/release/sugar-full.development.js"></script>
<script src="../scripts/config.js"></script>
<script src="../scripts/net.js"></script> <script src="../scripts/net.js"></script>
<script src="../scripts/results.js"></script> <script src="../scripts/results.js"></script>
<script src="../scripts/treestatus.js"></script> <script src="../scripts/treestatus.js"></script>
......
...@@ -36,15 +36,18 @@ found in the LICENSE file. ...@@ -36,15 +36,18 @@ found in the LICENSE file.
<ct-tree-status project="chromium"></ct-tree-status> <ct-tree-status project="chromium"></ct-tree-status>
<ct-tree-status project="blink"></ct-tree-status> <ct-tree-status project="blink"></ct-tree-status>
<ct-failing-builders builders="{{ failures.builders }}"></ct-failing-builders> <ct-failing-builders builders="{{ failures.builders }}"></ct-failing-builders>
<ct-failure-stream groups="{{ failures.unexpected }}" builderLatestRevisions="{{ builderLatestRevisions }}" commits="{{revisionLog.commits}}"></ct-failure-stream> <ct-failure-stream groups="{{ failures.unexpected }}" commits="{{revisionLog.commits}}"></ct-failure-stream>
</template> </template>
<script> <script>
(function() {
var kUpdateFrequency = 1000 * 30;
Polymer({ Polymer({
revisionLog: new CTCommitLog(), revisionLog: new CTCommitLog(),
attached: function() { attached: function() {
this.update(); this.update();
setInterval(this.update.bind(this), config.kUpdateFrequency); setInterval(this.update.bind(this), kUpdateFrequency);
}, },
update: function() { update: function() {
...@@ -56,5 +59,6 @@ found in the LICENSE file. ...@@ -56,5 +59,6 @@ found in the LICENSE file.
treeStatuses[i].update(); treeStatuses[i].update();
}, },
}); });
})();
</script> </script>
</polymer-element> </polymer-element>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment