'use strict';
$(document).ready(function() {
/* Cached contents of downloaded regressions.json */
var regression_data = null;
/* Current page title */
var current_title = "All regressions";
/* Whether HTML5 local storage is available */
var local_storage_available = false;
/* Key prefix for ignored regressions. For each ignored regression,
a key "ignore_key_prefix + md5(benchmark_name + date_a + date_b)"
is added to HTML5 local storage.
*/
var ignore_key_prefix = null;
/* Set of ignored regressions, same information as in HTML5 local storage.
Useful if local storage runs out of space. */
var ignored_regressions = {};
/* Whether to force reload on next page update */
var skip_reload = false;
function load_data(params) {
$("#title").text(current_title);
if (typeof(Storage) !== "undefined") {
/* html5 local storage available */
local_storage_available = true;
}
if (regression_data !== null) {
// already displayed
if (!skip_reload) {
var main_div = display_data(regression_data, params);
$('#regressions-body').empty();
$('#regressions-body').append(main_div);
}
skip_reload = false;
}
else {
var message = $('
Loading...
');
skip_reload = false;
$('#regressions-body').append(message);
$.ajax({
url: 'regressions.json' + '?timestamp=' + $.asv.main_timestamp,
dataType: "json",
cache: true
}).done(function (data) {
regression_data = data;
var main_div = display_data(data, params);
$('#regressions-body').empty();
$('#regressions-body').append(main_div);
});
}
}
function update_url(params, reload) {
var info = $.asv.parse_hash_string(window.location.hash);
$.each(params || {}, function(key, value) {
info.params[key] = value;
});
var new_hash = $.asv.format_hash_string(info);
if (new_hash != window.location.hash) {
if (reload === undefined) {
skip_reload = false;
}
else {
skip_reload = !reload;
}
window.location.hash = new_hash;
}
else {
skip_reload = false;
}
}
function display_data(data, params) {
var main_div = $('');
var branches = $.asv.main_json.params['branch'];
var all_ignored_keys = {};
ignore_key_prefix = 'asv-r-' + $.asv.main_json.project;
if (branches && branches.length > 1) {
/* Add a branch selector */
var dropdown_menu = $('
');
var dropdown_div = $('
');
dropdown_div.append($(''));
dropdown_div.append(dropdown_menu);
main_div.append(dropdown_div);
}
var feed_div = $('
');
var date_fmt = new Date($.asv.main_json.revision_to_date[jumps[jumps.length-1][1]]);
date_td.text($.asv.format_date_yyyymmdd_hhmm(date_fmt));
row.append(date_td);
row.append(commit_td);
var factor_td = $('
');
row.append(factor_td);
var factor = last_value / best_value;
factor_td.text(factor.toFixed(2) + 'x');
var best_td = $('
');
best_td.text($.asv.pretty_unit(best_value, benchmark.unit));
row.append(best_td);
var last_td = $('
');
last_td.text($.asv.pretty_unit(last_value, benchmark.unit));
row.append(last_td);
table_body.append(row);
});
display_table.append(table_body);
setup_sort(params, display_table);
}
function get_ignore_key(item, revs) {
var benchmark_name = item[0];
var ignore_payload = benchmark_name;
if (revs[0] === null) {
ignore_payload = ignore_payload + ',';
}
else {
ignore_payload = (ignore_payload + ','
+ $.asv.main_json.revision_to_hash[revs[0]]);
}
ignore_payload = (ignore_payload + ','
+ $.asv.main_json.revision_to_hash[revs[1]]);
return ignore_key_prefix + md5(ignore_payload);
}
function is_key_ignored(ignore_key) {
if (local_storage_available) {
return (ignore_key in localStorage) || (ignore_key in ignored_regressions);
}
else {
return (ignore_key in ignored_regressions);
}
}
function set_key_ignore_status(ignore_key, is_ignored) {
if (is_ignored) {
if (local_storage_available) {
try {
localStorage[ignore_key] = 1;
} catch (err) {
/* Out of quota -- we're just going to ignore that */
}
}
ignored_regressions[ignore_key] = 1;
}
else {
if (local_storage_available) {
delete localStorage[ignore_key];
}
delete ignored_regressions[ignore_key];
}
}
function update_ignore_conf_sample(data, ignored_conf_sample_div, branch) {
var regressions = data['regressions'];
var entries = {};
var branch_suffix = "";
if (branch) {
branch_suffix = "@" + branch;
}
$.each(regressions, function (i, item) {
var param_dict = item[2];
if (branch !== null && param_dict['branch'] != branch) {
return;
}
$.each(item[6], function (i, revs) {
var ignore_key = get_ignore_key(item, revs);
if (is_key_ignored(ignore_key)) {
var benchmark_name = item[0];
var benchmark_name_re = (benchmark_name + branch_suffix).replace(/[.?*+^$[\]\\(){}|-]/g, "\\\\$&");
var commit = $.asv.get_commit_hash(revs[1]);
var entry = " \"^" + benchmark_name_re + "$\": \"" + commit + "\",\n";
entries[entry] = 1;
}
});
});
entries = Object.keys(entries);
entries.sort();
var text = "// asv.conf.json excerpt for ignoring the above permanently\n\n";
text += " \"regressions_first_commits\": {\n";
$.each(entries, function (i, entry) {
text += entry;
});
text += " }";
var pre = $('');
pre.text(text);
ignored_conf_sample_div.empty();
ignored_conf_sample_div.append(pre);
}
function setup_sort(params, table) {
table.stupidtable({
'value': function(a, b) {
function key(s) {
for (var k = 0; k < $.asv.time_units.length; ++k) {
var entry = $.asv.time_units[k];
var m = s.match('^([0-9.]+)'+entry[0]+'$');
if (m) {
return parseFloat(m[1]) * entry[2] * 1e-30;
}
}
return 0;
}
return key(a) - key(b)
},
'factor': function(a, b) {
return parseFloat(a.replace(/x/, '')) - parseFloat(b.replace(/x/, ''));
}
});
table.on('aftertablesort', function (event, data) {
update_url({'sort': [data.column], 'dir': [data.direction]}, false);
/* Update appearance */
table.find('thead th').removeClass('asc');
table.find('thead th').removeClass('desc');
var th_to_sort = table.find("thead th").eq(parseInt(data.column));
if (th_to_sort) {
th_to_sort.addClass(data.direction);
}
});
if (params.sort && params.dir) {
var th_to_sort = table.find("thead th").eq(parseInt(params.sort[0]));
th_to_sort.stupidsort(params.dir[0]);
}
else {
var th_to_sort = table.find("thead th").eq(3);
th_to_sort.stupidsort("desc");
}
}
/*
Setup display hooks
*/
$.asv.register_page('regressions', function(params) {
$('#regressions-display').show()
load_data(params);
});
});