dolt 0.29.0 → 0.30.0
Sign up to get free protection for your applications and to get access to all the features.
- data/dolt.gemspec +1 -1
- data/lib/dolt/sinatra/multi_repo_browser.rb +11 -31
- data/lib/dolt/sinatra/repo_browser.rb +47 -0
- data/lib/dolt/sinatra/single_repo_browser.rb +15 -29
- metadata +4 -75
- data/vendor/ui/.gitignore +0 -4
- data/vendor/ui/.gitmodules +0 -39
- data/vendor/ui/Makefile +0 -48
- data/vendor/ui/autolint.js +0 -13
- data/vendor/ui/buster.js +0 -31
- data/vendor/ui/css/gitorious.css +0 -660
- data/vendor/ui/css/syntax-highlight.css +0 -140
- data/vendor/ui/dist/gitorious3-capillary.min.js +0 -12
- data/vendor/ui/dist/gitorious3.min.css +0 -1
- data/vendor/ui/dist/gitorious3.min.js +0 -3
- data/vendor/ui/favicon.ico +0 -0
- data/vendor/ui/iconic/lock_stroke.svg +0 -17
- data/vendor/ui/images/f5f5f5-980x1.png +0 -0
- data/vendor/ui/images/gitorious.png +0 -0
- data/vendor/ui/images/gitorious2013.png +0 -0
- data/vendor/ui/images/powered-by.png +0 -0
- data/vendor/ui/images/white-980x1.png +0 -0
- data/vendor/ui/js/src/app.js +0 -20
- data/vendor/ui/js/src/cache.js +0 -27
- data/vendor/ui/js/src/capillary.js +0 -7
- data/vendor/ui/js/src/components/abbrev.js +0 -24
- data/vendor/ui/js/src/components/blob.js +0 -154
- data/vendor/ui/js/src/components/capillary.js +0 -51
- data/vendor/ui/js/src/components/clone-name-suggestion.js +0 -38
- data/vendor/ui/js/src/components/clone-url-selection.js +0 -35
- data/vendor/ui/js/src/components/collapse.js +0 -17
- data/vendor/ui/js/src/components/comments.js +0 -111
- data/vendor/ui/js/src/components/commit-linker.js +0 -26
- data/vendor/ui/js/src/components/dropdown.js +0 -74
- data/vendor/ui/js/src/components/ganalytics.js +0 -19
- data/vendor/ui/js/src/components/live-markdown-preview.js +0 -35
- data/vendor/ui/js/src/components/loading.js +0 -33
- data/vendor/ui/js/src/components/oid-ref-interpolator.js +0 -9
- data/vendor/ui/js/src/components/profile-menu.js +0 -36
- data/vendor/ui/js/src/components/rails-links.js +0 -24
- data/vendor/ui/js/src/components/ref-selector.js +0 -116
- data/vendor/ui/js/src/components/repository.js +0 -162
- data/vendor/ui/js/src/components/select-details.js +0 -20
- data/vendor/ui/js/src/components/slugify.js +0 -32
- data/vendor/ui/js/src/components/timeago.js +0 -38
- data/vendor/ui/js/src/components/tree-history.js +0 -140
- data/vendor/ui/js/src/components/url.js +0 -65
- data/vendor/ui/js/src/components/user-repo-view-state.js +0 -4
- data/vendor/ui/js/src/gitorious.js +0 -171
- data/vendor/ui/js/src/json-request.js +0 -6
- data/vendor/ui/js/src/logger.js +0 -84
- data/vendor/ui/js/src/spacer.js +0 -5
- data/vendor/ui/js/test-libs/jquery-1.9.1.min.js +0 -5
- data/vendor/ui/js/test/cache-test.js +0 -47
- data/vendor/ui/js/test/components/abbrev-test.js +0 -22
- data/vendor/ui/js/test/components/blob-test.js +0 -90
- data/vendor/ui/js/test/components/clone-name-suggestion-test.js +0 -37
- data/vendor/ui/js/test/components/clone-url-selection-test.js +0 -25
- data/vendor/ui/js/test/components/comments-test.js +0 -139
- data/vendor/ui/js/test/components/commit-linker-test.js +0 -46
- data/vendor/ui/js/test/components/live-markdown-preview-test.js +0 -37
- data/vendor/ui/js/test/components/profile-menu-test.js +0 -46
- data/vendor/ui/js/test/components/ref-selector-test.js +0 -140
- data/vendor/ui/js/test/components/repository-admin-test.js +0 -37
- data/vendor/ui/js/test/components/repository-watching-test.js +0 -74
- data/vendor/ui/js/test/components/timeago-test.js +0 -74
- data/vendor/ui/js/test/components/tree-history-test.js +0 -324
- data/vendor/ui/js/test/components/url-template-test.js +0 -65
- data/vendor/ui/js/test/test-helper.js +0 -2
- data/vendor/ui/lib/bootstrap/css/bootstrap-responsive.min.css +0 -9
- data/vendor/ui/lib/bootstrap/css/bootstrap.min.css +0 -9
- data/vendor/ui/lib/bootstrap/img/glyphicons-halflings-white.png +0 -0
- data/vendor/ui/lib/bootstrap/img/glyphicons-halflings.png +0 -0
- data/vendor/ui/lib/bootstrap/js/bootstrap.min.js +0 -6
- data/vendor/ui/package.json +0 -21
- data/vendor/ui/todo.org +0 -4
@@ -1,24 +0,0 @@
|
|
1
|
-
/*global dome*/
|
2
|
-
this.gts = this.gts || {};
|
3
|
-
|
4
|
-
this.gts.railsLinks = function (csrfParam, csrfToken) {
|
5
|
-
dome.on(document.body, "click", function (e) {
|
6
|
-
var method = dome.data.get("method", e.target);
|
7
|
-
if (!method || method === "get") { return true; }
|
8
|
-
e.preventDefault();
|
9
|
-
e.stopPropagation();
|
10
|
-
var href = e.target.href;
|
11
|
-
|
12
|
-
var form = dome.el("form", {
|
13
|
-
method: "post",
|
14
|
-
action: href,
|
15
|
-
style: { display: "none" }
|
16
|
-
}, [
|
17
|
-
dome.el("input", { name: "_method", value: method, type: "hidden" }),
|
18
|
-
dome.el("input", { name: csrfParam, value: csrfToken, type: "hidden" })
|
19
|
-
]);
|
20
|
-
|
21
|
-
document.body.appendChild(form);
|
22
|
-
form.submit();
|
23
|
-
});
|
24
|
-
};
|
@@ -1,116 +0,0 @@
|
|
1
|
-
/*global cull, dome*/
|
2
|
-
// The global, shared Gitorious namespace
|
3
|
-
this.gts = this.gts || {};
|
4
|
-
|
5
|
-
/**
|
6
|
-
* The ref selector builds an interactive "drop-down" menu from which the
|
7
|
-
* user can select a head or tag, or lookup a specific ref. The menu will
|
8
|
-
* reload the current page for the chosen ref.
|
9
|
-
*
|
10
|
-
* gts.refSelector(refs, current, urlTemplate)
|
11
|
-
*
|
12
|
-
* refs is an object containing available heads and tags and the oids they
|
13
|
-
* refer to, e.g.:
|
14
|
-
*
|
15
|
-
* { "heads": [["production", "24e9c0d4ce36fbe1dfca4029e3bd206d64e2eecc"],
|
16
|
-
* ["redesign", "4c22773401aa2cdd2391bc04443ad7eea193e7b6"],
|
17
|
-
* ["web-hooks", "a08053012b9aee5d9733fceb2cf3083f29d9aa7d"],
|
18
|
-
* ["master", "48ac677757da7ca052c59ebec0ded6e11eef2642"]],
|
19
|
-
* "tags": [["v2.4.3", "7a3cffcb3c3db89e8005962850e29a8aab2ab09b"]]
|
20
|
-
*
|
21
|
-
* current is the active ref on the current page, either the refname
|
22
|
-
* or the actual oid.
|
23
|
-
*
|
24
|
-
* urlTemplate is the URL that will be loaded, where the ref exists as a
|
25
|
-
* placeholder, e.g. "/gitorious/mainline/source/#{ref}:lib". A suitable
|
26
|
-
* template can be created from the current page's URL using
|
27
|
-
* gts.url.templatize(window.location.href, { ref: currentRef });
|
28
|
-
*/
|
29
|
-
this.gts.refSelector = (function (e) {
|
30
|
-
function tpl(template, ref) {
|
31
|
-
return (template || "#{ref}").replace(/#\{ref\}/g, ref);
|
32
|
-
}
|
33
|
-
|
34
|
-
/**
|
35
|
-
* Gets the current ref. type is {heads,tags,remotes} and
|
36
|
-
* refs[type] is an array of ref tuples where each tuple contains
|
37
|
-
* the object id and a ref (e.g. "master").
|
38
|
-
*/
|
39
|
-
function getCurrent(type, refName, refs) {
|
40
|
-
return cull.select(function (ref) {
|
41
|
-
return ref[0] === refName || ref[1] === refName;
|
42
|
-
}, refs[type] || [])[0];
|
43
|
-
}
|
44
|
-
|
45
|
-
function currentRefLink(refs, current) {
|
46
|
-
var currentRef = getCurrent("heads", current, refs);
|
47
|
-
var type = "branch";
|
48
|
-
|
49
|
-
if (!currentRef) {
|
50
|
-
currentRef = getCurrent("tags", current, refs);
|
51
|
-
type = "tag";
|
52
|
-
}
|
53
|
-
|
54
|
-
if (!currentRef) {
|
55
|
-
type = "ref";
|
56
|
-
}
|
57
|
-
|
58
|
-
return e.a({
|
59
|
-
href: "#",
|
60
|
-
className: "dropdown-toggle",
|
61
|
-
innerHTML: "<span class=\"caret\"></span> <em>" +
|
62
|
-
type + ":</em> " + ((currentRef && currentRef[0]) || current)
|
63
|
-
});
|
64
|
-
}
|
65
|
-
|
66
|
-
function refInput(url) {
|
67
|
-
var input = e.input({ type: "text", className: "gts-ref-input" });
|
68
|
-
var form = e.form({
|
69
|
-
className: "gts-ref-input",
|
70
|
-
events: {
|
71
|
-
submit: function (e) {
|
72
|
-
e.preventDefault();
|
73
|
-
window.location = tpl(url, input.value);
|
74
|
-
}
|
75
|
-
}
|
76
|
-
}, [input]);
|
77
|
-
|
78
|
-
return e.li({
|
79
|
-
className: "gts-dropdown-input",
|
80
|
-
events: { click: function (e) { e.stopPropagation(); } }
|
81
|
-
}, [e.strong(["Enter ref: ", form])]);
|
82
|
-
}
|
83
|
-
|
84
|
-
function refItems(label, refs, urlTemplate) {
|
85
|
-
var initial = [e.li({className: "dropdown-label"}, [e.strong(label)])];
|
86
|
-
return cull.reduce(function (elements, ref) {
|
87
|
-
var url = tpl(urlTemplate, ref[1]);
|
88
|
-
elements.push(e.li(e.a({ href: url }, ref[0])));
|
89
|
-
return elements;
|
90
|
-
}, initial, refs.sort());
|
91
|
-
}
|
92
|
-
|
93
|
-
function refsList(refs, urlTemplate) {
|
94
|
-
return e.ul({ className: "dropdown-menu" },
|
95
|
-
[refInput(urlTemplate)].
|
96
|
-
concat(refItems("Branches", refs.heads || [], urlTemplate)).
|
97
|
-
concat(refItems("Tags", refs.tags || [], urlTemplate)));
|
98
|
-
}
|
99
|
-
|
100
|
-
function build(refs, current, urlTemplate) {
|
101
|
-
return e.div({
|
102
|
-
className: "dropdown gts-branch-selector pull-right"
|
103
|
-
}, [currentRefLink(refs, current), refsList(refs, urlTemplate)]);
|
104
|
-
}
|
105
|
-
|
106
|
-
function refSelector(placeholder, refs, ref, refUrlTemplate) {
|
107
|
-
var selector = build(refs, ref, refUrlTemplate);
|
108
|
-
placeholder.parentNode.insertBefore(selector, placeholder);
|
109
|
-
placeholder.parentNode.removeChild(placeholder);
|
110
|
-
this.gts.dropdown(selector);
|
111
|
-
}
|
112
|
-
|
113
|
-
refSelector.build = build;
|
114
|
-
refSelector.getCurrentRef = getCurrent;
|
115
|
-
return refSelector;
|
116
|
-
}(dome.el));
|
@@ -1,162 +0,0 @@
|
|
1
|
-
/*global dome, gts*/
|
2
|
-
this.gts = this.gts || {};
|
3
|
-
|
4
|
-
this.gts.repository = (function (el) {
|
5
|
-
/**
|
6
|
-
* Build the repository admin tab into the menu if the data indicates that
|
7
|
-
* the current user can admin the repository. Initialize as a dropdown
|
8
|
-
* toggler if built.
|
9
|
-
*/
|
10
|
-
function bullet(type, text) {
|
11
|
-
return [el.i({ className: type }), " " + text];
|
12
|
-
}
|
13
|
-
|
14
|
-
function link(href, type, text) {
|
15
|
-
return el.a({ href: href }, bullet(type, text));
|
16
|
-
}
|
17
|
-
|
18
|
-
function build(data, tagName) {
|
19
|
-
return el[tagName || "li"]({ className: "pull-right dropdown" }, [
|
20
|
-
el.a({
|
21
|
-
href: "#",
|
22
|
-
"data-toggle": "dropdown",
|
23
|
-
className: "dropdown-toggle"
|
24
|
-
}, bullet("icon-cog", "Admin")),
|
25
|
-
el.ul({ className: "dropdown-menu" }, [
|
26
|
-
el.li(link(data.editPath, "icon-pencil", "Edit repository")),
|
27
|
-
el.li(link(data.destroyPath, "icon-trash", "Delete repository")),
|
28
|
-
el.li({ className: "divider" }),
|
29
|
-
el.li(link(data.webHooksPath, "i", "Web hooks")),
|
30
|
-
el.li(link(data.ownershipPath, "i", "Transfer ownership")),
|
31
|
-
el.li(link(data.committershipsPath, "i", "Manage collaborators"))
|
32
|
-
])
|
33
|
-
]);
|
34
|
-
}
|
35
|
-
|
36
|
-
function repositoryAdmin(placeholder, data) {
|
37
|
-
var toggler = build(data, placeholder.tagName.toLowerCase());
|
38
|
-
dome.replace(placeholder, toggler);
|
39
|
-
this.gts.dropdown(toggler);
|
40
|
-
|
41
|
-
if (dome.data.get("gts-active", toggler.parentNode) === "admin") {
|
42
|
-
dome.cn.add("active", toggler);
|
43
|
-
}
|
44
|
-
}
|
45
|
-
|
46
|
-
repositoryAdmin.build = build;
|
47
|
-
|
48
|
-
/**
|
49
|
-
* Generate and power the "Watch"/"Unwatch" button on repository pages. To
|
50
|
-
* use this component, put a placeholder on the page, and call
|
51
|
-
* repositoryWatching(placeHolder, repositoryWatch);
|
52
|
-
*
|
53
|
-
* The viewstate object is expected to contain at least
|
54
|
-
* - watching (boolean)
|
55
|
-
* - watchPath (string)
|
56
|
-
* - unwatchPath (string, only required if watching is true)
|
57
|
-
*/
|
58
|
-
function render(link, repository) {
|
59
|
-
if (repository.watching) {
|
60
|
-
link.innerHTML = "<i class=\"icon icon-star\"></i> Unwatch";
|
61
|
-
link.href = repository.unwatchPath;
|
62
|
-
} else {
|
63
|
-
link.innerHTML = "<i class=\"icon icon-star-empty\"></i> Watch";
|
64
|
-
link.href = repository.watchPath;
|
65
|
-
}
|
66
|
-
}
|
67
|
-
|
68
|
-
function unwatch(link, repository) {
|
69
|
-
gts.request({
|
70
|
-
url: repository.unwatchPath,
|
71
|
-
method: "delete",
|
72
|
-
type: "js",
|
73
|
-
headers: {
|
74
|
-
"Accept": "application/javascript, text/javascript"
|
75
|
-
},
|
76
|
-
success: function (xhr) {
|
77
|
-
repository.watching = false;
|
78
|
-
render(link, repository);
|
79
|
-
},
|
80
|
-
error: function () {
|
81
|
-
link.innerHTML = "Failed, try watching again";
|
82
|
-
}
|
83
|
-
});
|
84
|
-
}
|
85
|
-
|
86
|
-
function watch(link, repository) {
|
87
|
-
gts.request({
|
88
|
-
url: repository.watchPath,
|
89
|
-
method: "post",
|
90
|
-
type: "text",
|
91
|
-
headers: {
|
92
|
-
"Accept": "application/javascript, text/javascript"
|
93
|
-
},
|
94
|
-
success: function (xhr) {
|
95
|
-
repository.watching = true;
|
96
|
-
repository.unwatchPath = xhr.getResponseHeader("location");
|
97
|
-
render(link, repository);
|
98
|
-
},
|
99
|
-
error: function () {
|
100
|
-
link.innerHTML = "Failed, try unwatching again";
|
101
|
-
}
|
102
|
-
});
|
103
|
-
}
|
104
|
-
|
105
|
-
function toggleState(link, repository) {
|
106
|
-
gts.loading(link);
|
107
|
-
if (repository.watching) {
|
108
|
-
unwatch(link, repository);
|
109
|
-
} else {
|
110
|
-
watch(link, repository);
|
111
|
-
}
|
112
|
-
}
|
113
|
-
|
114
|
-
function repositoryWatching(ph, repositoryWatch) {
|
115
|
-
var link = dome.el("a", { className: "btn" });
|
116
|
-
dome.replace(ph, link);
|
117
|
-
render(link, repositoryWatch);
|
118
|
-
dome.on(link, "click", function (e) {
|
119
|
-
e.preventDefault();
|
120
|
-
e.stopPropagation();
|
121
|
-
toggleState(link, repositoryWatch);
|
122
|
-
});
|
123
|
-
};
|
124
|
-
|
125
|
-
repositoryWatching.watch = watch;
|
126
|
-
repositoryWatching.unwatch = unwatch;
|
127
|
-
repositoryWatching.toggleState = toggleState;
|
128
|
-
repositoryWatching.render = render;
|
129
|
-
|
130
|
-
/**
|
131
|
-
* Display button to clone repository if the current user is
|
132
|
-
* offered a clone URL
|
133
|
-
*/
|
134
|
-
function repositoryCloning(placeholder, repository) {
|
135
|
-
if (!repository.clonePath) { return; }
|
136
|
-
dome.replace(placeholder, dome.el("a", {
|
137
|
-
href: repository.clonePath,
|
138
|
-
className: "btn"
|
139
|
-
}, "Clone"));
|
140
|
-
}
|
141
|
-
|
142
|
-
/**
|
143
|
-
* Display button to merge repository clone if the current user
|
144
|
-
* is offered a request merge URL.
|
145
|
-
*/
|
146
|
-
function mergeRequest(placeholder, repository) {
|
147
|
-
if (!repository.requestMergePath) { return; }
|
148
|
-
dome.replace(placeholder, dome.el("li", { className: "pull-right" }, [
|
149
|
-
dome.el("a", { href: repository.requestMergePath }, [
|
150
|
-
dome.el("i", { className: "icon icon-random" }),
|
151
|
-
" Request merge"
|
152
|
-
])
|
153
|
-
]));
|
154
|
-
}
|
155
|
-
|
156
|
-
return {
|
157
|
-
admin: repositoryAdmin,
|
158
|
-
watching: repositoryWatching,
|
159
|
-
cloning: repositoryCloning,
|
160
|
-
mergeRequest: mergeRequest
|
161
|
-
};
|
162
|
-
}(dome.el));
|
@@ -1,20 +0,0 @@
|
|
1
|
-
/*global cull, dome*/
|
2
|
-
this.gts = this.gts || {};
|
3
|
-
|
4
|
-
/**
|
5
|
-
* Allows <select> options to have a data-description attribute that
|
6
|
-
* contains details about the options that will be displayed in the
|
7
|
-
* element whose id matches that of the select's data-target when
|
8
|
-
* selected.
|
9
|
-
*/
|
10
|
-
this.gts.selectDetails = function (select) {
|
11
|
-
var target = document.getElementById(dome.data.get("target", select));
|
12
|
-
if (!target) { return; }
|
13
|
-
|
14
|
-
function updateDescription(e) {
|
15
|
-
target.innerHTML = dome.data.get("description", select.options[select.selectedIndex]);
|
16
|
-
}
|
17
|
-
|
18
|
-
dome.on(select, "change", updateDescription);
|
19
|
-
updateDescription();
|
20
|
-
};
|
@@ -1,32 +0,0 @@
|
|
1
|
-
/*global cull, dome, gts*/
|
2
|
-
this.gts = this.gts || {};
|
3
|
-
|
4
|
-
/**
|
5
|
-
* Mirrors the value of one field onto another by converting it to a
|
6
|
-
* slug/url-friendly string as the source is updated. If the target
|
7
|
-
* has been manually edited, it is no longer automatically updated.
|
8
|
-
*/
|
9
|
-
this.gts.slugify = (function () {
|
10
|
-
function toSlug(text) {
|
11
|
-
return text.toLowerCase().replace(/[^a-z0-9_\-]+/g, "-").replace(/^\-|\-$/g, "");
|
12
|
-
}
|
13
|
-
|
14
|
-
function safeToOverwrite(source, target) {
|
15
|
-
return target === "" || toSlug(source) === target;
|
16
|
-
}
|
17
|
-
|
18
|
-
return function slugify(source, target) {
|
19
|
-
var currentSlugSource = source.value;
|
20
|
-
|
21
|
-
function attemptOverwrite() {
|
22
|
-
if (safeToOverwrite(currentSlugSource, target.value)) {
|
23
|
-
target.value = toSlug(source.value);
|
24
|
-
currentSlugSource = source.value;
|
25
|
-
}
|
26
|
-
}
|
27
|
-
|
28
|
-
dome.on(source, "keyup", attemptOverwrite);
|
29
|
-
dome.on(source, "focus", attemptOverwrite);
|
30
|
-
attemptOverwrite();
|
31
|
-
};
|
32
|
-
}());
|
@@ -1,38 +0,0 @@
|
|
1
|
-
/*global timeago, gts*/
|
2
|
-
this.gts = this.gts || {};
|
3
|
-
|
4
|
-
/**
|
5
|
-
* Replace content of <abbr> elements with a casual representation of the
|
6
|
-
* ISO8601 date in its title attribute.
|
7
|
-
*/
|
8
|
-
this.gts.timeago = (function (ta) {
|
9
|
-
function timeago(el, time) {
|
10
|
-
var date = ta.parse(time || el.title);
|
11
|
-
if (isNaN(date.getTime())) { return el; }
|
12
|
-
var text = el.innerHTML.trim() || el.title;
|
13
|
-
el.innerHTML = ta.relative(date);
|
14
|
-
el.title = text;
|
15
|
-
return el;
|
16
|
-
};
|
17
|
-
|
18
|
-
var cache = {};
|
19
|
-
|
20
|
-
timeago.periodic = function (timeout) {
|
21
|
-
if (!cache[timeout]) {
|
22
|
-
cache[timeout] = [];
|
23
|
-
setInterval(function () {
|
24
|
-
for (var i = 0, l = cache[timeout].length, item; i < l; ++i) {
|
25
|
-
item = cache[timeout][i];
|
26
|
-
gts.timeago(item.element, item.time);
|
27
|
-
}
|
28
|
-
}, timeout);
|
29
|
-
}
|
30
|
-
|
31
|
-
return function (el) {
|
32
|
-
cache[timeout].push({ element: el, time: el.title });
|
33
|
-
return timeago(el, el.title);
|
34
|
-
};
|
35
|
-
};
|
36
|
-
|
37
|
-
return timeago;
|
38
|
-
}(timeago));
|
@@ -1,140 +0,0 @@
|
|
1
|
-
/*global gts, cull, dome, reqwest, Spinner*/
|
2
|
-
// The global, shared Gitorious namespace
|
3
|
-
this.gts = this.gts || {};
|
4
|
-
|
5
|
-
/**
|
6
|
-
* gts.treeHistory(tableElement, treeHistoryUrl)
|
7
|
-
*
|
8
|
-
* Loads the tree history JSON payload from Gitorious and annotates an
|
9
|
-
* HTML table containing a Git tree with commit data. The HTML table
|
10
|
-
* is expected to look like:
|
11
|
-
*
|
12
|
-
* <table>
|
13
|
-
* <!-- Possible thead and tfoot, ignored -->
|
14
|
-
* <tbody>
|
15
|
-
* <tr>
|
16
|
-
* <td class="gts-name">
|
17
|
-
* <a href="/gitorious/gitorious/source/master:bin">
|
18
|
-
* <i class="icon icon-folder-close"></i>
|
19
|
-
* bin
|
20
|
-
* </a>
|
21
|
-
* </td>
|
22
|
-
* <td class="gts-commit-date"></td>
|
23
|
-
* <td class="gts-commit-oid"></td>
|
24
|
-
* <td></td>
|
25
|
-
* </tr>
|
26
|
-
* </tbody>
|
27
|
-
* </table>
|
28
|
-
*
|
29
|
-
* treeHistory will fill out the commit date, oid and add the last commit
|
30
|
-
* message to the last cell.
|
31
|
-
*
|
32
|
-
* treeHistory also supports initial empty <td> elements, as created by Dolt
|
33
|
-
* when directory hierarhy indentation is enabled.
|
34
|
-
*
|
35
|
-
* The treeHistoryUrl points to the tree history JSON resource, which
|
36
|
-
* looks like
|
37
|
-
*
|
38
|
-
* [{ "name": "bin",
|
39
|
-
* "oid": "08e37640144b900e8e876f621332b64c39c79567",
|
40
|
-
* "filemode": 16384,
|
41
|
-
* "type": "tree",
|
42
|
-
* "history": [{
|
43
|
-
* "oid": "762d5a7186850dca6b507402ca7bbec2df2dea72",
|
44
|
-
* "author": {
|
45
|
-
* "name": "Marius Mathiesen",
|
46
|
-
* "email": "marius@gitorious.org"
|
47
|
-
* },
|
48
|
-
* "date": "2012-10-04T14:15:33+02:00",
|
49
|
-
* "summary": "Set ENV[\"HOME\"] to make resque work with SSH keys",
|
50
|
-
* "message": ""
|
51
|
-
* }, { ... }]
|
52
|
-
* }, { ... }]
|
53
|
-
*/
|
54
|
-
this.gts.treeHistory = (function (c, d) {
|
55
|
-
function el(element, tagName) {
|
56
|
-
return element.getElementsByTagName(tagName);
|
57
|
-
}
|
58
|
-
|
59
|
-
var th = function (table, url) {
|
60
|
-
var cell = el(el(table, "tbody")[0], "td")[2];
|
61
|
-
var spinner = new Spinner({
|
62
|
-
lines: 13,
|
63
|
-
length: 1,
|
64
|
-
width: 2,
|
65
|
-
radius: 6,
|
66
|
-
corners: 1,
|
67
|
-
rotate: 0,
|
68
|
-
color: "#000",
|
69
|
-
speed: 1,
|
70
|
-
trail: 60,
|
71
|
-
shadow: false,
|
72
|
-
hwaccel: true,
|
73
|
-
className: "spinner",
|
74
|
-
zIndex: 2e9,
|
75
|
-
top: "auto",
|
76
|
-
left: "auto"
|
77
|
-
}).spin(cell);
|
78
|
-
|
79
|
-
reqwest({
|
80
|
-
url: url,
|
81
|
-
type: "json",
|
82
|
-
success: function (tree) {
|
83
|
-
spinner.stop();
|
84
|
-
th.annotate(table, tree);
|
85
|
-
}
|
86
|
-
});
|
87
|
-
};
|
88
|
-
|
89
|
-
var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
90
|
-
"Jul", "Aug", "Sep", "Oct", "Nov", "Dev"];
|
91
|
-
|
92
|
-
function getFileMeta(fileName, tree) {
|
93
|
-
return c.select(function (e) {
|
94
|
-
return e.name === fileName;
|
95
|
-
}, tree)[0];
|
96
|
-
}
|
97
|
-
|
98
|
-
function formatDate(dateStr) {
|
99
|
-
if (!Date.parse) { return ""; }
|
100
|
-
var d = new Date(Date.parse(dateStr));
|
101
|
-
return months[d.getMonth()] + " " + d.getDate() + " " + d.getFullYear();
|
102
|
-
}
|
103
|
-
|
104
|
-
function getTreeIndent(cells) {
|
105
|
-
var i, l;
|
106
|
-
for (i = 0, l = cells.length; i < l; ++i) {
|
107
|
-
if (dome.cn.has("gts-name", cells[i])) {
|
108
|
-
return i;
|
109
|
-
}
|
110
|
-
}
|
111
|
-
|
112
|
-
return i;
|
113
|
-
}
|
114
|
-
|
115
|
-
function fileName(element) {
|
116
|
-
return ((element && dome.text(element)) || "").trim();
|
117
|
-
}
|
118
|
-
|
119
|
-
th.annotateRow = function (tree, row) {
|
120
|
-
var tds = el(row, "td");
|
121
|
-
var offset = getTreeIndent(tds);
|
122
|
-
var entry = getFileMeta(fileName(tds[offset]), tree);
|
123
|
-
if (!entry) { return; }
|
124
|
-
var commit = entry.history[0];
|
125
|
-
tds[offset + 1].innerHTML = formatDate(commit.date);
|
126
|
-
dome.data.set({ "gts-commit-oid": commit.oid }, tds[offset + 2]);
|
127
|
-
tds[offset + 2].innerHTML = "#" + commit.oid.slice(0, 7);
|
128
|
-
var summary = commit.summary.trim();
|
129
|
-
tds[offset + 3].innerHTML = gts.abbrev(summary, 50, " [...]") +
|
130
|
-
" (" + commit.author.name + ")";
|
131
|
-
};
|
132
|
-
|
133
|
-
th.annotate = function (table, tree) {
|
134
|
-
c.doall(c.partial(function (tree, row) {
|
135
|
-
th.annotateRow(tree, row);
|
136
|
-
}, tree), el(el(table, "tbody")[0], "tr"));
|
137
|
-
};
|
138
|
-
|
139
|
-
return th;
|
140
|
-
}(cull));
|