dolt 0.23.0 → 0.24.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.
Files changed (45) hide show
  1. data/.gitignore +2 -0
  2. data/.travis.yml +0 -1
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +13 -1
  5. data/Rakefile +10 -0
  6. data/dolt.gemspec +1 -1
  7. data/test/test_helper.rb +5 -0
  8. data/vendor/ui/.gitmodules +9 -0
  9. data/vendor/ui/Makefile +46 -0
  10. data/vendor/ui/buster.js +8 -3
  11. data/vendor/ui/css/gitorious.css +26 -1
  12. data/vendor/ui/dist/gitorious3-capillary.min.js +12 -0
  13. data/vendor/ui/dist/gitorious3.min.css +1 -1
  14. data/vendor/ui/dist/gitorious3.min.js +3 -3
  15. data/vendor/ui/js/src/cache.js +27 -0
  16. data/vendor/ui/js/src/capillary.js +7 -0
  17. data/vendor/ui/js/src/components/blob.js +1 -1
  18. data/vendor/ui/js/src/components/capillary.js +51 -0
  19. data/vendor/ui/js/src/components/clone-name-suggestion.js +38 -0
  20. data/vendor/ui/js/src/components/clone-url-selection.js +25 -15
  21. data/vendor/ui/js/src/components/collapse.js +17 -0
  22. data/vendor/ui/js/src/components/comments.js +111 -0
  23. data/vendor/ui/js/src/components/dropdown.js +4 -2
  24. data/vendor/ui/js/src/components/loading.js +33 -0
  25. data/vendor/ui/js/src/components/oid-ref-interpolator.js +9 -0
  26. data/vendor/ui/js/src/components/profile-menu.js +2 -0
  27. data/vendor/ui/js/src/components/rails-links.js +24 -0
  28. data/vendor/ui/js/src/components/ref-selector.js +3 -1
  29. data/vendor/ui/js/src/components/repository.js +161 -0
  30. data/vendor/ui/js/src/components/timeago.js +38 -0
  31. data/vendor/ui/js/src/components/url.js +1 -1
  32. data/vendor/ui/js/src/gitorious.js +75 -7
  33. data/vendor/ui/js/src/json-request.js +6 -0
  34. data/vendor/ui/js/src/spacer.js +5 -0
  35. data/vendor/ui/js/test/cache-test.js +47 -0
  36. data/vendor/ui/js/test/components/blob-test.js +4 -4
  37. data/vendor/ui/js/test/components/clone-name-suggestion-test.js +37 -0
  38. data/vendor/ui/js/test/components/clone-url-selection-test.js +10 -10
  39. data/vendor/ui/js/test/components/comments-test.js +139 -0
  40. data/vendor/ui/js/test/components/repository-admin-test.js +35 -0
  41. data/vendor/ui/js/test/components/repository-watching-test.js +74 -0
  42. data/vendor/ui/js/test/components/timeago-test.js +74 -0
  43. data/vendor/ui/js/test/test-helper.js +2 -0
  44. metadata +25 -3
  45. data/vendor/ui/build +0 -51
