Skip to content

Instantly share code, notes, and snippets.

@lwhsu
Created November 28, 2025 21:02
Show Gist options
  • Select an option

  • Save lwhsu/12caa80beb0b0efd9b739492da479a78 to your computer and use it in GitHub Desktop.

Select an option

Save lwhsu/12caa80beb0b0efd9b739492da479a78 to your computer and use it in GitHub Desktop.
diff --git script.js script.js
index 10bc304..910a996 100644
--- script.js
+++ script.js
@@ -42,6 +42,27 @@ function shortHash(hash) {
return hash ? hash.substring(0, 12) : '';
}
+function getFirstExistingBuild(jobName, startNumber, endNumber) {
+ if (!jobName || !startNumber || !endNumber || startNumber > endNumber) {
+ return null;
+ }
+ for (var buildNumber = startNumber; buildNumber <= endNumber; buildNumber++) {
+ var fail_url = '/job/' + jobName + '/' + buildNumber + '/api/json?tree=description';
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", "https://ci.FreeBSD.org" + fail_url, false);
+ xhr.send();
+ if (xhr.status === 200) {
+ return {
+ url: fail_url,
+ description: JSON.parse(xhr.responseText).description
+ };
+ } else if (xhr.status !== 404) {
+ throw new Error("Failed to fetch data from " + fail_url + ". Status: " + xhr.status);
+ }
+ }
+ return null;
+}
+
// splitName must be of the format ['head'] or [TYPE, NUMBER]
function getVersionOrder(splitName) {
return (splitName.length === 1) ? Number.MAX_SAFE_INTEGER : parseInt(splitName[1]);
@@ -97,33 +118,33 @@ function generateFormattedCell(job) {
// check if the last completed build result is not 'SUCCESS'
if (job.lastCompletedBuild.result !== 'SUCCESS') {
- var fail_url = '', failingSinceNumber = '1', fail_since_hash = 'n/a';
+ var fail_url = '', failingSinceNumber = 1, fail_since_hash = 'n/a';
if (job.lastCompletedBuild.result === 'FAILURE')
- failingSinceNumber = (job.lastSuccessfulBuild ? job.lastSuccessfulBuild.number + 1: '1').toString();
+ failingSinceNumber = (job.lastSuccessfulBuild ? job.lastSuccessfulBuild.number + 1 : 1);
else if (job.lastCompletedBuild.result === 'UNSTABLE')
- failingSinceNumber = (Math.max(job.lastStableBuild ? job.lastStableBuild.number : 0, job.lastFailedBuild ? job.lastFailedBuild.number : 0) + 1).toString();
- fail_url = '/job/' + job.name + '/' + failingSinceNumber + '/api/json?tree=description';
- var xhr = new XMLHttpRequest();
- xhr.open("GET", "https://ci.FreeBSD.org" + fail_url, false);
- xhr.send();
- if (xhr.status === 200)
- fail_since_hash = JSON.parse(xhr.responseText).description;
- else
- throw new Error("Failed to fetch data from " + fail_url + ". Status: " + xhr.status);
+ failingSinceNumber = (Math.max(job.lastStableBuild ? job.lastStableBuild.number : 0, job.lastFailedBuild ? job.lastFailedBuild.number : 0) + 1);
+
+ var firstExistingBuild = getFirstExistingBuild(job.name, failingSinceNumber, job.lastCompletedBuild.number);
+ if (firstExistingBuild) {
+ fail_url = firstExistingBuild.url;
+ fail_since_hash = firstExistingBuild.description;
+ }
var failingSince = document.createElement('i');
failingSince.appendChild(document.createTextNode(
- '(failing since ' + (fail_since_hash === '<html>' ? 'unknown commit' : shortHash(fail_since_hash)) + ')'
+ '(failing since ' + ((fail_since_hash && fail_since_hash !== '<html>') ? shortHash(fail_since_hash) : 'unknown commit') + ')'
));
td.appendChild(failingSince);
td.appendChild(_br_.cloneNode(false));
- var links = _span_.cloneNode(false);
- links.setAttribute('class', 'tiny');
- var lastSuccessful = document.createElement('a');
- lastSuccessful.setAttribute('href', 'https://ci.FreeBSD.org' + fail_url.split('api')[0]);
- lastSuccessful.appendChild(document.createTextNode('details'));
- links.appendChild(lastSuccessful);
- td.appendChild(links);
+ if (fail_url) {
+ var links = _span_.cloneNode(false);
+ links.setAttribute('class', 'tiny');
+ var lastSuccessful = document.createElement('a');
+ lastSuccessful.setAttribute('href', 'https://ci.FreeBSD.org' + fail_url.split('api')[0]);
+ lastSuccessful.appendChild(document.createTextNode('details'));
+ links.appendChild(lastSuccessful);
+ td.appendChild(links);
+ }
}
} else {
td.appendChild(document.createTextNode('-'));
@@ -222,4 +243,4 @@ getJSON('/view/FreeBSD/api/json?tree=jobs[name,lastCompletedBuild[number,result,
a.setAttribute('href', 'https://github.com/FreeBSDFoundation/jenkins-tinderbox');
a.appendChild(document.createTextNode('https://github.com/FreeBSDFoundation/jenkins-tinderbox'));
document.body.appendChild(a);
-});
\ No newline at end of file
+});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment