2012-07-09 20:48:27 +00:00
|
|
|
var id = 1;
|
|
|
|
|
2012-07-10 15:06:18 +00:00
|
|
|
// Extract query parameters
|
|
|
|
var params = function(query) {
|
|
|
|
var search = /([^&=]+)=?([^&]*)/g,
|
|
|
|
pl = /\+/g,
|
|
|
|
decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); },
|
|
|
|
ret = {};
|
2012-07-09 20:48:27 +00:00
|
|
|
|
2012-07-10 15:06:18 +00:00
|
|
|
while (match = search.exec(query))
|
|
|
|
{
|
|
|
|
ret[decode(match[1])] = decode(match[2]);
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}(document.location.search.substring(1));
|
|
|
|
|
2012-07-11 12:04:38 +00:00
|
|
|
var settings = {
|
|
|
|
wrap: true,
|
|
|
|
tab_width: 4,
|
2013-03-02 13:33:20 +00:00
|
|
|
debug: false,
|
2012-07-11 12:04:38 +00:00
|
|
|
};
|
2012-07-10 15:06:18 +00:00
|
|
|
|
2012-07-11 12:04:38 +00:00
|
|
|
if ('settings' in params)
|
|
|
|
{
|
|
|
|
settings = $.merge(settings, JSON.parse(params.setttings));
|
|
|
|
}
|
2012-07-10 15:06:18 +00:00
|
|
|
|
2012-07-11 12:04:38 +00:00
|
|
|
var templates = {};
|
|
|
|
|
|
|
|
function create_template(name, bindmap)
|
2012-07-10 15:06:18 +00:00
|
|
|
{
|
2012-07-11 12:04:38 +00:00
|
|
|
templ = $('#templates').children('.' + name);
|
2012-07-10 15:06:18 +00:00
|
|
|
|
2012-07-11 12:04:38 +00:00
|
|
|
if (templ.length != 1)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
templ = $(templ[0]);
|
|
|
|
|
|
|
|
props = [];
|
|
|
|
|
|
|
|
$.each(bindmap, function (key, callback) {
|
|
|
|
props.push({
|
2012-10-16 18:26:50 +00:00
|
|
|
selector: key,
|
2012-07-11 12:04:38 +00:00
|
|
|
callback: callback
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
templates[name] = {
|
|
|
|
template: templ,
|
|
|
|
props: props,
|
|
|
|
execute: function (context) {
|
2012-10-16 18:26:50 +00:00
|
|
|
var ret = this.template.clone();
|
|
|
|
|
2012-07-11 12:04:38 +00:00
|
|
|
$.each(this.props, function (i, val) {
|
2012-10-16 18:26:50 +00:00
|
|
|
ret.find(val.selector).each(function (i, e) {
|
2012-07-11 12:04:38 +00:00
|
|
|
var ee = $(e);
|
|
|
|
|
|
|
|
retval = val.callback.call(context, ee);
|
|
|
|
|
|
|
|
if (typeof(retval) == 'undefined')
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-07-12 12:07:28 +00:00
|
|
|
if (retval.nodeType || retval.jquery)
|
|
|
|
{
|
|
|
|
ee.replace(retval);
|
|
|
|
}
|
|
|
|
|
2012-07-11 12:04:38 +00:00
|
|
|
if (typeof(retval) == 'string')
|
|
|
|
{
|
|
|
|
ee.text(retval);
|
|
|
|
}
|
|
|
|
else if ('text' in retval)
|
|
|
|
{
|
|
|
|
ee.text(retval.text);
|
|
|
|
}
|
|
|
|
else if ('html' in retval)
|
|
|
|
{
|
|
|
|
ee.html(retval.html);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2012-10-16 18:26:50 +00:00
|
|
|
return ret;
|
2012-07-10 15:06:18 +00:00
|
|
|
}
|
2012-07-11 12:04:38 +00:00
|
|
|
};
|
2012-07-10 15:06:18 +00:00
|
|
|
|
2012-07-11 12:04:38 +00:00
|
|
|
return templates[name];
|
|
|
|
}
|
|
|
|
|
|
|
|
function run_template(name, context)
|
|
|
|
{
|
|
|
|
return templates[name].execute(context);
|
2012-07-10 15:06:18 +00:00
|
|
|
}
|
|
|
|
|
2012-10-29 15:58:23 +00:00
|
|
|
var escapeDiv = document.createElement('div');
|
|
|
|
var escapeElement = document.createTextNode('');
|
|
|
|
escapeDiv.appendChild(escapeElement);
|
|
|
|
|
|
|
|
function html_escape(str)
|
|
|
|
{
|
|
|
|
escapeElement.data = str;
|
|
|
|
return escapeDiv.innerHTML;
|
|
|
|
}
|
|
|
|
|
2012-10-30 21:21:41 +00:00
|
|
|
|
|
|
|
function write_commit(commit)
|
2012-07-10 15:06:18 +00:00
|
|
|
{
|
2012-10-30 21:21:41 +00:00
|
|
|
return run_template('commit', commit);
|
|
|
|
}
|
2012-10-29 15:58:23 +00:00
|
|
|
|
2012-10-30 21:21:41 +00:00
|
|
|
var html_builder_worker = 0;
|
|
|
|
var html_builder_tick = 0;
|
2012-07-10 15:06:18 +00:00
|
|
|
|
2013-03-01 23:33:29 +00:00
|
|
|
function update_diff(id)
|
2012-10-30 21:21:41 +00:00
|
|
|
{
|
|
|
|
if (html_builder_worker)
|
2012-07-10 15:06:18 +00:00
|
|
|
{
|
2012-10-30 21:21:41 +00:00
|
|
|
html_builder_worker.terminate();
|
|
|
|
}
|
|
|
|
|
2013-03-02 13:33:20 +00:00
|
|
|
workeruri = 'diff-view-html-builder.js';
|
|
|
|
|
|
|
|
if (settings.debug)
|
|
|
|
{
|
|
|
|
var t = (new Date()).getTime();
|
|
|
|
workeruri += '?t' + t;
|
|
|
|
}
|
|
|
|
|
|
|
|
html_builder_worker = new Worker(workeruri);
|
2012-10-30 21:21:41 +00:00
|
|
|
html_builder_tick = 0;
|
|
|
|
|
|
|
|
var content = document.getElementById('diff_content');
|
2012-07-11 12:04:38 +00:00
|
|
|
|
2012-10-30 21:21:41 +00:00
|
|
|
html_builder_progress_timeout = setTimeout(function (){
|
|
|
|
var eta = 200 / html_builder_tick - 200;
|
2012-07-11 12:04:38 +00:00
|
|
|
|
2012-10-30 21:21:41 +00:00
|
|
|
if (eta > 1000)
|
2012-07-11 12:04:38 +00:00
|
|
|
{
|
2012-10-30 21:21:41 +00:00
|
|
|
// Show the progress
|
|
|
|
content.innerHTML = '<div class="loading">Loading diff...</div>.';
|
2012-07-11 12:04:38 +00:00
|
|
|
}
|
|
|
|
|
2012-10-30 21:21:41 +00:00
|
|
|
html_builder_progress_timeout = 0;
|
|
|
|
}, 200);
|
2012-07-10 15:06:18 +00:00
|
|
|
|
2012-10-30 21:21:41 +00:00
|
|
|
html_builder_worker.onmessage = function (event) {
|
|
|
|
if (event.data.log)
|
2012-07-10 15:06:18 +00:00
|
|
|
{
|
2012-10-30 21:21:41 +00:00
|
|
|
console.log(event.data.log);
|
|
|
|
}
|
|
|
|
else if (event.data.tick)
|
|
|
|
{
|
|
|
|
html_builder_tick = event.data.tick;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
html_builder_worker.terminate();
|
|
|
|
html_builder_worker = 0;
|
2012-07-10 15:06:18 +00:00
|
|
|
|
2012-10-30 21:21:41 +00:00
|
|
|
if (html_builder_progress_timeout)
|
2012-07-10 15:06:18 +00:00
|
|
|
{
|
2012-10-30 21:21:41 +00:00
|
|
|
clearTimeout(html_builder_progress_timeout);
|
|
|
|
html_builder_progress_timeout = 0;
|
2012-07-10 15:06:18 +00:00
|
|
|
}
|
|
|
|
|
2012-10-30 21:21:41 +00:00
|
|
|
content.innerHTML = event.data.diff_html;
|
2012-07-10 15:06:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-10-30 21:21:41 +00:00
|
|
|
var t = (new Date()).getTime();
|
2012-10-29 15:58:23 +00:00
|
|
|
|
2013-03-02 13:33:41 +00:00
|
|
|
var file_template = $('#templates div.file')[0].outerHTML;
|
2012-07-10 15:06:18 +00:00
|
|
|
|
2012-10-30 21:21:41 +00:00
|
|
|
// Load the diff asynchronously
|
|
|
|
html_builder_worker.postMessage({
|
2013-03-01 23:33:29 +00:00
|
|
|
url: "gitg-diff:/diff/?t=" + t + "&viewid=" + params.viewid + "&diffid=" + id + "&format=diff_only",
|
2012-10-30 21:21:41 +00:00
|
|
|
settings: settings,
|
2013-03-02 13:33:41 +00:00
|
|
|
file_template: file_template,
|
2012-10-30 21:21:41 +00:00
|
|
|
});
|
2012-07-11 12:04:38 +00:00
|
|
|
|
2012-10-30 21:21:41 +00:00
|
|
|
// Load the commit directly here
|
2012-07-09 20:48:27 +00:00
|
|
|
var r = new XMLHttpRequest();
|
|
|
|
|
2012-07-10 15:06:18 +00:00
|
|
|
r.onload = function(e) {
|
2012-10-29 15:58:23 +00:00
|
|
|
var j = JSON.parse(r.responseText);
|
2012-07-10 15:06:18 +00:00
|
|
|
|
2012-07-11 06:44:23 +00:00
|
|
|
if ('commit' in j)
|
|
|
|
{
|
2012-10-29 15:58:23 +00:00
|
|
|
$('#diff_header').html(write_commit(j.commit));
|
2012-07-11 06:44:23 +00:00
|
|
|
}
|
2012-07-09 20:48:27 +00:00
|
|
|
}
|
|
|
|
|
2012-10-30 21:21:41 +00:00
|
|
|
t = (new Date()).getTime();
|
2013-03-01 23:33:29 +00:00
|
|
|
r.open("GET", "gitg-diff:/diff/?t=" + t + "&viewid=" + params.viewid + "&diffid=" + id + "&format=commit_only");
|
2012-07-09 20:48:27 +00:00
|
|
|
r.send();
|
|
|
|
}
|
2012-07-11 12:04:38 +00:00
|
|
|
|
2012-07-12 12:07:28 +00:00
|
|
|
addEventListener('DOMContentLoaded', function () {
|
2012-07-11 12:04:38 +00:00
|
|
|
create_template("commit", {
|
2012-07-12 12:07:28 +00:00
|
|
|
'.author': function () {
|
|
|
|
var name = $('<span/>', {'class': 'author name'}).text(this.author.name);
|
|
|
|
var a = $('<a/>', {href: this.author.email}).text(this.author.email);
|
|
|
|
|
|
|
|
return {html: $('<span/>').append(name).append(' <').append(a).append('>')};
|
|
|
|
},
|
2012-07-11 12:04:38 +00:00
|
|
|
'.date': function () {
|
2013-04-23 06:34:38 +00:00
|
|
|
return {text: this.author.time};
|
2012-07-12 12:07:28 +00:00
|
|
|
},
|
|
|
|
'.subject': function () {
|
|
|
|
return this.subject;
|
|
|
|
},
|
|
|
|
'.message': function () {
|
|
|
|
return this.message;
|
|
|
|
},
|
|
|
|
'.sha1': function () {
|
|
|
|
return this.id;
|
2012-07-11 12:04:38 +00:00
|
|
|
},
|
|
|
|
'.avatar': function (e) {
|
|
|
|
var h = this.author.email_md5;
|
|
|
|
|
2012-10-16 18:27:02 +00:00
|
|
|
var loader = $('<img/>');
|
2012-07-12 12:07:28 +00:00
|
|
|
|
2012-10-16 18:27:02 +00:00
|
|
|
loader.on('error', function () {
|
|
|
|
var robosrc = 'http://robohash.org/' + h + '.png?size=50x50';
|
|
|
|
|
|
|
|
e.attr('src', robosrc);
|
|
|
|
});
|
|
|
|
|
|
|
|
var gravatar = 'http://www.gravatar.com/avatar/' + h + '?d=404&s=50';
|
|
|
|
|
|
|
|
loader.on('load', function () {
|
|
|
|
e.attr('src', gravatar);
|
|
|
|
});
|
|
|
|
|
|
|
|
loader.attr('src', gravatar);
|
2012-07-11 12:04:38 +00:00
|
|
|
},
|
|
|
|
});
|
|
|
|
}, false);
|
|
|
|
|
|
|
|
// vi:ts=4
|