@@ -0,0 +1,33 @@
1
+ /*global Spinner, dome*/
2
+ this.gts = this.gts || {};
3
+
4
+ /**
5
+ * Put a spinner in an element that's waiting to be loaded with some content.
6
+ */
7
+ this.gts.loading = function (element, options) {
8
+ dome.cn.add("loading", element);
9
+ element.innerHTML = "";
10
+ options = options || {};
11
+
12
+ var spinner = new Spinner({
13
+ lines: options.hasOwnProperty("lines") ? options.lines : 8,
14
+ length: options.hasOwnProperty("length") ? options.length : 2,
15
+ width: options.hasOwnProperty("width") ? options.width : 2,
16
+ radius: options.hasOwnProperty("radius") ? options.radius : 3,
17
+ color: options.color || "#000",
18
+ speed: options.hasOwnProperty("speed") ? options.speed : 1,
19
+ trail: options.hasOwnProperty("trail") ? options.trail : 100,
20
+ shadow: options.hasOwnProperty("shadow") ? options.shadow : false
21
+ }).spin();
22
+
23
+ spinner.el.style.top = options.topPos || "10px";
24
+ element.appendChild(spinner.el);
25
+
26
+ var text = options.hasOwnProperty("text") ? options.text : "Loading...";
27
+
28
+ if (text) {
29
+ var textEl = document.createElement("span");
30
+ textEl.innerHTML = text;
31
+ element.appendChild(textEl);
32
+ }
33
+ };
@@ -0,0 +1,9 @@
1
+ this.gts = this.gts || {};
2
+
3
+ this.gts.oidRefInterpolator = function (element, refs, urlTemplate) {
4
+ var current = this.gts.refSelector.getCurrentRef("heads", element.innerHTML, refs);
5
+ if (current) {
6
+ element.title = current[1];
7
+ element.innerHTML = current[0];
8
+ }
9
+ };
@@ -8,6 +8,7 @@ var gts = this.gts || {};
8
8
  */
9
9
  (function (d, e) {
10
10
  function button(text, path, icon) {
11
+ text = " " + text;
11
12
  var content = icon ? [e.i({className: "icon-" + icon}), text] : [text];
12
13
  return e.li(e.a({ href: path }, content));
13
14
  }
@@ -30,5 +31,6 @@ var gts = this.gts || {};
30
31
  button("Log out", user.logoutPath)
31
32
  ])
32
33
  ], root);
34
+ gts.dropdown(root);
33
35
  };
34
36
  }(dome, dome.el));
@@ -0,0 +1,24 @@
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
+ };
@@ -105,10 +105,12 @@ this.gts.refSelector = (function (e) {
105
105
 
106
106
  function refSelector(placeholder, refs, ref, refUrlTemplate) {
107
107
  var selector = build(refs, ref, refUrlTemplate);
108
- placeholder.appendChild(selector);
108
+ placeholder.parentNode.insertBefore(selector, placeholder);
109
+ placeholder.parentNode.removeChild(placeholder);
109
110
  this.gts.dropdown(selector);
110
111
  }
111
112
 
112
113
  refSelector.build = build;
114
+ refSelector.getCurrentRef = getCurrent;
113
115
  return refSelector;
114
116
  }(dome.el));
