only show most recent results per pipeline

Change hideci to only show the most recent results of a pipeline. For
entries where the pipeline is not parsable we default to assuming the
results were in the 'check' pipeline.

3rd Party CI systems are assumed to be 'check' pipeline for the
purposes of this patch.

Order the display of these results for parsed pipeline entries first,
then non parsed entries after. That has the impact of making all the
Jenkins results be the top of the page and 3rd Party come later.

Also provide a (### rechecks) comment if we find more than 1 result at
the current patch set number. This helps reviewers understand that
this patch might be unstable as it's been rechecked to get to the
current state.

Change-Id: I153f73000f9392af6c8bbe850716645b3ba836a0
This commit is contained in:
Sean Dague 2014-10-27 15:10:18 -04:00
parent 3ad4b654e2
commit d8af47ed4a

View File

@ -23,6 +23,8 @@ var psRegex = /^<p>(Uploaded patch set|Patch Set) (\d+)(:|\.)/;
var mergeFailedRegex = /Merge Failed\./; var mergeFailedRegex = /Merge Failed\./;
// this regex matches the name of CI systems we trust to report merge failures // this regex matches the name of CI systems we trust to report merge failures
var trustedCIRegex = /^(OpenStack CI|Jenkins)$/; var trustedCIRegex = /^(OpenStack CI|Jenkins)$/;
// this regex matches the pipeline markup
var pipelineNameRegex = /Build \w+ \((\w+) pipeline\)/;
var ci_parse_psnum = function($panel) { var ci_parse_psnum = function($panel) {
var match = psRegex.exec($panel.html()); var match = psRegex.exec($panel.html());
@ -36,9 +38,19 @@ var ci_parse_is_merge_conflict = function($panel) {
return (mergeFailedRegex.exec($panel.html()) !== null); return (mergeFailedRegex.exec($panel.html()) !== null);
}; };
var ci_find_pipeline = function($panel) {
var match = pipelineNameRegex.exec($panel.html());
if (match !== null) {
return match[1];
} else {
return null;
}
};
var ci_parse_results = function($panel) { var ci_parse_results = function($panel) {
var result_list = []; var result_list = [];
var test_results = $panel.find("li.comment_test"); var test_results = $panel.find("li.comment_test");
var pipeline = null;
if (test_results !== null) { if (test_results !== null) {
test_results.each(function(i, li) { test_results.each(function(i, li) {
var result = {}; var result = {};
@ -51,6 +63,63 @@ var ci_parse_results = function($panel) {
return result_list; return result_list;
}; };
/***
* function ci_group_by_pipeline - create a group by structure for iterating on pipelines
*
* This function takes the full list of comments, the current patch
* number, and builds an array of (pipelinename, comments array)
* tuples. That makes it very easy to process during the display
* phase to ensure we only display the latest result for every
* pipeline.
*
* Comments that do not have a parsable pipeline (3rd party ci
* systems) get collapsed by name, and we specify 'check' for their
* pipeline.
*
**/
var ci_group_by_pipeline = function(current, comments) {
var pipelines = [];
var pipeline_comments = [];
var nonpipelines = [];
var nonpipeline_comments = [];
for (var i = 0; i < comments.length; i++) {
var comment = comments[i];
if ((comment.psnum != current) || !comment.is_ci || (comment.results.length == 0)) {
continue;
}
if (comment.pipeline === null) {
var index = nonpipelines.indexOf(comment.name);
if (index == -1) {
// not found, so create new entries
nonpipelines.push(comment.name);
nonpipeline_comments.push([comment]);
} else {
nonpipeline_comments[index].push(comment);
}
} else {
var index = pipelines.indexOf(comment.pipeline);
if (index == -1) {
// not found, so create new entries
pipelines.push(comment.pipeline);
pipeline_comments.push([comment]);
} else {
pipeline_comments[index].push(comment);
}
}
}
var results = [];
for (i = 0; i < pipelines.length; i++) {
results.push([pipelines[i], pipeline_comments[i]]);
}
for (i = 0; i < nonpipeline_comments.length; i++) {
// if you don't specify a pipline, it defaults to check
results.push(['check', nonpipeline_comments[i]]);
}
return results;
};
var ci_parse_comments = function() { var ci_parse_comments = function() {
var comments = []; var comments = [];
$(".commentPanel").each(function() { $(".commentPanel").each(function() {
@ -61,6 +130,7 @@ var ci_parse_comments = function() {
var comment_panel = $(this).find(".commentPanelMessage"); var comment_panel = $(this).find(".commentPanelMessage");
comment.psnum = ci_parse_psnum(comment_panel); comment.psnum = ci_parse_psnum(comment_panel);
comment.merge_conflict = ci_parse_is_merge_conflict(comment_panel); comment.merge_conflict = ci_parse_is_merge_conflict(comment_panel);
comment.pipeline = ci_find_pipeline(comment_panel);
comment.results = ci_parse_results(comment_panel); comment.results = ci_parse_results(comment_panel);
comment.is_ci = (ciRegex.exec(comment.name) !== null); comment.is_ci = (ciRegex.exec(comment.name) !== null);
comment.is_trusted_ci = (trustedCIRegex.exec(comment.name) !== null); comment.is_trusted_ci = (trustedCIRegex.exec(comment.name) !== null);
@ -138,20 +208,27 @@ var ci_display_results = function(comments) {
return; return;
} }
var current = ci_latest_patchset(comments); var current = ci_latest_patchset(comments);
for (var i = 0; i < comments.length; i++) { var pipelines = ci_group_by_pipeline(current, comments);
var comment = comments[i]; for (var i = 0; i < pipelines.length; i++) {
if ((comment.psnum == current) && comment.is_ci && (comment.results.length > 0)) { var pipeline_name = pipelines[i][0];
var header = $("<tr>").append($('<td class="header">' + comment.name + '</td>')); var pipeline_comments = pipelines[i][1];
header.append('<td class="header ci_date">' + comment.date + '</td>'); // the most recent comment on a pipeline
$(table).append(header); var last = pipelines[i][1].length - 1;
var comment = pipeline_comments[last];
var rechecks = "";
if (last > 0) {
rechecks = " (" + last + " rechecks)";
}
for (var j = 0; j < comment.results.length; j++) { var header = $("<tr>").append($('<td class="header">' + comment.name + " " + pipeline_name + rechecks + '</td>'));
var result = comment.results[j]; header.append('<td class="header ci_date">' + comment.date + '</td>');
var tr = $("<tr>"); $(table).append(header);
tr.append($("<td>").append($(result["link"]).clone())); for (var j = 0; j < comment.results.length; j++) {
tr.append($("<td>").append($(result["result"]).clone())); var result = comment.results[j];
$(table).append(tr); var tr = $("<tr>");
} tr.append($("<td>").append($(result["link"]).clone()));
tr.append($("<td>").append($(result["result"]).clone()));
$(table).append(tr);
} }
} }
}; };