OLD | NEW |
| (Empty) |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 /** Information about a particular build. */ | |
6 function BuildInfo(json) { | |
7 // Parse out the status message for the build. | |
8 var statusText; | |
9 if (json.currentStep) { | |
10 statusText = 'running ' + json.currentStep.name; | |
11 } else { | |
12 statusText = json.text.join(' '); | |
13 } | |
14 | |
15 // Determine what state the build is in. | |
16 var state; | |
17 if (statusText.indexOf('exception') != -1) { | |
18 state = 'exception'; | |
19 } else if (statusText.indexOf('build successful') == 0) { | |
20 state = 'success'; | |
21 } else if (statusText.indexOf('failed') == 0) { | |
22 state = 'failed'; | |
23 } else if (statusText.indexOf('offline') != -1) { | |
24 state = 'offline'; | |
25 } else if (statusText.indexOf('warnings') != -1) { | |
26 state = 'warnings'; | |
27 } else if (statusText.indexOf('running') != -1) { | |
28 state = 'running'; | |
29 } else { | |
30 state = 'unknown'; | |
31 } | |
32 | |
33 var failures = (state == 'failed') ? this.parseFailures(json) : null; | |
34 | |
35 this.number = json.number; | |
36 this.state = state; | |
37 this.failures = failures; | |
38 this.statusText = statusText; | |
39 this.truncatedStatusText = truncateStatusText(statusText); | |
40 } | |
41 | |
42 /** Save data about failed tests to perform blamelist intersections. */ | |
43 BuildInfo.prototype.parseFailures = function(json) { | |
44 var revisionRange = this.getRevisionRange(json); | |
45 if (revisionRange == null) return null; | |
46 | |
47 var failures = []; | |
48 var botName = json.builderName; | |
49 for (var i = 0; i < json.steps.length; ++i) { | |
50 var step = json.steps[i]; | |
51 var binaryName = step.name; | |
52 if (step.results[0] != 0) { // Failed. | |
53 for (var j = 0; j < step.logs.length; ++j) { | |
54 var log = step.logs[j]; | |
55 if (log[0] == 'stdio') | |
56 continue; | |
57 var testName = log[0]; | |
58 failures.push([botName, binaryName, testName, revisionRange]); | |
59 } | |
60 } | |
61 } | |
62 | |
63 return failures; | |
64 }; | |
65 | |
66 /** | |
67 * Get the revisions involved in a build. Sadly, this only works on Chromium's | |
68 * main builders because downstream trees provide git revision SHA1s through | |
69 * JSON instead of SVN numbers. | |
70 */ | |
71 BuildInfo.prototype.getRevisionRange = function(json) { | |
72 if (json.sourceStamp.changes.length == 0) { | |
73 return null; | |
74 } | |
75 | |
76 var lowest = parseInt(json.sourceStamp.changes[0].revision, 10); | |
77 var highest = parseInt(json.sourceStamp.changes[0].revision, 10); | |
78 for (var i = 1; i < json.sourceStamp.changes.length; ++i) { | |
79 var rev = parseInt(json.sourceStamp.changes[i].revision, 10); | |
80 if (rev < lowest) | |
81 lowest = rev; | |
82 if (rev > highest) | |
83 highest = rev; | |
84 } | |
85 return [lowest, highest]; | |
86 }; | |
87 | |
88 /** Creates HTML to display info about this build. */ | |
89 BuildInfo.prototype.createHtml = function(buildNumberCell, | |
90 botUrl, | |
91 showFullInfo) { | |
92 var fullStatusText = 'Build ' + this.number + ':\n' + this.statusText; | |
93 createBuildHtml(buildNumberCell, | |
94 botUrl + '/builds/' + this.number, | |
95 showFullInfo ? this.number : null, | |
96 fullStatusText, | |
97 showFullInfo ? this.truncatedStatusText : null, | |
98 this.state); | |
99 }; | |
100 | |
101 /** Creates a table cell for a particular build number. */ | |
102 function createBuildHtml(cellElement, | |
103 url, | |
104 buildNumber, | |
105 fullStatusText, | |
106 truncatedStatusText, | |
107 buildState) { | |
108 // Create a link to the build results. | |
109 var linkElement = document.createElement('a'); | |
110 linkElement.href = url; | |
111 | |
112 // Display either the build number (for the last completed build), or show the | |
113 // status of the step. | |
114 var buildIdentifierElement = document.createElement('span'); | |
115 if (buildNumber) { | |
116 buildIdentifierElement.className = 'build-identifier'; | |
117 buildIdentifierElement.innerHTML = buildNumber; | |
118 } else { | |
119 buildIdentifierElement.className = 'build-letter'; | |
120 buildIdentifierElement.innerHTML = buildState.toUpperCase()[0]; | |
121 } | |
122 linkElement.appendChild(buildIdentifierElement); | |
123 | |
124 // Show the status of the build in truncated form so it doesn't take up the | |
125 // whole screen. | |
126 if (truncatedStatusText) { | |
127 var statusElement = document.createElement('span'); | |
128 statusElement.className = 'build-status'; | |
129 statusElement.innerHTML = truncatedStatusText; | |
130 linkElement.appendChild(statusElement); | |
131 } | |
132 | |
133 // Tack the cell onto the end of the row. | |
134 cellElement.className = buildState; | |
135 cellElement.title = fullStatusText; | |
136 cellElement.appendChild(linkElement); | |
137 } | |
OLD | NEW |