@@ -0,0 +1,161 @@
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.ownershipPath, "i", "Transfer ownership")),
30
+ el.li(link(data.committershipsPath, "i", "Manage collaborators"))
31
+ ])
32
+ ]);
33
+ }
34
+
35
+ function repositoryAdmin(placeholder, data) {
36
+ var toggler = build(data, placeholder.tagName.toLowerCase());
37
+ dome.replace(placeholder, toggler);
38
+ this.gts.dropdown(toggler);
39
+
40
+ if (dome.data.get("gts-active", toggler.parentNode) === "admin") {
41
+ dome.cn.add("active", toggler);
42
+ }
43
+ }
44
+
45
+ repositoryAdmin.build = build;
46
+
47
+ /**
48
+ * Generate and power the "Watch"/"Unwatch" button on repository pages. To
49
+ * use this component, put a placeholder on the page, and call
50
+ * repositoryWatching(placeHolder, repositoryWatch);
51
+ *
52
+ * The viewstate object is expected to contain at least
53
+ * - watching (boolean)
54
+ * - watchPath (string)
55
+ * - unwatchPath (string, only required if watching is true)
56
+ */
57
+ function render(link, repository) {
58
+ if (repository.watching) {
59
+ link.innerHTML = "<i class=\"icon icon-star\"></i> Unwatch";
60
+ link.href = repository.unwatchPath;
61
+ } else {
62
+ link.innerHTML = "<i class=\"icon icon-star-empty\"></i> Watch";
63
+ link.href = repository.watchPath;
64
+ }
65
+ }
66
+
67
+ function unwatch(link, repository) {
68
+ gts.request({
69
+ url: repository.unwatchPath,
70
+ method: "delete",
71
+ type: "js",
72
+ headers: {
73
+ "Accept": "application/javascript, text/javascript"
74
+ },
75
+ success: function (xhr) {
76
+ repository.watching = false;
77
+ render(link, repository);
78
+ },
79
+ error: function () {
80
+ link.innerHTML = "Failed, try watching again";
81
+ }
82
+ });
83
+ }
84
+
85
+ function watch(link, repository) {
86
+ gts.request({
87
+ url: repository.watchPath,
88
+ method: "post",
89
+ type: "text",
90
+ headers: {
91
+ "Accept": "application/javascript, text/javascript"
92
+ },
93
+ success: function (xhr) {
94
+ repository.watching = true;
95
+ repository.unwatchPath = xhr.getResponseHeader("location");
96
+ render(link, repository);
97
+ },
98
+ error: function () {
99
+ link.innerHTML = "Failed, try unwatching again";
100
+ }
101
+ });
102
+ }
103
+
104
+ function toggleState(link, repository) {
105
+ gts.loading(link);
106
+ if (repository.watching) {
107
+ unwatch(link, repository);
108
+ } else {
109
+ watch(link, repository);
110
+ }
111
+ }
112
+
113
+ function repositoryWatching(ph, repositoryWatch) {
114
+ var link = dome.el("a", { className: "btn" });
115
+ dome.replace(ph, link);
116
+ render(link, repositoryWatch);
117
+ dome.on(link, "click", function (e) {
118
+ e.preventDefault();
119
+ e.stopPropagation();
120
+ toggleState(link, repositoryWatch);
121
+ });
122
+ };
123
+
124
+ repositoryWatching.watch = watch;
125
+ repositoryWatching.unwatch = unwatch;
126
+ repositoryWatching.toggleState = toggleState;
127
+ repositoryWatching.render = render;
128
+
129
+ /**
130
+ * Display button to clone repository if the current user is
131
+ * offered a clone URL
132
+ */
133
+ function repositoryCloning(placeholder, repository) {
134
+ if (!repository.clonePath) { return; }
135
+ dome.replace(placeholder, dome.el("a", {
136
+ href: repository.clonePath,
137
+ className: "btn"
138
+ }, "Clone"));
139
+ }
140
+
141
+ /**
142
+ * Display button to merge repository clone if the current user
143
+ * is offered a request merge URL.
144
+ */
145
+ function mergeRequest(placeholder, repository) {
146
+ if (!repository.requestMergePath) { return; }
147
+ dome.replace(placeholder, dome.el("li", { className: "pull-right" }, [
148
+ dome.el("a", { href: repository.requestMergePath }, [
149
+ dome.el("i", { className: "icon icon-random" }),
150
+ " Request merge"
151
+ ])
152
+ ]));
153
+ }
154
+
155
+ return {
156
+ admin: repositoryAdmin,
157
+ watching: repositoryWatching,
158
+ cloning: repositoryCloning,
159
+ mergeRequest: mergeRequest
160
+ };
161
+ }(dome.el));
@@ -0,0 +1,38 @@
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));
@@ -52,7 +52,7 @@ this.gts.url = (function () {
52
52
  }
53
53
 
54
54
  function currentRef(url) {
55
- var regexp = /(blame|blob|tree|history|raw|source|readme)\//;
55
+ var regexp = /(blame|blob|tree|history|raw|source|readme|commits)\//;
56
56
  var refPath = url.split(regexp)[2];
57
57
  return (refPath && refPath.split(":")[0]) || null;
58
58
  }
@@ -1,4 +1,4 @@
1
- /*global gts, reqwest, cull*/
1
+ /*global gts, cull, reqwest*/
2
2
 
3
3
  // Environment variables
4
4
  gts.app.env("url", window.location.href);
@@ -10,6 +10,21 @@ if (window.hasOwnProperty("onpopstate")) {
10
10
  };
11
11
  }
