Index: master/public_html/skia_tools.js |
diff --git a/master/public_html/skia_tools.js b/master/public_html/skia_tools.js |
deleted file mode 100644 |
index 5c81a1ee8125f9e1dc269918baae5c97d1bad766..0000000000000000000000000000000000000000 |
--- a/master/public_html/skia_tools.js |
+++ /dev/null |
@@ -1,767 +0,0 @@ |
-/** |
- * @license Copyright 2012 Google Inc. |
- * |
- * Use of this source code is governed by a BSD-style license that can be |
- * found in the LICENSE file. |
- */ |
- |
-/** |
- * @fileoverview Tools used by the Skia buildbot dashboards, including |
- * facilities for retrieving data from the buildbot master. |
- */ |
- |
-"use strict"; |
- |
-var skiaTools = { |
- |
-globalVariables: null, |
-googlesourceURL: "https://skia.googlesource.com", |
- |
-masterHostSuffix: "_master_host", |
-masterPortSuffix: "_external_port", |
- |
- |
-/** |
- * Retrieve the Git log for the Skia repository. |
- * |
- * @param {string} startHash |
- * @param {string} endHash |
- * @param {function(Array.<Object>)} callback Call this function with the |
- * decoded JSON from the Git log when the data has loaded. |
- */ |
-gitLog: function(startHash, endHash, callback) { |
- var url = this.googlesourceURL + "/skia/+log/" + startHash + ".." + endHash + |
- "?format=JSON"; |
- try { |
- var request = new XMLHttpRequest(); |
- } catch (error) { |
- alert(error); |
- } |
- request.open("GET", url, true); |
- request.onreadystatechange = function() { |
- if (request.readyState != 4) { return; } |
- // Remove the first line, which is garbage. |
- var responseLines = request.responseText.split('\n'); |
- responseLines.splice(0, 1); |
- |
- callback(JSON.parse(responseLines.join('\n'))["log"]); |
- }; |
- request.send(); |
-}, |
- |
-/** |
- * Object used for managing Git history. |
- */ |
-GitHistory: function() { |
- this.gotRev = {}; |
- this.allRevisions = []; |
- this.lastFetchedRev = "HEAD"; |
- |
- /** |
- * loadCommits |
- * |
- * @param {string} oldestCommit Load this commit and all newer commits. |
- * @param {function} callback Call this function when finished. |
- */ |
- this.loadCommits = function(oldestCommit, callback) { |
- var thisInstance = this; |
- skiaTools.gitLog(oldestCommit + "~1", this.lastFetchedRev, function(newCommits) { |
- for (var i = 0; i < newCommits.length; ++i) { |
- var commitHash = newCommits[i].commit; |
- thisInstance.allRevisions.push(commitHash); |
- thisInstance.gotRev[commitHash] = true; |
- } |
- thisInstance.lastFetchedRev = newCommits[newCommits.length - 1].commit; |
- callback(); |
- }); |
- } |
- |
- /** |
- * getRevList |
- * |
- * @return {Array.<string>} Array of commit hashes in chronological order. |
- */ |
- this.getRevList = function() { |
- var revList = Array.prototype.slice.call(this.allRevisions); |
- revList.reverse(); // Sort newest to oldest. |
- return revList; |
- } |
- |
- /** |
- * ensureLoaded |
- * |
- * @param {Array.<string>} commitList Load commits from history until all |
- * commits in commitList have been loaded. This will be significantly |
- * faster if the list is in chronological order. |
- * @param {function} callback Call this function when finished. |
- */ |
- this.ensureLoaded = function(commitList, callback) { |
- var thisInstance = this; |
- var areAllLoaded = function() { |
- for (var i = 0; i < commitList.length; i++) { |
- var commit = commitList[i]; |
- if (!thisInstance.gotRev[commit]) { |
- thisInstance.loadCommits(commit, areAllLoaded); |
- return; |
- } |
- } |
- callback(); |
- }; |
- areAllLoaded(); |
- } |
-}, |
- |
-/** |
- * Convenience function for populating a ComboBox or ListBox with a list of |
- * items. Existing items will be cleared. |
- * |
- * @param {string} menuId ID of the menu to populate. |
- * @param {Array.<string>} items A list of strings to insert into the menu. |
- */ |
-populateMenu: function(menuId, items) { |
- var menu = document.getElementById(menuId); |
- menu.options.length = 0; |
- for (var itemIdx = 0; itemIdx < items.length; itemIdx++) { |
- var item = items[itemIdx]; |
- var newOption = document.createElement("option"); |
- newOption.text = item; |
- newOption.value = item; |
- menu.options.add(newOption); |
- } |
-}, |
- |
-/** |
- * Load the global_variables.json file. |
- * |
- * @param {function} callback Call this function when finished. |
- */ |
-loadGlobalVariables: function(callback) { |
- var thisInstance = this; |
- var url = this.googlesourceURL + "/buildbot/+/master/site_config/" + |
- "global_variables.json?format=TEXT"; |
- try { |
- var request = new XMLHttpRequest(); |
- } catch (error) { |
- alert(error); |
- } |
- request.open("GET", url, true); |
- request.onreadystatechange = function() { |
- if (request.readyState != 4) { return; } |
- thisInstance.globalVariables = JSON.parse(atob(request.responseText)); |
- callback(); |
- } |
- request.send(); |
-}, |
- |
-/** |
- * Retrieve the given variable. |
- * |
- * @param {function(string)} callback Call this function with the value of the |
- * requested variable, as defined in the global variables file, or |
- * undefined if it is not found. |
- */ |
-getVariable: function(varName, callback) { |
- var thisInstance = this; |
- var readGlobalVariable = function() { |
- if (!thisInstance.globalVariables[varName]) { |
- callback(undefined); |
- } |
- callback(thisInstance.globalVariables[varName].value); |
- }; |
- if (!this.globalVariables) { |
- this.loadGlobalVariables(readGlobalVariable); |
- } else { |
- readGlobalVariable(); |
- } |
-}, |
- |
-/** |
- * Information about a single build. |
- */ |
-Build: function(builder, number, revision, result, startTime, endTime, steps) { |
- this.builder = builder; |
- this.number = number; |
- this.revision = revision; |
- this.result = result; |
- this.startTime = startTime; |
- this.endTime = endTime; |
- this.elapsedTime = endTime - startTime; |
- this.steps = steps; |
- |
- /** |
- * getBuilder |
- * |
- * @return {string} The name of the builder who owns this build. |
- */ |
- this.getBuilder = function() { return this.builder; } |
- |
- /** |
- * getNumber |
- * |
- * @return {number} The build number. |
- */ |
- this.getNumber = function() { return this.number; } |
- |
- /** |
- * getResult |
- * |
- * @return {number} The result of the build. Will be 0 iff the build |
- * succeeded. |
- */ |
- this.getResult = function() { return this.result; } |
- |
- /** |
- * getRevision |
- * |
- * @return {number} The revision number of this build. |
- */ |
- this.getRevision = function() { return this.revision; } |
- |
- /** |
- * getStartTime |
- * |
- * @return {number} Start time of the build in UNIX seconds from epoch. |
- */ |
- this.getStartTime = function() { return this.startTime; } |
- |
- /** |
- * getEndTime |
- * |
- * @return {number} End time of the build in UNIX seconds from epoch. |
- */ |
- this.getEndTime = function() { return this.endTime; } |
- |
- /** |
- * getElapsedTime |
- * |
- * @return {number} Elapsed time of the build in seconds. |
- */ |
- this.getElapsedTime = function() { return this.elapsedTime; } |
- |
- /** |
- * getStartTime |
- * |
- * @return {Array.<BuildStep>} Information about the steps of this build. |
- */ |
- this.getSteps = function() { return this.steps; } |
-}, |
- |
-/** |
- * Information about a single build step. |
- */ |
-BuildStep: function(name, elapsedTime, result, stdio) { |
- this.name = name; |
- this.elapsedTime = elapsedTime; |
- this.result = result; |
- this.stdio = stdio; |
- |
- /** |
- * getName |
- * |
- * @return {string} The name of the build step. |
- */ |
- this.getName = function() { return this.name; } |
- |
- /** |
- * getElapsedTime |
- * |
- * @return {number} Elapsed time of the build step in seconds. |
- */ |
- this.getElapsedTime = function() { return this.elapsedTime; } |
- |
- /** |
- * getResult |
- * |
- * @return {number} The result of the build. Will be 0 iff the build step |
- * succeeded. |
- */ |
- this.getResult = function() { return this.result; } |
- |
- /** |
- * getStdio |
- * |
- * @return {string} URL to the log output for this build step. |
- */ |
- this.getStdio = function() { return this.stdio; } |
-}, |
- |
-/** |
- * Information about a builder. |
- */ |
-Builder: function(name, master, basedir, cachedBuilds, category, currentBuilds, |
- slaves, state) { |
- this.name = name; |
- this.master = master; |
- this.basedir = basedir; |
- // alreadyLoadedBuilds differs from the passed-in cachedBuilds; the passed-in |
- // parameter refers to the builds which the build master has cached. This |
- // property is a set of builds which have been loaded from the build master |
- // and stored here for future use. |
- this.alreadyLoadedBuilds = {}; |
- this.category = category; |
- this.currentBuilds = currentBuilds; |
- this.lastBuild = cachedBuilds[cachedBuilds.length - 1]; |
- this.slaves = slaves; |
- this.state = state; |
- |
- /** |
- * getName |
- * |
- * @return {string} The name of the builder. |
- */ |
- this.getName = function() { return this.name; } |
- |
- /** |
- * getBaseDir |
- * |
- * @return {string} Directory on the build slave machine in which build |
- * information is stored. This is typically the same as the builder name. |
- */ |
- this.getBaseDir = function() { return this.basedir; } |
- |
- /** |
- * getCategory |
- * |
- * @return {string} Category of this builder. This is the heading under |
- * which the builder is placed on the buildbot web page. |
- */ |
- this.getCategory = function() { return this.category; } |
- |
- /** |
- * getCurrentBuilds |
- * |
- * @return {Array.<number>} List of currently-running builds for this |
- * builder. |
- */ |
- this.getCurrentBuilds = function() { return this.currentBuilds; } |
- |
- /** |
- * getLastBuild |
- * |
- * @return {number} The build number of the last completed build for this |
- * builder. |
- */ |
- this.getLastBuild = function() { return this.lastBuild; } |
- |
- /** |
- * getSlaves |
- * |
- * @return {Array.<string>} List of known build slaves which are capable of |
- * running builds for this builder. |
- */ |
- this.getSlaves = function() { return this.slaves; } |
- |
- /** |
- * getState |
- * |
- * @return {string} Current status of the builder. Either "building" or |
- * "idle." |
- */ |
- this.getState = function() { return this.state; } |
- |
- /** |
- * Obtain information about a single build from the buildbot master. |
- * |
- * @param {number} build The number of the build which should be retrieved. |
- * @param {boolean} loadUnfinished Whether or not to load data for unfinished |
- * builds. |
- * @param {boolean} loadUnknownRevs Whether or not to load data for builds |
- * which do not have an associated revision number. This occurs when the |
- * source checkout step fails. |
- * @param {function(string, number, Build|null)} callback Call this function |
- * with a builder name, build number, and a Build instance containing |
- * information about the requested build when loaded. |
- */ |
- this.loadDataForBuild = function(build, loadUnfinished, loadUnknownRevs, |
- callback) { |
- var thisInstance = this; |
- var buildURL = "builders/" + this.getName() + "/builds/" + build + "/steps"; |
- this.master.loadData(buildURL, function(buildData) { |
- // Build step results. |
- var SUCCESS = 0; |
- var FAILURE = 2; |
- var SKIPPED = 3; |
- |
- var steps = []; |
- var result = 0; |
- var startTime = 0; |
- var endTime = 0; |
- var revision = undefined; |
- var gotRevisionStr = "got_revision: "; |
- for (var step in buildData) { |
- var stepData = buildData[step]; |
- if (stepData["isStarted"] && !stepData["isFinished"] && |
- !loadUnfinished) { |
- // If the build isn't finished, ignore it |
- callback(thisInstance.getName(), build, null); |
- } |
- if (!stepData["isStarted"]) { |
- continue; |
- } |
- if (stepData["name"] == "Update") { |
- // The buildbot's JSON interface stores results as an array in which |
- // the first element is an integer indicating success or failure. |
- if (stepData["isStarted"] && stepData["isFinished"] && |
- stepData["results"][0] == 0) { |
- // The "text" field is an array containing extra information about |
- // the build step. In the case of the Update step, its second |
- // element is a string indicating the revision obtained for the |
- // current build. |
- revision = stepData["text"][1].substring(gotRevisionStr.length); |
- } else if (!loadUnknownRevs) { |
- // If the Update step failed, we can't attach a revision, so we have |
- // to ignore this build. |
- console.log("Warning: Can't get a revision for build #" + build + |
- ". Skipping."); |
- callback(thisInstance.getName(), build, null); |
- } |
- } |
- var times = stepData["times"]; |
- var stepTime = times[1] - times[0]; |
- if (startTime == 0) { |
- startTime = times[0]; |
- } |
- endTime = times[1]; |
- var stdout = null; |
- try { |
- stdout = stepData["logs"][0][1]; |
- } catch(e) { |
- stdout = "None"; |
- } |
- |
- var buildStep = new skiaTools.BuildStep(stepData["name"], stepTime, |
- stepData["results"][0], stdout); |
- steps.push(buildStep); |
- |
- if (buildStep.getResult() != SUCCESS && |
- buildStep.getResult() != SKIPPED) { |
- result = FAILURE; |
- } |
- } |
- if (revision == undefined) { |
- console.log("Warning: could not find a revision for build #" + build); |
- } |
- |
- callback(thisInstance.getName(), build, new skiaTools.Build( |
- thisInstance.getName(), build, revision, result, startTime, endTime, |
- steps)); |
- }); |
- } |
- |
- /** |
- * Obtain information about the builds for a single builder. Works backward |
- * from the last known build, loading builds until the requested number of |
- * builds has been fulfilled or all of the builder's builds have been loaded. |
- * |
- * @param {number} numBuilds The number of builds to load. |
- * @param {function(string, Object)} callback Call this function with the |
- * builder name and a dictionary of instances of Build for the builder, |
- * indexed by revision. |
- */ |
- this.loadBuilds = function(numBuilds, callback) { |
- var lastBuild = this.getLastBuild(); |
- var loading = []; |
- var thisInstance = this; |
- var doneLoading = function() { |
- var data = {}; |
- for (var buildNum = lastBuild; buildNum >= lastBuild - numBuilds && buildNum >= 0; buildNum--) { |
- var build = thisInstance.alreadyLoadedBuilds[buildNum]; |
- if (build) { |
- data[buildNum] = build; |
- } |
- } |
- callback(thisInstance.getName(), data); |
- }; |
- for (var buildNum = lastBuild; buildNum >= lastBuild - numBuilds && buildNum >= 0; buildNum--) { |
- var build = this.alreadyLoadedBuilds[buildNum]; |
- if (!build) { |
- loading.push(buildNum); |
- this.loadDataForBuild(buildNum, false, false, function(builder, buildNum, build) { |
- loading.splice(loading.indexOf(buildNum), 1); |
- thisInstance.alreadyLoadedBuilds[buildNum] = build; |
- if (loading.length == 0) { |
- doneLoading(); |
- } |
- }); |
- } else { |
- data[buildNum] = build; |
- if (loading.length == 0) { |
- doneLoading(); |
- } |
- } |
- } |
- } |
-}, |
- |
-/** |
- * Information about a build slave. |
- */ |
-BuildSlave: function(admin, builders, connected, currentBuilds, host, name, |
- master, version) { |
- this.admin = admin; |
- this.builders = builders; |
- this.connected = connected; |
- this.currentBuilds = currentBuilds; |
- this.host = host; |
- this.name = name; |
- this.master = master; |
- this.version = version; |
- |
- /** |
- * getAdmin |
- * |
- * @return {string} Usernames of buildbot maintainers. |
- */ |
- this.getAdmin = function() { return this.admin; } |
- |
- /** |
- * getBuilders |
- * |
- * @return {Object} Dictionary whose keys are builder names and values are |
- * lists of build numbers indicating which builds for which builders this |
- * slave has performed. |
- */ |
- this.getBuilders = function() { return this.builders; } |
- |
- /** |
- * isConnected |
- * |
- * @return {boolean} Whether or not the build slave is currently connected |
- * to the build master. |
- */ |
- this.isConnected = function() { return this.connected; } |
- |
- /** |
- * getCurrentBuilds |
- * |
- * @return {Array.<Object>} List of dictionaries containing information about |
- * currently-running builds on this slave. |
- */ |
- this.getCurrentBuilds = function() { return this.currentBuilds; } |
- |
- /** |
- * getHost |
- * |
- * @return {string} Hostname of this build slave. |
- */ |
- this.getHost = function() { return this.host; } |
- |
- /** |
- * getName |
- * |
- * @return {string} The name of this build slave. |
- */ |
- this.getName = function() { return this.name; } |
- |
- /** |
- * getVersion |
- * |
- * @return {string} Version of BuildBot which this build slave is running. |
- */ |
- this.getVersion = function() { return this.version; } |
- |
- /** |
- * Obtain information about recent builds for a build slave. |
- * |
- * @param {number} rangeMin Builds before this time will not be loaded. |
- * @param {number} currentTime The time at which {@code slaveDict} was |
- * obtained from the build master. This value is passed in rather than |
- * obtaining the current time at the call of this function in case the |
- * state of the build slave has changed since {@code slaveDict} was |
- * obtained. |
- * @param {function(Array.<Build>)} callback Call this function with a list |
- * of Build objects when loaded. |
- */ |
- this.loadBuilds = function(rangeMin, currentTime, callback) { |
- var builders = this.getBuilders(); |
- var buildList = []; |
- var thisInstance = this; |
- var getRunningBuilds = function() { |
- var runningBuilds = thisInstance.getCurrentBuilds(); |
- for (var buildIdx = 0; buildIdx < runningBuilds.length; buildIdx++) { |
- var buildData = runningBuilds[buildIdx]; |
- buildList.push(new thisInstance.Build(buildData["builderName"], |
- buildData["number"], |
- -1, 0, buildData["times"][0], |
- currentTime + 1, [])); |
- } |
- buildList.sort(function(a, b) { |
- return a.getStartTime() - b.getStartTime(); |
- }); |
- callback(buildList); |
- }; |
- |
- var loadingBuilders = {}; |
- |
- var gotBuild = function(builder, buildNum, build) { |
- buildList.push(build); |
- if (build != null && |
- (build.getEndTime() < rangeMin || |
- build.getStartTime() < rangeMin || |
- build.getNumber() == 0)) { |
- delete loadingBuilders[builder]; |
- if (Object.keys(loadingBuilders).length == 0) { |
- getRunningBuilds(); |
- } |
- } else { |
- var builderObj = loadingBuilders[builder]; |
- builderObj.loadDataForBuild(buildNum - 1, true, true, gotBuild); |
- } |
- } |
- |
- for (var builder in builders) { |
- var builderObj = new skiaTools.Builder(builder, |
- this.master, |
- null, |
- [-1], |
- null, |
- null, |
- null, |
- null); |
- var builds = builders[builder]; |
- if (builds.length > 0) { |
- loadingBuilders[builder] = builderObj; |
- builderObj.loadDataForBuild(builds[0], true, true, gotBuild); |
- } |
- } |
- } |
-}, |
- |
-loadMasterList: function(callback) { |
- var masters = []; |
- var thisInstance = this; |
- var gotVariables = function() { |
- for (var key in thisInstance.globalVariables) { |
- var suffixIndex = key.indexOf( |
- skiaTools.masterHostSuffix, |
- key.length - skiaTools.masterHostSuffix.length); |
- if (suffixIndex !== -1) { |
- masters.push(key.substring(0, suffixIndex)); |
- } |
- } |
- callback(masters); |
- } |
- if (!thisInstance.globalVariables) { |
- this.loadGlobalVariables(gotVariables); |
- } else { |
- gotVariables(); |
- } |
-}, |
- |
-Master: function(name) { |
- this.name = name; |
- |
- var thisInstance = this; |
- skiaTools.getVariable(name + skiaTools.masterHostSuffix, function(host) { |
- thisInstance.host = host; |
- }); |
- skiaTools.getVariable(name + skiaTools.masterPortSuffix, function(port) { |
- thisInstance.port = port; |
- }); |
- |
- /** |
- * getName |
- * |
- * @return {string} Name of this build master. |
- */ |
- this.getName = function() { return this.name; } |
- |
- /** |
- * getHost |
- * |
- * @return {string} Hostname of this build master. |
- */ |
- this.getHost = function() { return this.host; } |
- |
- /** |
- * getPort |
- * |
- * @return {string} Port number of this build master. |
- */ |
- this.getPort = function() { return this.port; } |
- |
- /** |
- * loadData |
- * |
- * Sends an {@code XMLHttpRequest} to the buildbot master, parses the JSON in |
- * the response, and returns a dictionary. |
- * |
- * @param {string} subdir Subdirectory of the buildbot master's JSON |
- * interface to query. |
- * @param {function(Object)} callback Call this function with the decoded |
- * JSON data when loaded. |
- */ |
- this.loadData = function(subdir, callback) { |
- try { |
- var request = new XMLHttpRequest(); |
- } catch (error) { |
- alert(error); |
- } |
- var url = "http://" + this.getHost() + ":" + this.getPort() + "/json/" + |
- subdir; |
- request.open("GET", url, true); |
- request.onreadystatechange = function() { |
- if (request.readyState != 4) { return; } |
- callback(JSON.parse(request.responseText)); |
- } |
- request.send(null); |
- } |
- |
- /** |
- * Obtain high-level information about known builders. |
- * |
- * @param {Array.<Builder>} callback Call this function with a list of |
- * Builder objects when loaded. |
- */ |
- this.loadBuilders = function(callback) { |
- var thisInstance = this; |
- this.loadData("builders", function(buildersData) { |
- var builders = []; |
- for (var builderName in buildersData) { |
- var builderData = buildersData[builderName]; |
- var builder = new skiaTools.Builder(builderName, |
- thisInstance, |
- builderData["basedir"], |
- builderData["cachedBuilds"], |
- builderData["category"], |
- builderData["currentBuilds"], |
- builderData["slaves"], |
- builderData["state"]); |
- builders.push(builder); |
- } |
- callback(builders); |
- }); |
- } |
- |
- /** |
- * Obtain high-level information about known build slaves. |
- * |
- * @param {function(Array.<BuildSlave>)} callback Call this function with a |
- * list of BuildSlave objects when loaded. |
- */ |
- this.loadSlaves = function(callback) { |
- var slaves = []; |
- var thisInstance = this; |
- this.loadData("slaves", function(slavesData) { |
- for (var slave in slavesData) { |
- var slaveData = slavesData[slave]; |
- var currentBuilds = slaveData["currentBuilds"]; |
- if (currentBuilds == undefined) { |
- currentBuilds = []; |
- } |
- slaves.push(new skiaTools.BuildSlave(slaveData["admin"], |
- slaveData["builders"], |
- slaveData["connected"], |
- currentBuilds, |
- slaveData["host"], |
- slaveData["name"], |
- thisInstance, |
- slaveData["version"])); |
- } |
- callback(slaves); |
- }); |
- } |
- |
-}, |
- |
-}; |