diff options
Diffstat (limited to 'infra/perfetto-ci.appspot.com/static/script.js')
-rw-r--r-- | infra/perfetto-ci.appspot.com/static/script.js | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/infra/perfetto-ci.appspot.com/static/script.js b/infra/perfetto-ci.appspot.com/static/script.js new file mode 100644 index 000000000..d1d0f9535 --- /dev/null +++ b/infra/perfetto-ci.appspot.com/static/script.js @@ -0,0 +1,157 @@ +/** + * Copyright (c) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you + * may not use this file except in compliance with the License. You may + * obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +'use strict'; + +const REPO_URL = 'https://android.googlesource.com/platform/external/perfetto/'; +const GERRIT_REVIEW_URL = 'https://android-review.googlesource.com/c/platform/external/perfetto'; +const CHANGES_URL = '/changes/?q=project:platform/external/perfetto+-age:7days+-is:abandoned&o=DETAILED_ACCOUNTS'; +const REPO = 'catapult-project/perfetto'; + +let botIndex = {}; + +// Builds a map of bot name -> column index, e.g.: +// {'linux-clang-x86_64-relese' -> 1, 'android-clang-arm-debug' -> 2}. +function GetColumnIndexes() { + const cols = document.getElementById('cls_header').children; + for (let i = 0; i < cols.length; i++) { + const id = cols[i].id; + if (id) + botIndex[id] = i + 4 /* 4 = subject...updated columns */; + } +} + +function GetTravisStatusForJob(jobId, div) { + fetch('https://api.travis-ci.org/jobs/' + jobId) + .then(response => { + if (response.status != 200) + throw 'Unable to make request to Travis'; + return response.json(); + }) + .then(resp => { + let jobName = resp.config.env.split(' ')[0]; + if (jobName.startsWith('CFG=')) + jobName = jobName.substring(4); + if (!(jobName in botIndex)) + return; + let link = document.createElement('a'); + link.href = 'https://travis-ci.org/' + REPO + '/jobs/' + jobId; + link.title = resp.state + ' [' + jobName + ']'; + let jobState = resp.state; + if (resp.state == 'finished' && resp.result !== 0) + jobState = 'errored'; + link.classList.add(jobState); + if (jobState == 'finished') + link.innerHTML = '<i class="material-icons">check_circle</i>'; + else if (jobState == 'created') + link.innerHTML = '<i class="material-icons">autorenew</i>'; + else if (jobState == 'errored' || jobState == 'cancelled') + link.innerHTML = '<i class="material-icons">bug_report</i>'; + else + link.innerHTML = '<i class="material-icons">hourglass_full</i>'; + let td = div.children[botIndex[jobName]]; + td.innerHTML = ''; + td.appendChild(link); + }); +} + +function GetTravisStatusForBranch(branch, div) { + fetch('https://api.travis-ci.org/repos/' + REPO + '/branches/' + branch) + .then(response => { + if (response.status != 200) + throw 'Unable to make request to Travis'; + return response.json() + }) + .then(resp => { + for (const jobId of resp.branch.job_ids) + GetTravisStatusForJob(jobId, div); + }); +} + +function CreateRowForBranch(branch, href, subject, status, author, updated) { + let table = document.getElementById('cls'); + let tr = document.createElement('tr'); + tr.classList.add(status); + + let link = document.createElement('a'); + link.href = href; + link.innerText = subject; + let td = document.createElement('td'); + td.appendChild(link); + tr.appendChild(td); + + td = document.createElement('td'); + td.innerText = status; + tr.appendChild(td); + + td = document.createElement('td'); + td.innerText = author; + tr.appendChild(td); + + td = document.createElement('td'); + td.innerText = updated; + tr.appendChild(td); + + for (let _ in botIndex) { + td = document.createElement('td'); + td.classList.add('job'); + tr.appendChild(td); + } + table.appendChild(tr); + GetTravisStatusForBranch(branch, tr); +} + +function LoadGerritCLs() { + fetch(CHANGES_URL) + .then(response => { + if (response.status != 200) + throw 'Unable to make request to Travis'; + return response.text(); + }) + .then(text => { + let json; + if (text.startsWith(')]}\'')) + json = text.substring(4); + else + json = text; + let resp = JSON.parse(json); + for (const cl of resp) { + const branch = 'changes/' + cl._number; + const href = GERRIT_REVIEW_URL + '/+/' + cl._number;; + const lastUpdate = new Date(cl.updated + ' UTC'); + const lastUpdateMins = Math.ceil((Date.now() - lastUpdate) / 60000); + let lastUpdateText = ''; + if (lastUpdateMins < 60) + lastUpdateText = lastUpdateMins + ' mins ago'; + else if (lastUpdateMins < 60 * 24) + lastUpdateText = Math.ceil(lastUpdateMins / 60) + ' hours ago'; + else + lastUpdateText = lastUpdate.toLocaleDateString(); + CreateRowForBranch(branch, href, cl.subject, cl.status, + cl.owner.email.replace('@google.com', '@'), lastUpdateText); + } + }); +} + +// Register the service worker to cache job requests. +if ('serviceWorker' in navigator) { + navigator.serviceWorker.register('/service_worker.js', { scope: '/' }); +} + +// Fetch the CLs and the corresponding status for the Travis jobs. +GetColumnIndexes(); +CreateRowForBranch('master', REPO_URL, '*** master branch ***', 'MASTER', '', ''); +LoadGerritCLs(); |