| Index: master/templates/layout.html
|
| diff --git a/master/templates/layout.html b/master/templates/layout.html
|
| deleted file mode 100644
|
| index 59143a0d22f1ff608d286e7fd91615a8ac905033..0000000000000000000000000000000000000000
|
| --- a/master/templates/layout.html
|
| +++ /dev/null
|
| @@ -1,756 +0,0 @@
|
| -{%- block doctype -%}
|
| -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
| - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
| -{% endblock %}
|
| -<!-- Copied and modified from:
|
| -http://src.chromium.org/viewvc/chrome/trunk/tools/build/third_party/buildbot_8_4p1/buildbot/status/web/templates/layout.html?revision=89637&content-type=text/plain
|
| --->
|
| -<html xmlns="http://www.w3.org/1999/xhtml">
|
| - <head>
|
| - {% block head %}
|
| - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
| - {% if metatags %}
|
| - {{ metatags }}
|
| - {% endif %}
|
| - <title>{{ pageTitle|e }}</title>
|
| - <link rel="stylesheet" href="{{ stylesheet }}" type="text/css" />
|
| - <link rel="alternate" type="application/rss+xml" title="RSS" href="{{ path_to_root }}rss">
|
| - <script type="text/javascript">
|
| - "use strict";
|
| -
|
| - // Revision of the buildbot code on the build master.
|
| - var javascript_revision = "{{ master_revision }}";
|
| -
|
| - // Ports used to access the buildbot webstatus pages.
|
| - var internalPort = "{{ internal_port }}";
|
| - var externalPort = "{{ external_port }}";
|
| -
|
| - // JSON data URL.
|
| - var tree_status_appspot_url = "{{ tree_status_baseurl }}";
|
| -
|
| - // Per-builder status messages.
|
| - var builder_statuses = {};
|
| -
|
| - // How often, in milliseconds, to refresh the page.
|
| - var refreshInterval = {{ refresh or default_refresh }} * 1000;
|
| - var refreshTimer = null;
|
| -
|
| - // Number of times a page reload has been cancelled due to activity on the page.
|
| - var cancelledReloads = 0;
|
| -
|
| - // Maximum number of cancelled reloads before forcing a reload.
|
| - var maxCancelledReloads = 10;
|
| -
|
| - // Variables passed in the URL.
|
| - var urlVars = {};
|
| -
|
| - // Categories of builders, and whether each category should be displayed.
|
| - var allCategories = {
|
| - {% for r in all_categories %}
|
| - "{{ r }}": true,
|
| - {% endfor %}
|
| - };
|
| -
|
| - // Subcategories of builders, and whether each category should be displayed.
|
| - var allSubcategories = {
|
| - {% for subcategory in all_subcategories %}
|
| - "{{ subcategory }}": true,
|
| - {% endfor %}
|
| - };
|
| -
|
| - // Subcategories listed by which category they fall under.
|
| - var subcategoriesByCategory = {
|
| - {% for category in subcategories_by_category %}
|
| - "{{ category }}": [
|
| - {% for subcategory in subcategories_by_category[category] %}
|
| - "{{ subcategory }}",
|
| - {% endfor %}
|
| - ],
|
| - {% endfor %}
|
| - }
|
| -
|
| - function addLinks(text) {
|
| - // Linkify arbitrary URLs.
|
| - var new_text = "";
|
| - if (text && text.indexOf("<a href=") == -1) {
|
| - new_text = text.replace(
|
| - /(https?:\/\/.+?)(\s|\t|<|\n|\r|$)/g, '<a href="$1" target="_blank">$1</a>$2');
|
| - }
|
| -
|
| - // Linkify instances of "skia:123".
|
| - var re = new RegExp("skia:[0-9]+");
|
| - var found_bugs = new_text.match(/skia:[0-9]+/g);
|
| - if (found_bugs) {
|
| - for (var i = 0; i < found_bugs.length; ++i) {
|
| - var found_bug = found_bugs[i];
|
| - var bug_number = found_bug.split(":")[1];
|
| - var bug_link = '<a href="https://code.google.com/p/skia/issues/detail?id=' + bug_number + '" target="_blank">' + found_bug + '</a>';
|
| - new_text = new_text.replace(found_bug, bug_link);
|
| - }
|
| - }
|
| - return new_text;
|
| - }
|
| -
|
| - // Switch to a new host/port.
|
| - function setHostAndPort(host, port) {
|
| - var current_host = window.location.host.split(":");
|
| - if (!host) {
|
| - host = current_host[0];
|
| - }
|
| - if (!port) {
|
| - port = current_host[1];
|
| - }
|
| - window.location.host = host + ":" + port;
|
| - }
|
| -
|
| - // Parse the variables in the URL and return a key/value dictionary.
|
| - function parseArgs()
|
| - {
|
| - var args = {};
|
| - var dict = window.location.search.slice(1).split('&');
|
| - for(var i = 0; i < dict.length; i++) {
|
| - var split = dict[i].split('=');
|
| - var key = split[0];
|
| - var value = split[1];
|
| - if (args[key]) {
|
| - if (Object.prototype.toString.call(args[key]) == "[object Array]") {
|
| - args[key].push(value);
|
| - } else {
|
| - args[key] = [args[key], value];
|
| - }
|
| - } else if (key != "") {
|
| - args[key] = value;
|
| - }
|
| - }
|
| - return args;
|
| - }
|
| -
|
| - // If the currently running revision of this page differs from that of the
|
| - // build master, reload the whole page instead of just the JSON data.
|
| - function doReload() {
|
| - // Get the master's code revision.
|
| - loadJSONP("/json/master_revision",
|
| - gotMasterRevision,
|
| - null);
|
| - }
|
| -
|
| - // Callback function for doReload.
|
| - function gotMasterRevision(data) {
|
| - if (data["master_checkedout_revision"] != javascript_revision) {
|
| - // Force a reload of the page if the master has a new revision.
|
| - location.reload(true);
|
| - } else {
|
| - loadAllData();
|
| - }
|
| - }
|
| -
|
| - // Reload the page, if the user isn't actively interacting with it.
|
| - function reloadPage() {
|
| - var reloadIsAllowed = true;
|
| -
|
| - // Don't allow reload if a build box is open.
|
| - var buildBox = document.getElementById("divBox");
|
| - if (buildBox && buildBox.style.display != "none") {
|
| - console.log("divBox is displaying (" + buildBox.style.display + ").");
|
| - reloadIsAllowed = false;
|
| - }
|
| -
|
| - if (reloadIsAllowed) {
|
| - doReload();
|
| - } else if (cancelledReloads >= maxCancelledReloads) {
|
| - console.log("Forcing a reload because the number of " +
|
| - "previously-cancelled reloads exceeded " +
|
| - maxCancelledReloads + ".");
|
| - doReload();
|
| - } else {
|
| - console.log("Not reloading page because the user is interacting with it.");
|
| - cancelledReloads++;
|
| - refreshTimer = setTimeout(reloadPage, refreshInterval);
|
| - }
|
| - }
|
| -
|
| - // Return the name of a non-anonymous function.
|
| - function getFunctionName(func) {
|
| - var name = func.toString();
|
| - name = name.substr("function ".length);
|
| - name = name.substr(0, name.indexOf("("));
|
| - return name;
|
| - }
|
| -
|
| - // Use JSONP to retrieve data from the given URL. There are a few possible
|
| - // outcomes:
|
| - // 1. The server returns valid JSONP. In this case, the provided callback
|
| - // will be called with the data as the parameter.
|
| - // 2. The server returns an error code (eg. if the requested URL isn't
|
| - // valid). In this case, the provided errback will be called.
|
| - // 3. The server returns a success code but the response does not contain
|
| - // valid JSONP. In this case, the callback cannot be called, since that
|
| - // call is part of the JSONP response. Additionally, the errback will
|
| - // not fire, since there is no way to dynamically insert a try/catch
|
| - // around the response content, and the script tag's onError handler
|
| - // only fires if the script could not be obtained from the server.
|
| - //
|
| - // Note: callback must NOT be an anonymous function.
|
| - //
|
| - function loadJSONP(url, callback, errback) {
|
| - var script = document.createElement("script");
|
| - var src = appendParamToURL(url, "callback", getFunctionName(callback));
|
| - script.setAttribute("src", src);
|
| - script.onError = errback
|
| - document.getElementsByTagName("head")[0].appendChild(script);
|
| - }
|
| -
|
| - // Use an XmlHttpRequest to retrieve data from the given URL.
|
| - function loadXML(url, callback) {
|
| - var req = new XMLHttpRequest();
|
| - req.open("GET", url, true);
|
| - req.onreadystatechange = function() {
|
| - if (req.readyState == 4) { callback(req.responseText); }
|
| - };
|
| - req.send();
|
| - }
|
| -
|
| - // Set the tree status.
|
| - function setTreeStatus(data) {
|
| - var tree_status_div = document.getElementById("tree_status_div");
|
| - if (tree_status_div) {
|
| - tree_status_div.className = "status-message " + data["general_state"];
|
| - }
|
| - var tree_status_message = document.getElementById("tree_status_message");
|
| - if (tree_status_message) {
|
| - tree_status_message.innerHTML = data["message"];
|
| - }
|
| - }
|
| -
|
| - // Set the current sheriff.
|
| - function setSheriff(data) {
|
| - var sheriff_div = document.getElementById("sheriff_div");
|
| - if (sheriff_div) {
|
| - sheriff_div.innerHTML = "Sheriff: " + data["username"];
|
| - }
|
| - }
|
| -
|
| - // Set builder statuses.
|
| - function setBuilderStatuses(data) {
|
| - // Set the global builder status variable.
|
| - builder_statuses = data;
|
| -
|
| - // Mark builders who have comments.
|
| - for (var builder_name in data) {
|
| - // Builder column headers.
|
| - var comment_indicator = document.getElementById("commentIndicator_" + builder_name);
|
| - if (comment_indicator) {
|
| - comment_indicator.className += " BuilderHasComment";
|
| - }
|
| -
|
| - // Summary boxes for all masters.
|
| - var summary_box = document.getElementById("summaryBox_" + builder_name);
|
| - if (summary_box) {
|
| - summary_box.className += " BuilderHasComment";
|
| - }
|
| - }
|
| -
|
| - // Optionally display the builder status message on the page.
|
| - var display_comment_elems = document.getElementsByClassName("DisplayBuilderComment");
|
| - for (var i = 0; i < display_comment_elems.length; ++i) {
|
| - var display_comment = display_comment_elems[i];
|
| - display_comment.innerHTML = "";
|
| - var builder_name = display_comment.id.slice("displayBuilderComment_".length);
|
| - buildComment(builder_name, display_comment);
|
| - if (builder_statuses[builder_name]) {
|
| - display_comment.className += " BuilderHasComment";
|
| - }
|
| - }
|
| -
|
| - // Rebuild the console table, if applicable.
|
| - if (typeof buildConsoleTable == "function") {
|
| - buildConsoleTable();
|
| - }
|
| - }
|
| -
|
| - // Function to call on page load. Reloads the page with appropriate options
|
| - // if they are not already set.
|
| - function init() {
|
| - var host = window.location.host;
|
| - var checkedRadio;
|
| - if (host.indexOf(internalPort, host.length - internalPort.length) !== -1) {
|
| - checkedRadio = document.getElementById("radio_internal");
|
| - } else if (host.indexOf(externalPort, host.length - externalPort.length) !== -1) {
|
| - checkedRadio = document.getElementById("radio_external");
|
| - }
|
| - if (checkedRadio) {
|
| - checkedRadio.checked = true;
|
| - }
|
| -
|
| - urlVars = parseArgs();
|
| - if (urlVars["hideCategories"]) {
|
| - var categoryList = urlVars["hideCategories"].split(",");
|
| - for (var i = 0; i < categoryList.length; ++i) {
|
| - var name = categoryList[i];
|
| - allCategories[name] = false;
|
| - var chkbox = document.getElementById("chkbox_category_" + name);
|
| - if (chkbox) {
|
| - chkbox.checked = false;
|
| - }
|
| - }
|
| - }
|
| - if (urlVars["hideSubcategories"]) {
|
| - var subcategoryList = urlVars["hideSubcategories"].split(",");
|
| - for (var i = 0; i < subcategoryList.length; ++i) {
|
| - var name = subcategoryList[i];
|
| - allSubcategories[name] = false;
|
| - var chkbox = document.getElementById("chkbox_subcategory_" + name);
|
| - if (chkbox) {
|
| - chkbox.checked = false;
|
| - }
|
| - }
|
| - }
|
| - loadAllData();
|
| - }
|
| -
|
| - // Display the most recent build for each builder on the given master.
|
| - function setLatestBuildsForMaster(master, master_builder_url, builders) {
|
| - var master_data_row = document.getElementById("results_summary_" + master);
|
| - if (!master_data_row) {
|
| - return;
|
| - }
|
| - // Clear any old results, up to the first cell which is the label.
|
| - while (master_data_row.cells.length > 1) {
|
| - master_data_row.deleteCell(-1);
|
| - }
|
| - // Add the new results.
|
| - for (var builder_index = 0; builder_index < builders.length; ++builder_index) {
|
| - var cell = master_data_row.insertCell(-1);
|
| - cell.className = "mini-box";
|
| - cell.style.padding = "0px";
|
| - cell.style.verticalAlign = "bottom";
|
| - var builder_name = builders[builder_index].name;
|
| - cell.id = "summaryBox_" + builder_name
|
| - var outcome = builders[builder_index].outcome;
|
| - if (!outcome) {
|
| - outcome = "offline";
|
| - }
|
| - var link = document.createElement("a");
|
| - link.href = master_builder_url + builder_name;
|
| - link.title = builder_name;
|
| - link.target = "_blank";
|
| - link.innerHTML = " ";
|
| - cell.style.width = "10px";
|
| - link.style.width = "100%";
|
| - link.style.height = "100%";
|
| - link.className = outcome;
|
| - link.style.margin = "0px";
|
| - link.style.padding = "0px";
|
| -
|
| - // Decorate the result summary box if there's a comment for the builder.
|
| - if (builder_statuses[builder_name]) {
|
| - cell.className += " BuilderHasComment";
|
| - }
|
| -
|
| - cell.appendChild(link);
|
| - }
|
| - }
|
| -
|
| - // Callback functions for individual masters.
|
| - {% for master in masters %}
|
| - {% if not (not is_internal_view and master['name'] == 'PrivateSkia') %}
|
| - function setLatestBuildsFor{{ master['name'] }}(data) {
|
| - setLatestBuildsForMaster("{{ master['name'] }}",
|
| - "http://{{ master['host'] }}:{{ master['internal_port'] if is_internal_view else master['external_port'] }}/waterfall?show=",
|
| - data['builders']);
|
| - }
|
| - {% endif %}
|
| - {% endfor %}
|
| -
|
| - // Callback function for AutoRoll bot status.
|
| - function gotARBStatus(data) {
|
| - var arb_status_div = document.getElementById("arb_status_div");
|
| - if (arb_status_div) {
|
| - arb_status_div.innerHTML = "AutoRoll Status: " + addLinks(data);
|
| - }
|
| - }
|
| -
|
| - // Load JSON data from various places.
|
| - function loadAllData() {
|
| - // Tree status.
|
| - loadJSONP(tree_status_appspot_url + "/banner-status?format=json",
|
| - setTreeStatus,
|
| - function() {
|
| - setTreeStatus({
|
| - "general_state": "",
|
| - "message": "Failed to load tree status.",
|
| - });
|
| - });
|
| -
|
| - // Current sheriff.
|
| - loadJSONP(tree_status_appspot_url + "/current-sheriff",
|
| - setSheriff,
|
| - function() { setSheriff({"username": "unknown"}); });
|
| -
|
| - // Builder statuses.
|
| - loadJSONP(tree_status_appspot_url + "/builder-status/get_builder_statuses",
|
| - setBuilderStatuses);
|
| -
|
| - // Last build result for each builder on each master.
|
| - var master_json_url = "";
|
| - {% for master in masters %}
|
| - {% if not (not is_internal_view and master['name'] == 'PrivateSkia') %}
|
| - master_json_url = "http://{{ master['host'] }}:{{ master['internal_port'] if is_internal_view else master['external_port'] }}/json/builder_statuses";
|
| - loadJSONP(master_json_url, setLatestBuildsFor{{ master['name'] }});
|
| - {% endif %}
|
| - {% endfor %}
|
| -
|
| - // AutoRoll bot status.
|
| - loadXML("http://chromium-skia-gm.storage.googleapis.com/arb_status.html", gotARBStatus);
|
| -
|
| - // Set the reload timer.
|
| - refreshTimer = setTimeout(reloadPage, refreshInterval);
|
| -
|
| - // Load the console data, if applicable.
|
| - if (typeof loadConsoleData == "function") {
|
| - loadConsoleData();
|
| - }
|
| - }
|
| -
|
| - // Get the comment text for a given builder.
|
| - function buildComment(builder_name, container) {
|
| - var file_bug_link = document.createElement("a");
|
| - file_bug_link.href = "http://code.google.com/p/skia/issues/entry?labels=BreakingTheBuildbots,Type-Defect,Priority-Medium&summary=" + builder_name;
|
| - file_bug_link.target = "_blank";
|
| - file_bug_link.appendChild(document.createTextNode("file bug"));
|
| -
|
| - var edit_status_url = tree_status_appspot_url + "/builder-status/?selected_builder_name=" + builder_name;
|
| - var edit_status_link = document.createElement("a");
|
| - edit_status_link.href = edit_status_url;
|
| - edit_status_link.target = "_blank";
|
| -
|
| - var builder_para = document.createElement("p");
|
| - builder_para.style.fontWeight = "bold";
|
| - builder_para.style.lineHeight = "105%";
|
| - builder_para.appendChild(document.createTextNode(builder_name));
|
| - container.appendChild(builder_para);
|
| -
|
| - var comment_para = document.createElement("p");
|
| -
|
| - var comment = null;
|
| - if (builder_statuses[builder_name]) {
|
| - comment = builder_statuses[builder_name]["message"];
|
| - }
|
| - if (comment) {
|
| - comment_para.appendChild(document.createTextNode(comment));
|
| - comment_para.innerHTML = addLinks(comment_para.innerHTML);
|
| - edit_status_link.appendChild(document.createTextNode("edit"));
|
| - } else {
|
| - edit_status_link.appendChild(document.createTextNode("add comment"));
|
| - }
|
| - container.appendChild(comment_para);
|
| -
|
| - var links_para = document.createElement("p");
|
| - links_para.appendChild(document.createTextNode("("));
|
| - links_para.appendChild(edit_status_link);
|
| - links_para.appendChild(document.createTextNode(" or "));
|
| - links_para.appendChild(file_bug_link);
|
| - links_para.appendChild(document.createTextNode(")"));
|
| - container.appendChild(links_para);
|
| - }
|
| -
|
| - // Display a builder tooltip.
|
| - function showBuilderTooltip(builder_name, event) {
|
| - var tooltipbox = document.getElementById('builderTooltip');
|
| - if (tooltipbox) {
|
| - var cursorPosTop = (window.event ? window.event.clientY : event.pageY)
|
| - var cursorPosLeft = (window.event ? window.event.clientX : event.pageX)
|
| -
|
| - cursorPosTop = cursorPosTop + document.body.scrollTop + 5;
|
| - cursorPosLeft = cursorPosLeft + document.body.scrollLeft;
|
| -
|
| - tooltipbox.innerHTML = "";
|
| - buildComment(builder_name, tooltipbox);
|
| - tooltipbox.style.top = parseInt(cursorPosTop) + 'px';
|
| - tooltipbox.style.left = parseInt(cursorPosLeft) + 'px';
|
| - tooltipbox.style.display = "block";
|
| - }
|
| - }
|
| -
|
| - // Hide the builder tooltip.
|
| - function hideBuilderTooltip(event) {
|
| - var tooltipbox = document.getElementById('builderTooltip');
|
| - if (tooltipbox) {
|
| - // Only hide the tooltip if the mouse is outside the tooltip area.
|
| - var cursorPosTop = (window.event ? window.event.clientY : event.pageY)
|
| - var cursorPosLeft = (window.event ? window.event.clientX : event.pageX)
|
| - cursorPosTop = cursorPosTop + document.body.scrollTop;
|
| - cursorPosLeft = cursorPosLeft + document.body.scrollLeft;
|
| -
|
| - var top = parseInt(tooltipbox.style.top.replace("px", ""));
|
| - var left = parseInt(tooltipbox.style.left.replace("px", ""));
|
| - var bottom = top + parseInt(tooltipbox.offsetHeight);
|
| - var right = left + parseInt(tooltipbox.offsetWidth);
|
| -
|
| - if (cursorPosTop < top - 5 || cursorPosTop > bottom ||
|
| - cursorPosLeft < left || cursorPosLeft > right) {
|
| - tooltipbox.style.display = "none";
|
| - }
|
| - }
|
| - }
|
| -
|
| - // Helper function used by refreshCategories which loops through an array of
|
| - // elements and shows or hides them as indicated.
|
| - function showOrHideElements(elems, shouldDisplay) {
|
| - for (var i = 0; i < elems.length; ++i) {
|
| - elems[i].style.display = shouldDisplay ? "table-cell" : "none";
|
| - }
|
| - }
|
| -
|
| - // Update the display based on the selected set of categories and
|
| - // subcategories.
|
| - function refreshCategories() {
|
| - for (var category in allCategories) {
|
| - // Show or hide each subcategory.
|
| - var colSpan = 0;
|
| - for (var i = 0; i < subcategoriesByCategory[category].length; ++i) {
|
| - var subcategory = subcategoriesByCategory[category][i];
|
| - var className = "category_" + category + "_subcategory_" + subcategory;
|
| - var elemsToChange = document.getElementsByClassName(className);
|
| - // Only display a subcategory if its category is also displaying.
|
| - var shouldDisplay = allCategories[category] && allSubcategories[subcategory]
|
| - showOrHideElements(elemsToChange, shouldDisplay);
|
| - if (shouldDisplay) {
|
| - colSpan++;
|
| - }
|
| - }
|
| -
|
| - // Show or hide the category label.
|
| - var elemsToChange = document.getElementsByClassName("category_" + category);
|
| - var shouldDisplay = allCategories[category] && colSpan > 0;
|
| - showOrHideElements(elemsToChange, shouldDisplay);
|
| -
|
| - // Fix the colSpan of the category header.
|
| - var header = document.getElementById("category_header_" + category);
|
| - if (header) {
|
| - header.colSpan = colSpan;
|
| - }
|
| - }
|
| - }
|
| -
|
| - // Adds the key/value parameter pair to the given URL.
|
| - function appendParamToURL(url, key, value) {
|
| - if (url.indexOf("?") == "-1") {
|
| - url += "?";
|
| - } else {
|
| - url += "&";
|
| - }
|
| - url += key + "=" + value;
|
| - return url;
|
| - }
|
| -
|
| - // Build a URL using the previous URL parameters and the category and
|
| - // subcategory lists.
|
| - function buildURL() {
|
| - var newLocation = location.protocol + "//" + location.host + location.pathname;
|
| - var firstVar = true;
|
| - for (var urlVar in urlVars) {
|
| - if (urlVar != "hideCategories" && urlVar != "hideSubcategories") {
|
| - if (Object.prototype.toString.call(urlVars[urlVar]) == "[object Array]") {
|
| - for (var i = 0; i < urlVars[urlVar].length; ++i) {
|
| - newLocation = appendParamToURL(newLocation, urlVar, urlVars[urlVar][i]);
|
| - }
|
| - } else {
|
| - newLocation = appendParamToURL(newLocation, urlVar, urlVars[urlVar]);
|
| - }
|
| - }
|
| - }
|
| -
|
| - // Add hidden categories to the URL.
|
| - var hiddenCategories = ""
|
| - for (var category in allCategories) {
|
| - if (!allCategories[category]) {
|
| - if (hiddenCategories == "") {
|
| - hiddenCategories = category;
|
| - } else {
|
| - hiddenCategories += "," + category;
|
| - }
|
| - }
|
| - }
|
| - if (hiddenCategories != "") {
|
| - newLocation = appendParamToURL(newLocation, "hideCategories", hiddenCategories);
|
| - }
|
| -
|
| - // Add hidden subcategories to the URL.
|
| - var hiddenSubcategories = ""
|
| - for (var subcategory in allSubcategories) {
|
| - if (!allSubcategories[subcategory]) {
|
| - if (hiddenSubcategories == "") {
|
| - hiddenSubcategories = subcategory;
|
| - } else {
|
| - hiddenSubcategories += "," + subcategory;
|
| - }
|
| - }
|
| - }
|
| - if (hiddenSubcategories != "") {
|
| - newLocation = appendParamToURL(newLocation, "hideSubcategories", hiddenSubcategories);
|
| - }
|
| -
|
| - return newLocation;
|
| - }
|
| -
|
| - // Callback function for when a category or subcategory checkbox is clicked.
|
| - function checkboxClicked(id) {
|
| - var chkbox = document.getElementById(id);
|
| - var toChange = id.substring("chkbox_".length).split("_");
|
| - if (toChange[0] == "category") {
|
| - allCategories[toChange[1]] = chkbox.checked;
|
| - } else if (toChange[0] == "subcategory") {
|
| - allSubcategories[toChange[1]] = chkbox.checked;
|
| - }
|
| - window.history.replaceState("", "Checked box", buildURL());
|
| -
|
| - // Rebuild the console table, if applicable, or fall back on attempting to
|
| - // hide the correct categories and subcategories.
|
| - if (typeof buildConsoleTable == "function") {
|
| - buildConsoleTable();
|
| - } else {
|
| - refreshCategories();
|
| - }
|
| - }
|
| -
|
| - // Callback function to adjust the reload time.
|
| - function setReload(textBox) {
|
| - var regex = /^\d+$/;
|
| - if (regex.test(textBox.value)) {
|
| - refreshInterval = textBox.value * 1000;
|
| - urlVars["reload"] = textBox.value;
|
| - window.history.replaceState("", "Changed refresh", buildURL());
|
| - clearTimeout(refreshTimer);
|
| - refreshTimer = setTimeout(reloadPage, refreshInterval);
|
| - }
|
| - }
|
| - </script>
|
| - {% endblock %}
|
| - </head>
|
| - <body class="interface">
|
| - {% block header -%}
|
| - <div id="skia_header" style="top:5px;">
|
| - <a href="{{ tree_status_baseurl }}" target="_blank" style="text-decoration:inherit;">
|
| - <div id="tree_status_div" width="100%" height="50" class="status-message">
|
| - <span id="tree_status_message"></span>
|
| - <div id="sheriff_div" class="sheriff-message"></div>
|
| - <div id="arb_status_div" class="arb-status"></div>
|
| - </div>
|
| - </a>
|
| - <div id="container" style="float: left; width: 100%;">
|
| - <div style="float:left; width:25%;">
|
| - <form name="unused" action="javascript:void(0);">
|
| - <input type="radio" name="internal_external" value="external" id="radio_external" onClick="setHostAndPort(null, '{{ external_port }}');">External View<br>
|
| - <input type="radio" name="internal_external" value="internal" id="radio_internal" onClick="setHostAndPort(null, '{{ internal_port }}');">Internal View
|
| - <br/><nobr>Refresh (seconds): <input type="text" name="reload_time" value="{{ refresh or default_refresh }}" onChange="setReload(this)" style="width: 50px;" maxlength="4" /></nobr>
|
| - <div>
|
| - {% if master_launch_datetime %}
|
| - <br/>
|
| - master launched at {{ master_launch_datetime.strftime('%Y-%m-%d %H:%M:%S UTC') }}
|
| -
|
| - <br/>
|
| - <span title="master_running_revision: git hash of code at which the buildbot master was launched">
|
| - <u>master_running_revision</u>
|
| - </span> is
|
| - <a href="https://skia.googlesource.com/buildbot.git/+/{{ master_running_revision }}">
|
| - {{ master_running_revision|truncate(8, True, "") }}
|
| - </a>
|
| -
|
| - <br/>
|
| - <span title="master_revision: git hash of code currently checked out on master">
|
| - <u>master_revision</u>
|
| - </span> is
|
| - <a href="https://skia.googlesource.com/buildbot.git/+/{{ master_revision }}">
|
| - {{ master_revision|truncate(8, True, "") }}
|
| - </a>
|
| - {% endif %}
|
| - </div>
|
| - </form>
|
| - </div>
|
| -
|
| - <div id="links" style="float:right; width:25%;">
|
| - <div style="float:right; width: 195px;"><ul style="margin: 0px 0px 0px 25px; padding:0;"><li><a href="https://sites.google.com/site/skiadocs/developer-documentation/the-skia-buildbots/1-overview" target="_blank">Full Skia documentation</a><br/></li></ul></div>
|
| - <div style="float:right; width: 195px;"><ul style="margin: 0px 0px 0px 25px; padding:0;"><li><a href="{{ tree_status_baseurl }}" target="_blank">Skia Tree Status Manager</a><br/></li></ul></div>
|
| - <div style="float:right; width: 195px;"><ul style="margin: 0px 0px 0px 25px; padding:0;"><li><a href="https://code.google.com/p/skia/issues/list?can=2&q=label%3ABreakingTheBuildbots" target="_blank">Current build-breaking bugs</a><br/></li></ul></div>
|
| - <div style="float:right; width: 195px;"><ul style="margin: 0px 0px 0px 25px; padding:0;"><li><a href="http://skiaperf.com" target="_blank">Perf Dashboard</a><br/></li></ul></div>
|
| - <div style="float:right; width: 195px;"><ul style="margin: 0px 0px 0px 25px; padding:0;"><li><a href="bug_graphs.html" target="_blank">Open Bugs Graph</a><br/></li></ul></div>
|
| - <div style="float:right; width: 195px;"><ul style="margin: 0px 0px 0px 25px; padding:0;"><li><a href="https://storage.cloud.google.com/chromium-skia-gm/static_analyzers/clang_static_analyzer/index.html" target="_blank">Clang Static Analyzer</a><br/></li></ul></div>
|
| - <div style="float:right; width: 195px;"><ul style="margin: 0px 0px 0px 25px; padding:0;"><li><a href="buildbots_self_analysis.html" target="_blank">Buildbot Self-Dashboard</a><br/></li></ul></div>
|
| - <div style="float:right; width: 195px;"><ul style="margin: 0px 0px 0px 25px; padding:0;"><li><a href="buildslave_idle.html" target="_blank">Buildslave Idle Time Analysis</a><br/></li></ul></div>
|
| - <div style="float:right; width: 195px;"><ul style="margin: 0px 0px 0px 25px; padding:0;"><li><a href="https://skia-tree-status.appspot.com/sheriff" target="_blank">Sheriff Schedule</a><br/></li></ul></div>
|
| - <div style="float:right; width: 195px;"><ul style="margin: 0px 0px 0px 25px; padding:0;"><li><a href="https://skia-tree-status.appspot.com/skia-telemetry/lua_script" target="_blank">Run Lua Scripts on SKP Repo</a><br/></li></ul></div>
|
| - <div style="float:right; width: 195px;"><ul style="margin: 0px 0px 0px 25px; padding:0;"><li><a href="https://skia-tree-status.appspot.com/skia-telemetry/skia_try" target="_blank">Run Patches on SKP Repo</a><br/></li></ul></div>
|
| - <div style="float:right; width: 195px;"><ul style="margin: 0px 0px 0px 25px; padding:0;"><li><a href="http://skia-tree-status.appspot.com/redirect/rebaseline-server/static/view.html#/view.html?resultsToLoad=/results/failures" target="_blank">Recent GM Failures</a><br/></li></ul></div>
|
| - <div style="float:right; width: 195px;"><ul style="margin: 0px 0px 0px 25px; padding:0;"><li><a href="http://chromium-skia-gm.commondatastorage.googleapis.com/depsroll.html" target="_blank">Current DEPS roll attempt</a><br/></li></ul></div>
|
| - <div style="float:right; width: 195px;"><ul style="margin: 0px 0px 0px 25px; padding:0;"><li><a href="https://codereview.chromium.org/search?closed=3&project=skia&private=1&commit=2&limit=30" target="_blank">Commit Queue</a><br/></li></ul></div>
|
| - </div>
|
| -
|
| - <div style="text-align:center; width: 50%; margin-left: 25%; margin-right: 25%">
|
| - <div id="heading" style="font-size:3.5em; text-align:center;">Skia Buildbots ({{ active_master_name }})</div>
|
| - <div>
|
| - <p>
|
| - Skia Build Masters:
|
| - <table>
|
| - <tr id="results_summary_client_skia">
|
| - <td style="text-align: right"><a href="http://build.chromium.org/p/client.skia/console">client.skia</a></td>
|
| - <td colspan="1000"><iframe width="100%" height="20" frameborder="0" scrolling="no" src="http://build.chromium.org/p/client.skia/horizontal_one_box_per_builder"></iframe></td>
|
| - </tr>
|
| - {% for master in masters %}
|
| - {% if not (not is_internal_view and master['name'] == 'PrivateSkia') %}
|
| - <tr id="results_summary_{{ master['name'] }}">
|
| - <td style="text-align: right"><a href="http://{{ master['host'] }}:{{ master['internal_port'] if is_internal_view else master['external_port'] }}/console">{{ master['name'] }}</a></td>
|
| - </tr>
|
| - {% endif %}
|
| - {% endfor %}
|
| - </table>
|
| - </div>
|
| - </p>
|
| - </div>
|
| - </div>
|
| -
|
| - <div class="header">
|
| - <a href="{{ path_to_root or '.' }}">Home</a> -
|
| - <a href="{{ path_to_root }}waterfall">Waterfall</a>
|
| - <a href="{{ path_to_root }}console">Console</a>
|
| - <a href="{{ path_to_root }}builders">Builders</a>
|
| - <a href="{{ path_to_root }}buildslaves">Buildslaves</a> -
|
| - <a href="{{ path_to_root }}failures">Currently Failing</a> -
|
| - <a href="{{ path_to_root }}trybots">Trybot Waterfall</a> -
|
| - <a href="{{ path_to_root }}json/help">JSON API</a> -
|
| - <a href="{{ path_to_root }}about">About</a>
|
| - </div>
|
| - </div>
|
| - {% endblock %}
|
| -
|
| - {%- block barecontent -%}
|
| -
|
| - <div class="content">
|
| - {%- block content -%}
|
| - {%- endblock -%}
|
| - </div>
|
| - {%- endblock -%}
|
| -
|
| - {%- block footer -%}
|
| - <div class="footer" style="clear:both">
|
| - <hr/>
|
| - <a href="http://buildbot.net/">BuildBot</a> ({{version}})
|
| - {% if title -%}
|
| - working for the
|
| - {%- if title_url -%}
|
| - <a href="{{ title_url }}">{{ title }}</a>
|
| - {%- else -%}
|
| - {{ title }}
|
| - {%- endif -%}
|
| - project.
|
| - {%- endif -%}
|
| - <br/>
|
| - Page built: <b>{{ time }}</b> ({{ tz }})
|
| - </div>
|
| - {% endblock -%}
|
| - <div id="builderTooltip" class="BuilderTooltip RoundedRect" style="display: none;" onmouseout="hideBuilderTooltip(event)"></div>
|
| - <script language="JavaScript">
|
| - init();
|
| - </script>
|
| - </body>
|
| -</html>
|
|
|