12
12
 
13
+ cull.doall(function (meta) {
14
+ if (meta.name === "csrf-param") {
15
+ gts.app.env("csrf-param", meta.content);
16
+ }
17
+ if (meta.name === "csrf-token") {
18
+ gts.app.env("csrf-token", meta.content);
19
+ }
20
+ }, document.getElementsByTagName("meta"));
21
+
22
+ gts.request = function (options) {
23
+ options.headers = options.headers || {};
24
+ options.headers["X-CSRF-Token"] = gts.app.env["csrf-token"];
25
+ reqwest(options);
26
+ };
27
+
13
28
  // Data
14
29
  gts.app.data("ref-url-template", function (url, ref) {
15
30
  return gts.url.templatize(url, { ref: ref });
@@ -18,17 +33,23 @@ gts.app.data("ref-url-template", function (url, ref) {
18
33
  serializeArgs: function (url, ref) { return [url.split("#")[0], ref]; }
19
34
  });
20
35
 
21
- gts.app.data("repository-refs", function (url) {
22
- return reqwest({ url: url, type: "json" });
23
- }, { depends: ["repository-refs-url"] });
24
-
36
+ gts.app.data("repository-refs", this.gts.jsonRequest, { depends: ["repository-refs-url"] });
25
37
  gts.app.data("current-ref", gts.url.currentRef, { depends: ["url"] });
26
- gts.app.data("user-repo-view-state", gts.userRepoViewState, {
38
+ gts.app.data("user-repo-view-state", gts.cache(gts.userRepoViewState), {
27
39
  depends: ["user-repository-path"]
28
40
  });
29
41
  gts.app.data("current-user", cull.prop("user"), {
30
42
  depends: ["user-repo-view-state"]
31
43
  });
44
+ gts.app.data("current-repository", cull.prop("repository"), {
45
+ depends: ["user-repo-view-state"]
46
+ });
47
+ gts.app.data("repository-watch", cull.prop("watch"), {
48
+ depends: ["current-repository"]
49
+ });
50
+ gts.app.data("repository-admin", cull.prop("admin"), {
51
+ depends: ["current-repository"]
52
+ });
32
53
  gts.app.data("blob-region", gts.blob.regionFromUrl, { depends: ["url"] });
33
54
 
34
55
  // Features
@@ -40,11 +61,20 @@ gts.app.feature("google-analytics", gts.googleAnalytics, {
40
61
  depends: ["analytics-account", "analytics-domain-name"]
41
62
  });
42
63
 
64
+ gts.app.feature("dropdown", gts.dropdown, {
65
+ elements: ["dropdown"]
66
+ });
67
+
43
68
  gts.app.feature("ref-selector", gts.refSelector, {
44
69
  elements: ["gts-ref-selector-ph"],
45
70
  depends: ["repository-refs", "current-ref", "ref-url-template"]
46
71
  });
47
72
 
73
+ gts.app.feature("oid-ref-interpolator", gts.oidRefInterpolator, {
74
+ elements: ["gts-oid"],
75
+ depends: ["repository-refs", "ref-url-template"]
76
+ });
77
+
48
78
  gts.app.feature("tree-history", gts.treeHistory, {
49
79
  elements: ["gts-tree-explorer"],
50
80
  depends: ["tree-history-url"]
@@ -78,11 +108,49 @@ gts.app.feature("live-markdown-preview", gts.liveMarkdownPreview, {
78
108
  elements: ["gts-live-markdown-preview"]
79
109
  });
80
110
 
111
+ gts.app.feature("timeago", gts.timeago.periodic(60000), {
112
+ elements: ["timeago"]
113
+ });
114
+
115
+ gts.app.feature("collapse", gts.collapse);
116
+
117
+ gts.app.feature("clone-name-suggestion", gts.cloneNameSuggestion, {
118
+ elements: ["clone-repository-form"]
119
+ });
120
+
121
+ gts.app.feature("loading", gts.loading, {
122
+ elements: ["loading"]
123
+ });
124
+
125
+ gts.app.feature("rails-links", gts.railsLinks, {
126
+ depends: ["csrf-param", "csrf-token"]
127
+ });
128
+
129
+ gts.app.feature("repository-admin-menu", gts.repository.admin, {
130
+ elements: ["gts-repository-admin-ph"],
131
+ depends: ["repository-admin"]
132
+ });
133
+
134
+ gts.app.feature("repository-watching", gts.repository.watching, {
135
+ elements: ["gts-watch-repository-ph"],
136
+ depends: ["repository-watch"]
137
+ });
138
+
139
+ gts.app.feature("repository-cloning", gts.repository.cloning, {
140
+ elements: ["gts-clone-repository-ph"],
141
+ depends: ["current-repository"]
142
+ });
143
+
144
+ gts.app.feature("repository-merge-request", gts.repository.mergeRequest, {
145
+ elements: ["gts-request-merge-ph"],
146
+ depends: ["current-repository"]
147
+ });
148
+
81
149
  // Spin off app asynchronously so subsequent scripts have a chance
82
150
  // to register loggers etc before we roll
83
151
  setTimeout(function () {
84
152
  // Scan the document for data-gts-* attributes that set
85
153
  // "environment variables"
86
154
  gts.app.scanEnvAttrs(document.body, "data-gts-env-");
87
- gts.app.load(document.body);
155
+ gts.app.load(document.documentElement);
88
156
  }, 10);
@@ -0,0 +1,6 @@
1
+ /*global reqwest*/
2
+ this.gts = this.gts || {};
3
+
4
+ this.gts.jsonRequest = function (url) {
5
+ return reqwest({ url: url, type: "json" });
6
+ };
@@ -0,0 +1,5 @@
1
+ /**
2
+ * This is kinda sad, but sometimes needed in between scripts that do
3
+ * not work when concatenated.
4
+ */
5
+ ;
@@ -0,0 +1,47 @@
1
+ /*global gts*/
2
+
3
+ buster.testCase("Cache", {
4
+ "caches function": function () {
5
+ var spy = this.spy();
6
+ var fn = gts.cache(spy);
7
+ fn();
8
+ fn();
9
+ fn();
10
+
11
+ assert.calledOnce(spy);
12
+ },
13
+
14
+ "caches function's return value": function () {
15
+ var stub = this.stub().returns(42);
16
+ var fn = gts.cache(stub);
17
+
18
+ assert.equals(fn(), 42);
19
+ assert.equals(fn(), 42);
20
+ assert.equals(fn(), 42);
21
+ },
22
+
23
+ "caches function's return value per argument": function () {
24
+ var adder = 1;
25
+ var fn = gts.cache(function (a) {
26
+ return a + adder;
27
+ });
28
+
29
+ assert.equals(fn(1), 2);
30
+ adder = 2;
31
+ assert.equals(fn(1), 2);
32
+ assert.equals(fn(2), 4);
33
+ },
34
+
35
+ "caches function's return value per arguent set": function () {
36
+ var adder = 1;
37
+ var fn = gts.cache(function (a, b) {
38
+ return a + b + adder;
39
+ });
40
+
41
+ var object = { valueOf: this.stub().returns(1) };
42
+ assert.equals(fn(1, object), 3);
43
+ adder = 2;
44
+ assert.equals(fn(1, object), 3);
45
+ assert.equals(fn(2, object), 5);
46
+ }
47
+ });
@@ -3,10 +3,10 @@
3
3
  buster.testCase("Blob", {
4
4
  setUp: function () {
5
5
  this.el = dome.el("ol", [
6
- dome.el("li", { className: "L0" }, "First line"),
7
- dome.el("li", { className: "L1" }, "Second line"),
8
- dome.el("li", { className: "L2" }, "Third line"),
9
- dome.el("li", { className: "L3" }, "Fourth line")
6
+ dome.el("li", { className: "L1" }, "First line"),
7
+ dome.el("li", { className: "L2" }, "Second line"),
8
+ dome.el("li", { className: "L3" }, "Third line"),
9
+ dome.el("li", { className: "L4" }, "Fourth line")
10
10
  ]);
11
11
  },
12
12
 
@@ -0,0 +1,37 @@
1
+ /*global buster, dome, gts*/
2
+
3
+ buster.testCase("Clone name suggestion", {
4
+ setUp: function () {
5
+ this.form = dome.el("form", {
6
+ "data": { "gts-repository-to-clone": "gitorious" }
7
+ }, [
8
+ dome.el("input", {
9
+ checked: "checked",
10
+ id: "repository_owner_type_user",
11
+ name: "repository[owner_type]",
12
+ value: "User",
13
+ type: "radio",
14
+ data: { "gts-cloning-user": "christian" }
15
+ }),
16
+
17
+ dome.el("input", {
18
+ id: "repository_owner_type_group",
19
+ name: "repository[owner_type]",
20
+ type: "radio",
21
+ value: "Group"
22
+ }),
23
+
24
+ dome.el("select", {
25
+ id: "repository_owner_id_group_select",
26
+ name: "repository[owner_id]"
27
+ }, [
28
+ dome.el("option", { value: 1 }, "gitorians"),
29
+ dome.el("option", { value: 2 }, "blargians")
30
+ ])
31
+ ]);
32
+ },
33
+
34
+ "//suggests username-scoped clone name": function () {
35
+
36
+ }
37
+ });
@@ -5,21 +5,21 @@ buster.testCase("Clone URL selection", {
5
5
  /*:DOC element = <div class="btn-group gts-repo-urls">
6
6
  <a class="btn gts-repo-url" href="git://gitorious.org/gitorious/mainline.git">Git</a>
7
7
  <a class="btn gts-repo-url" href="http://git.gitorious.org/gitorious/mainline.git">HTTP</a>
8
- <a class="active btn gts-repo-url" href="git@gitorious.org:gitorious/mainline.git">SSH</a>
8
+ <a class="active btn gts-repo-url" href="ssh://git@gitorious.org:gitorious/mainline.git">SSH</a>
9
9
  <input class="span4 gts-current-repo-url gts-select-onfocus" type="url" value="git@gitorious.org:gitorious/mainline.git">
10
10
  <button data-toggle="collapse" data-target="#repo-url-help" class="gts-repo-url-help btn">?</button>
11
11
  </div>*/
12
12
  this.input = this.element.getElementsByTagName("input")[0];
13
- document.body.appendChild(this.element);
14
- var buttons = this.element.getElementsByTagName("a");
15
- this.click = function (num) {
16
- jQuery(buttons[num]).trigger("click");
17
- };
13
+ this.buttons = this.element.getElementsByTagName("a");
18
14
  },
19
15
 
20
- "// copies href to input on click": "Click triggering currently not working"
21
- /*function () {
22
- this.click(0);
16
+ "copies git:// href to input": function () {
17
+ gts.cloneUrlSelection.select(this.element, this.buttons[0]);
23
18
  assert.equals(this.input.value, "git://gitorious.org/gitorious/mainline.git");
24
- }*/
19
+ },
20
+
21
+ "copies ssh:// href to input": function () {
22
+ gts.cloneUrlSelection.select(this.element, this.buttons[2]);
23
+ assert.equals(this.input.value, "git@gitorious.org:gitorious/mainline.git");
24
+ }
25
25
  });