Created
November 28, 2025 21:02
-
-
Save lwhsu/12caa80beb0b0efd9b739492da479a78 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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