dolt 0.2.1 → 0.2.2
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/Gemfile.lock +4 -2
- data/bin/dolt +2 -0
- data/dolt.gemspec +1 -0
- data/lib/dolt/repo_actions.rb +20 -0
- data/lib/dolt/sinatra/actions.rb +8 -0
- data/lib/dolt/sinatra/multi_repo_browser.rb +4 -0
- data/lib/dolt/sinatra/single_repo_browser.rb +4 -0
- data/lib/dolt/version.rb +1 -1
- data/lib/dolt/view/blob.rb +14 -3
- data/lib/dolt/view/syntax_highlight.rb +2 -1
- data/lib/dolt/view/tab_width.rb +30 -0
- data/test/dolt/repo_actions_test.rb +35 -13
- data/test/dolt/sinatra/actions_test.rb +16 -2
- data/test/dolt/templates/refs_test.rb +38 -0
- data/test/dolt/view/smart_blob_renderer_test.rb +38 -0
- data/test/dolt/view/tab_width_test.rb +40 -0
- data/vendor/ui/buster.js +5 -0
- data/vendor/ui/css/gitorious.css +34 -0
- data/vendor/ui/js/components/ref-selector.js +76 -0
- data/vendor/ui/js/components/url.js +31 -0
- data/vendor/ui/js/gitorious.js +105 -66
- data/vendor/ui/js/libs/jquery.js +4 -0
- data/views/layout.erb +4 -2
- data/views/refs.erb +22 -0
- metadata +38 -14
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
dolt (0.2.
|
4
|
+
dolt (0.2.1)
|
5
5
|
async_sinatra (~> 1.0)
|
6
6
|
builder (~> 3.1)
|
7
7
|
em_pessimistic (~> 0.1)
|
@@ -9,6 +9,7 @@ PATH
|
|
9
9
|
eventmachine (~> 1.0)
|
10
10
|
github-markup (~> 0.7)
|
11
11
|
htmlentities (~> 4.3)
|
12
|
+
json (~> 1.7)
|
12
13
|
pygments.rb (~> 0.2)
|
13
14
|
sinatra (~> 1.3)
|
14
15
|
thin (~> 1.4)
|
@@ -28,13 +29,14 @@ GEM
|
|
28
29
|
eventmachine
|
29
30
|
em_pessimistic (0.1.2)
|
30
31
|
eventmachine (~> 1.0)
|
31
|
-
em_rugged (0.1.
|
32
|
+
em_rugged (0.1.3)
|
32
33
|
eventmachine (~> 1.0)
|
33
34
|
rugged (= 0.17.0.b6)
|
34
35
|
eventmachine (1.0.0)
|
35
36
|
ffi (1.0.11)
|
36
37
|
github-markup (0.7.4)
|
37
38
|
htmlentities (4.3.1)
|
39
|
+
json (1.7.5)
|
38
40
|
metaclass (0.0.1)
|
39
41
|
minitest (2.12.1)
|
40
42
|
mocha (0.12.4)
|
data/bin/dolt
CHANGED
data/dolt.gemspec
CHANGED
@@ -33,6 +33,7 @@ Gem::Specification.new do |s|
|
|
33
33
|
s.add_dependency "tzinfo", "~> 0.3"
|
34
34
|
s.add_dependency "github-markup", "~> 0.7"
|
35
35
|
s.add_dependency "htmlentities", "~> 4.3"
|
36
|
+
s.add_dependency "json", "~> 1.7"
|
36
37
|
|
37
38
|
s.add_development_dependency "minitest", "~> 2.0"
|
38
39
|
s.add_development_dependency "em-minitest-spec", "~> 1.1"
|
data/lib/dolt/repo_actions.rb
CHANGED
@@ -39,6 +39,20 @@ module Dolt
|
|
39
39
|
repo_action(repo, ref, path, :commits, :log, ref, path, count, &block)
|
40
40
|
end
|
41
41
|
|
42
|
+
def refs(repo, &block)
|
43
|
+
repository = repo_resolver.resolve(repo)
|
44
|
+
d = repository.refs
|
45
|
+
d.callback do |refs|
|
46
|
+
names = refs.map(&:name)
|
47
|
+
block.call(nil, {
|
48
|
+
:repository => repo,
|
49
|
+
:tags => stripped_ref_names(names, :tags),
|
50
|
+
:heads => stripped_ref_names(names, :heads)
|
51
|
+
})
|
52
|
+
end
|
53
|
+
d.errback { |err| block.call(err, nil) }
|
54
|
+
end
|
55
|
+
|
42
56
|
def repositories
|
43
57
|
repo_resolver.all
|
44
58
|
end
|
@@ -62,5 +76,11 @@ module Dolt
|
|
62
76
|
:ref => ref
|
63
77
|
}.merge(locals)
|
64
78
|
end
|
79
|
+
|
80
|
+
def stripped_ref_names(names, type)
|
81
|
+
names.select { |n| n =~ /#{type}/ }.map do |n|
|
82
|
+
n.sub(/^refs\/#{type}\//, "")
|
83
|
+
end
|
84
|
+
end
|
65
85
|
end
|
66
86
|
end
|
data/lib/dolt/sinatra/actions.rb
CHANGED
@@ -77,6 +77,14 @@ module Dolt
|
|
77
77
|
body(renderer.render(:commits, data))
|
78
78
|
end
|
79
79
|
end
|
80
|
+
|
81
|
+
def refs(repo)
|
82
|
+
actions.refs(repo) do |err, data|
|
83
|
+
return error(err) if !err.nil?
|
84
|
+
response["Content-Type"] = "application/json"
|
85
|
+
body(renderer.render(:refs, data, :layout => nil))
|
86
|
+
end
|
87
|
+
end
|
80
88
|
end
|
81
89
|
end
|
82
90
|
end
|
data/lib/dolt/version.rb
CHANGED
data/lib/dolt/view/blob.rb
CHANGED
@@ -20,9 +20,13 @@ require "htmlentities"
|
|
20
20
|
module Dolt
|
21
21
|
module View
|
22
22
|
module Blob
|
23
|
-
def
|
23
|
+
def entityfy(content)
|
24
24
|
@coder ||= HTMLEntities.new
|
25
|
-
|
25
|
+
@coder.encode(content)
|
26
|
+
end
|
27
|
+
|
28
|
+
def format_blob(path, content)
|
29
|
+
multiline(entityfy(content))
|
26
30
|
end
|
27
31
|
|
28
32
|
def blob_url(repository, ref, path)
|
@@ -41,6 +45,10 @@ module Dolt
|
|
41
45
|
repo_url(repository, "/raw/#{ref}:#{path}")
|
42
46
|
end
|
43
47
|
|
48
|
+
def format_whitespace(text)
|
49
|
+
text
|
50
|
+
end
|
51
|
+
|
44
52
|
def multiline(blob, options = {})
|
45
53
|
class_names = options[:class_names] || []
|
46
54
|
class_names << "prettyprint" << "linenums"
|
@@ -48,7 +56,10 @@ module Dolt
|
|
48
56
|
num = 0
|
49
57
|
lines = blob.split("\n").inject("") do |html, line|
|
50
58
|
num += 1
|
51
|
-
|
59
|
+
# Empty elements causes annoying rendering artefacts
|
60
|
+
# Forcing one space on each line affects copy-paste negatively
|
61
|
+
# TODO: Don't force one space, find CSS fix
|
62
|
+
line = format_whitespace(line).sub(/^$/, " ")
|
52
63
|
"#{html}<li class=\"L#{num}\"><span class=\"line\">#{line}</span></li>"
|
53
64
|
end
|
54
65
|
|
@@ -24,7 +24,7 @@ module Dolt
|
|
24
24
|
options = { :lexer => lexer(path, code) }.merge(opt)
|
25
25
|
Pygments.highlight(code, highlight_options(options))
|
26
26
|
rescue RubyPython::PythonError
|
27
|
-
code
|
27
|
+
respond_to?(:entityfy) ? entityfy(code) : code
|
28
28
|
end
|
29
29
|
|
30
30
|
def highlight_multiline(path, code, options = {})
|
@@ -78,6 +78,7 @@ module Dolt
|
|
78
78
|
end
|
79
79
|
|
80
80
|
Dolt::View::SyntaxHighlight.add_lexer_alias("yml", "yaml")
|
81
|
+
Dolt::View::SyntaxHighlight.add_lexer_alias("ru", "rb")
|
81
82
|
Dolt::View::SyntaxHighlight.add_lexer_alias("Rakefile", "rb")
|
82
83
|
Dolt::View::SyntaxHighlight.add_lexer_alias("Gemfile", "rb")
|
83
84
|
Dolt::View::SyntaxHighlight.add_lexer_alias("Gemfile.lock", "yaml")
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2012 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
|
19
|
+
module Dolt
|
20
|
+
module View
|
21
|
+
module TabWidth
|
22
|
+
def self.tab_width; @@tab_width; end
|
23
|
+
def self.tab_width=(tab_width); @@tab_width = tab_width; end
|
24
|
+
|
25
|
+
def format_whitespace(text)
|
26
|
+
text.gsub(/\t/, " " * TabWidth.tab_width)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -18,29 +18,25 @@
|
|
18
18
|
require "test_helper"
|
19
19
|
require "dolt/repo_actions"
|
20
20
|
require "dolt/async/when"
|
21
|
+
require "ostruct"
|
21
22
|
|
22
23
|
class Repository
|
23
24
|
attr_reader :name
|
24
25
|
def initialize(name); @name = name; end
|
26
|
+
def rev_parse(rev); stub; end
|
27
|
+
def blame(ref, path); stub; end
|
28
|
+
def log(ref, path, limit); stub; end
|
29
|
+
def refs; stub; end
|
25
30
|
|
26
|
-
def
|
27
|
-
@deferred
|
28
|
-
@deferred.promise
|
29
|
-
end
|
30
|
-
|
31
|
-
def blame(ref, path)
|
32
|
-
@deferred = When::Deferred.new
|
33
|
-
@deferred.promise
|
31
|
+
def resolve_promise(blob)
|
32
|
+
@deferred.resolve(blob)
|
34
33
|
end
|
35
34
|
|
36
|
-
|
35
|
+
private
|
36
|
+
def stub
|
37
37
|
@deferred = When::Deferred.new
|
38
38
|
@deferred.promise
|
39
39
|
end
|
40
|
-
|
41
|
-
def resolve_promise(blob)
|
42
|
-
@deferred.resolve(blob)
|
43
|
-
end
|
44
40
|
end
|
45
41
|
|
46
42
|
class Resolver
|
@@ -161,4 +157,30 @@ describe Dolt::RepoActions do
|
|
161
157
|
assert_equal expected, data
|
162
158
|
end
|
163
159
|
end
|
160
|
+
|
161
|
+
describe "#refs" do
|
162
|
+
before do
|
163
|
+
@refs = ["refs/stash",
|
164
|
+
"refs/tags/v0.2.1",
|
165
|
+
"refs/tags/v0.2.0",
|
166
|
+
"refs/remotes/origin/master",
|
167
|
+
"refs/heads/libgit2",
|
168
|
+
"refs/heads/master"].map { |n| OpenStruct.new(:name => n) }
|
169
|
+
end
|
170
|
+
|
171
|
+
it "yields repositories, tags and heads" do
|
172
|
+
data = nil
|
173
|
+
@actions.refs("gitorious") { |err, d| data = d }
|
174
|
+
|
175
|
+
repo = @resolver.resolved.last
|
176
|
+
repo.resolve_promise(@refs)
|
177
|
+
|
178
|
+
expected = {
|
179
|
+
:repository => "gitorious",
|
180
|
+
:heads => ["libgit2", "master"],
|
181
|
+
:tags => ["v0.2.1", "v0.2.0"]
|
182
|
+
}
|
183
|
+
assert_equal expected, data
|
184
|
+
end
|
185
|
+
end
|
164
186
|
end
|
@@ -99,6 +99,10 @@ class Actions
|
|
99
99
|
respond(:history, repo, ref, path, &block)
|
100
100
|
end
|
101
101
|
|
102
|
+
def refs(repo, &block)
|
103
|
+
respond(:refs, repo, nil, nil, &block)
|
104
|
+
end
|
105
|
+
|
102
106
|
def respond(type, repo, ref, path, &block)
|
103
107
|
@repo = repo
|
104
108
|
@ref = ref
|
@@ -210,7 +214,7 @@ describe Dolt::Sinatra::Actions do
|
|
210
214
|
assert_equal "app/models/repository.rb", actions.path
|
211
215
|
end
|
212
216
|
|
213
|
-
it "renders the blame template as
|
217
|
+
it "renders the blame template as html" do
|
214
218
|
app = DummySinatraApp.new(Actions.new(BlobStub.new), Renderer.new("Text"))
|
215
219
|
app.blame("gitorious", "master", "app/models/repository.rb")
|
216
220
|
|
@@ -230,7 +234,7 @@ describe Dolt::Sinatra::Actions do
|
|
230
234
|
assert_equal "app/models/repository.rb", actions.path
|
231
235
|
end
|
232
236
|
|
233
|
-
it "renders the commits template as
|
237
|
+
it "renders the commits template as html" do
|
234
238
|
app = DummySinatraApp.new(Actions.new(BlobStub.new), Renderer.new("Text"))
|
235
239
|
app.history("gitorious", "master", "app/models/repository.rb", 10)
|
236
240
|
|
@@ -238,4 +242,14 @@ describe Dolt::Sinatra::Actions do
|
|
238
242
|
assert_equal "commits:Text", app.body
|
239
243
|
end
|
240
244
|
end
|
245
|
+
|
246
|
+
describe "#refs" do
|
247
|
+
it "renders the refs template as json" do
|
248
|
+
app = DummySinatraApp.new(Actions.new(BlobStub.new), Renderer.new("JSON"))
|
249
|
+
app.refs("gitorious")
|
250
|
+
|
251
|
+
assert_equal "application/json", app.response["Content-Type"]
|
252
|
+
assert_equal "refs:JSON", app.body
|
253
|
+
end
|
254
|
+
end
|
241
255
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2012 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
require "test_helper"
|
19
|
+
require "dolt/template_renderer"
|
20
|
+
require "dolt/view"
|
21
|
+
require "json"
|
22
|
+
|
23
|
+
describe "refs template" do
|
24
|
+
include Dolt::ViewTest
|
25
|
+
|
26
|
+
before do
|
27
|
+
@repo = "the-dolt"
|
28
|
+
@template_root = File.join(File.dirname(__FILE__), "..", "..", "..", "views")
|
29
|
+
@renderer = prepare_renderer(@template_root)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "renders JSON" do
|
33
|
+
data = { "heads" => ["libgit2", "master"], "tags" => ["v2.1.0"] }
|
34
|
+
html = @renderer.render(:refs, data)
|
35
|
+
|
36
|
+
assert_equal data, JSON.parse(html)
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2012 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
require "test_helper"
|
19
|
+
require "dolt/view/smart_blob_renderer"
|
20
|
+
|
21
|
+
describe Dolt::View::SmartBlobRenderer do
|
22
|
+
include Dolt::View::Blob
|
23
|
+
include Dolt::View::SmartBlobRenderer
|
24
|
+
|
25
|
+
describe "#format_blob" do
|
26
|
+
it "highlights a Ruby file" do
|
27
|
+
html = format_blob("file.rb", "class File\n attr_reader :path\nend")
|
28
|
+
|
29
|
+
assert_match "<span class=\"k\">class</span>", html
|
30
|
+
assert_match "<span class=\"nc\">File</span>", html
|
31
|
+
end
|
32
|
+
|
33
|
+
it "wraps markup in .gts-markup" do
|
34
|
+
html = render_markup("file.md", "# Hey")
|
35
|
+
assert_match "<div class=\"gts-markup\">", html
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2012 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
require "test_helper"
|
19
|
+
require "dolt/view/tab_width"
|
20
|
+
|
21
|
+
describe Dolt::View::TabWidth do
|
22
|
+
include Dolt::View::Blob
|
23
|
+
include Dolt::View::TabWidth
|
24
|
+
|
25
|
+
describe "#format_whitespace" do
|
26
|
+
it "limits width of whitespace" do
|
27
|
+
Dolt::View::TabWidth.tab_width = 4
|
28
|
+
html = format_whitespace("class File\n\tattr_reader :path\nend")
|
29
|
+
|
30
|
+
assert_match(/ attr_reader/, html)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "uses wide tabs in formatted blobs" do
|
34
|
+
Dolt::View::TabWidth.tab_width = 12
|
35
|
+
html = format_blob("file.rb", "class File\n\tattr_reader :path\nend")
|
36
|
+
|
37
|
+
assert_match(/ attr_reader/, html)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|