dolt 0.29.0 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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));
|