[GOM] Warn when the roll is running behind

This change introduces a UI that appears when the last roll
is getting old. The UI is not shown by default to avoid
visual clutter and its visual attribute matches the urgency
(currently 2 levels: warning / urgent).

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

git-svn-id: svn://svn.chromium.org/blink/trunk@175634 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 82996c16
...@@ -351,10 +351,26 @@ ui.StatusArea = base.extends('div', { ...@@ -351,10 +351,26 @@ ui.StatusArea = base.extends('div', {
}); });
ui.revisionDetails = base.extends('span', { ui.revisionDetails = base.extends('span', {
updateUI: function() { // We only support 2 levels of visual escalation levels: warning and critical.
warnRollRevisionSpanThreshold: 45,
criticalRollRevisionSpanThreshold: 80,
classNameForUrgencyLevel: function(rollRevisionSpan) {
if (rollRevisionSpan < this.criticalRollRevisionSpanThreshold)
return "warning";
return "critical";
},
updateUI: function(totRevision) {
this.appendChild(document.createElement("br")); this.appendChild(document.createElement("br"));
this.appendChild(document.createTextNode('Last roll is to ')); this.appendChild(document.createTextNode('Last roll is to '));
this.appendChild(ui.createLinkNode(trac.changesetURL(this.lastRolledRevision), this.lastRolledRevision)); this.appendChild(ui.createLinkNode(trac.changesetURL(this.lastRolledRevision), this.lastRolledRevision));
var rollRevisionSpan = totRevision - this.lastRolledRevision;
// Don't clutter the UI if we haven't run behind.
if (rollRevisionSpan > this.warnRollRevisionSpanThreshold) {
var wrapper = document.createElement("span");
wrapper.className = this.classNameForUrgencyLevel(rollRevisionSpan);
wrapper.appendChild(document.createTextNode("(" + rollRevisionSpan + " revisions behind)"));
this.appendChild(wrapper);
}
this.appendChild(document.createTextNode(', current autoroll ')); this.appendChild(document.createTextNode(', current autoroll '));
if (this.roll) { if (this.roll) {
var linkText = "" + this.roll.fromRevision + ":" + this.roll.toRevision; var linkText = "" + this.roll.fromRevision + ":" + this.roll.toRevision;
...@@ -424,7 +440,7 @@ ui.revisionDetails = base.extends('span', { ...@@ -424,7 +440,7 @@ ui.revisionDetails = base.extends('span', {
Promise.all([checkout.lastBlinkRollRevision(), rollbot.fetchCurrentRoll()]).then(function(results) { Promise.all([checkout.lastBlinkRollRevision(), rollbot.fetchCurrentRoll()]).then(function(results) {
theSpan.lastRolledRevision = results[0]; theSpan.lastRolledRevision = results[0];
theSpan.roll = results[1]; theSpan.roll = results[1];
theSpan.updateUI(); theSpan.updateUI(totRevision);
}); });
} }
}); });
......
...@@ -223,21 +223,27 @@ asyncTest("TreeStatus", 2, function() { ...@@ -223,21 +223,27 @@ asyncTest("TreeStatus", 2, function() {
}); });
}); });
var currentRoll = { function generateRoll(fromRevision, toRevision)
"results": [ {
{"messages":[], "base_url":"svn://svn.chromium.org/chrome/trunk/src", "subject":"Blink roll 540:550", "closed":false, "issue":1000} return {
] "results": [
}; {"messages":[], "base_url":"svn://svn.chromium.org/chrome/trunk/src", "subject":"Blink roll " + fromRevision + ":" + toRevision, "closed":false, "issue":1000}
]
};
}
asyncTest("RevisionDetails", 2, function() { asyncTest("RevisionDetailsSmallRoll", 2, function() {
var rollFromRevision = 540;
var rollToRevision = 550;
var simulator = new NetworkSimulator(); var simulator = new NetworkSimulator();
simulator.json = function(url) simulator.json = function(url)
{ {
return Promise.resolve(currentRoll); return Promise.resolve(generateRoll(rollFromRevision, rollToRevision));
} }
simulator.get = function (url) simulator.get = function (url)
{ {
return Promise.resolve("540"); return Promise.resolve(rollFromRevision);
} }
model.state.resultsByBuilder = { model.state.resultsByBuilder = {
...@@ -283,4 +289,118 @@ asyncTest("RevisionDetails", 2, function() { ...@@ -283,4 +289,118 @@ asyncTest("RevisionDetails", 2, function() {
}); });
}); });
asyncTest("RevisionDetailsMediumRoll", 2, function() {
var rollFromRevision = 500;
var rollToRevision = 550;
var simulator = new NetworkSimulator();
simulator.json = function(url)
{
return Promise.resolve(generateRoll(rollFromRevision, rollToRevision));
}
simulator.get = function (url)
{
return Promise.resolve(rollFromRevision);
}
model.state.resultsByBuilder = {
"Linux": {
"blink_revision": "554",
}
};
model.state.recentCommits = [
{
"revision": "555",
}];
var revisionDetails;
simulator.runTest(function() {
revisionDetails = ui.revisionDetails();
}).then(function() {
equal(revisionDetails.innerHTML,
'Latest revision processed by every bot: ' +
'<details>' +
'<summary>' +
'<a href="http://src.chromium.org/viewvc/blink?view=rev&amp;revision=554">554' +
'<span id="revisionPopUp">' +
'<table>' +
'<tr>' +
'<td><a href="http://build.chromium.org/p/chromium.webkit/waterfall?builder=Linux">Linux</a></td>' +
'<td>554</td>' +
'</tr>' +
'</table>' +
'</span>' +
'</a>' +
'</summary>' +
'<table>' +
'<tr>' +
'<td><a href="http://build.chromium.org/p/chromium.webkit/waterfall?builder=Linux">Linux</a></td>' +
'<td>554</td>' +
'</tr>' +
'</table>' +
'</details>' +
', trunk is at <a href="http://src.chromium.org/viewvc/blink?view=rev&amp;revision=555">555</a>' +
'<br>' +
'Last roll is to <a href="http://src.chromium.org/viewvc/blink?view=rev&amp;revision=500">500</a><span class="warning">(55 revisions behind)</span>, current autoroll <a href="https://codereview.chromium.org/1000">500:550</a>');
start();
});
});
asyncTest("RevisionDetailsBigRoll", 2, function() {
var rollFromRevision = 440;
var rollToRevision = 550;
var simulator = new NetworkSimulator();
simulator.json = function(url)
{
return Promise.resolve(generateRoll(rollFromRevision, rollToRevision));
}
simulator.get = function (url)
{
return Promise.resolve(rollFromRevision);
}
model.state.resultsByBuilder = {
"Linux": {
"blink_revision": "554",
}
};
model.state.recentCommits = [
{
"revision": "555",
}];
var revisionDetails;
simulator.runTest(function() {
revisionDetails = ui.revisionDetails();
}).then(function() {
equal(revisionDetails.innerHTML,
'Latest revision processed by every bot: ' +
'<details>' +
'<summary>' +
'<a href="http://src.chromium.org/viewvc/blink?view=rev&amp;revision=554">554' +
'<span id="revisionPopUp">' +
'<table>' +
'<tr>' +
'<td><a href="http://build.chromium.org/p/chromium.webkit/waterfall?builder=Linux">Linux</a></td>' +
'<td>554</td>' +
'</tr>' +
'</table>' +
'</span>' +
'</a>' +
'</summary>' +
'<table>' +
'<tr>' +
'<td><a href="http://build.chromium.org/p/chromium.webkit/waterfall?builder=Linux">Linux</a></td>' +
'<td>554</td>' +
'</tr>' +
'</table>' +
'</details>' +
', trunk is at <a href="http://src.chromium.org/viewvc/blink?view=rev&amp;revision=555">555</a>' +
'<br>' +
'Last roll is to <a href="http://src.chromium.org/viewvc/blink?view=rev&amp;revision=440">440</a><span class="critical">(115 revisions behind)</span>, current autoroll <a href="https://codereview.chromium.org/1000">440:550</a>');
start();
});
});
})(); })();
...@@ -103,3 +103,19 @@ button.default:hover { ...@@ -103,3 +103,19 @@ button.default:hover {
.clear { .clear {
clear: both; clear: both;
} }
/*** Visual escalation ***/
.warning {
color: white;
background-color: #ffc343;
font-weight: bold;
font-size: 2em;
}
.critical {
color: white;
background-color: #e98080;
font-weight: bold;
font-size: 3em;
}
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