dolt 0.10.0 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +8 -12
- data/dolt.gemspec +2 -2
- data/lib/dolt/sinatra/actions.rb +49 -6
- data/test/dolt/sinatra/actions_test.rb +139 -2
- metadata +3 -3
data/Gemfile.lock
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
dolt (0.
|
4
|
+
dolt (0.11.0)
|
5
5
|
async_sinatra (~> 1.0)
|
6
6
|
json (~> 1.5)
|
7
|
-
libdolt (~> 0.
|
7
|
+
libdolt (~> 0.15)
|
8
8
|
sinatra (~> 1.0)
|
9
9
|
thin (~> 1.4)
|
10
10
|
tiltout (~> 1.4)
|
@@ -24,10 +24,10 @@ GEM
|
|
24
24
|
eventmachine (~> 1.0)
|
25
25
|
rugged (= 0.17.0.b6)
|
26
26
|
eventmachine (1.0.0)
|
27
|
-
github-markup (0.7.
|
27
|
+
github-markup (0.7.5)
|
28
28
|
htmlentities (4.3.1)
|
29
|
-
json (1.7.
|
30
|
-
libdolt (0.
|
29
|
+
json (1.7.6)
|
30
|
+
libdolt (0.15.0)
|
31
31
|
em_pessimistic (~> 0.1)
|
32
32
|
em_rugged (~> 0.3)
|
33
33
|
eventmachine (~> 1.0)
|
@@ -41,17 +41,14 @@ GEM
|
|
41
41
|
github-markup (~> 0.7)
|
42
42
|
htmlentities (~> 4.3)
|
43
43
|
pygments.rb (~> 0.2)
|
44
|
-
metaclass (0.0.1)
|
45
44
|
mime-types (1.19)
|
46
45
|
minitest (2.12.1)
|
47
|
-
mocha (0.12.7)
|
48
|
-
metaclass (~> 0.0.1)
|
49
46
|
posix-spawn (0.3.6)
|
50
|
-
pygments.rb (0.3.
|
47
|
+
pygments.rb (0.3.7)
|
51
48
|
posix-spawn (~> 0.3.6)
|
52
49
|
yajl-ruby (~> 1.1.0)
|
53
|
-
rack (1.4.
|
54
|
-
rack-protection (1.2
|
50
|
+
rack (1.4.3)
|
51
|
+
rack-protection (1.3.2)
|
55
52
|
rack
|
56
53
|
rake (0.9.2.2)
|
57
54
|
rugged (0.17.0.b6)
|
@@ -77,5 +74,4 @@ DEPENDENCIES
|
|
77
74
|
dolt!
|
78
75
|
em-minitest-spec (~> 1.1)
|
79
76
|
minitest (~> 2.0)
|
80
|
-
mocha
|
81
77
|
rake (~> 0.9)
|
data/dolt.gemspec
CHANGED
@@ -11,7 +11,7 @@ end
|
|
11
11
|
|
12
12
|
Gem::Specification.new do |s|
|
13
13
|
s.name = "dolt"
|
14
|
-
s.version = "0.
|
14
|
+
s.version = "0.11.0"
|
15
15
|
s.authors = ["Christian Johansen"]
|
16
16
|
s.email = ["christian@gitorious.org"]
|
17
17
|
s.homepage = "http://gitorious.org/gitorious/dolt"
|
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
|
|
20
20
|
|
21
21
|
s.rubyforge_project = "dolt"
|
22
22
|
|
23
|
-
s.add_dependency "libdolt", "~>0.
|
23
|
+
s.add_dependency "libdolt", "~>0.15"
|
24
24
|
s.add_dependency "thin", "~>1.4"
|
25
25
|
s.add_dependency "sinatra", "~>1.0"
|
26
26
|
s.add_dependency "async_sinatra", "~>1.0"
|
data/lib/dolt/sinatra/actions.rb
CHANGED
@@ -54,6 +54,10 @@ module Dolt
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def raw(repo, ref, path)
|
57
|
+
if oid = lookup_ref_oid(repo, ref)
|
58
|
+
redirect(raw_url(repo, oid, path)) and return
|
59
|
+
end
|
60
|
+
|
57
61
|
blob(repo, ref, path, {
|
58
62
|
:template => :raw,
|
59
63
|
:content_type => "text/plain",
|
@@ -62,7 +66,11 @@ module Dolt
|
|
62
66
|
end
|
63
67
|
|
64
68
|
def blob(repo, ref, path, options = { :template => :blob })
|
65
|
-
|
69
|
+
if oid = lookup_ref_oid(repo, ref)
|
70
|
+
redirect(blob_url(repo, oid, path)) and return
|
71
|
+
end
|
72
|
+
|
73
|
+
actions.blob(repo, u(ref), path) do |err, data|
|
66
74
|
next error(err, repo, ref) if !err.nil?
|
67
75
|
blob = data[:blob]
|
68
76
|
next redirect(tree_url(repo, ref, path)) if blob.class.to_s !~ /\bBlob/
|
@@ -73,7 +81,11 @@ module Dolt
|
|
73
81
|
end
|
74
82
|
|
75
83
|
def tree(repo, ref, path)
|
76
|
-
|
84
|
+
if oid = lookup_ref_oid(repo, ref)
|
85
|
+
redirect(tree_url(repo, oid, path)) and return
|
86
|
+
end
|
87
|
+
|
88
|
+
actions.tree(repo, u(ref), path) do |err, data|
|
77
89
|
begin
|
78
90
|
next error(err, repo, ref) if !err.nil?
|
79
91
|
tree = data[:tree]
|
@@ -87,7 +99,11 @@ module Dolt
|
|
87
99
|
end
|
88
100
|
|
89
101
|
def tree_entry(repo, ref, path)
|
90
|
-
|
102
|
+
if oid = lookup_ref_oid(repo, ref)
|
103
|
+
redirect(tree_entry_url(repo, oid, path)) and return
|
104
|
+
end
|
105
|
+
|
106
|
+
actions.tree_entry(repo, u(ref), path) do |err, data|
|
91
107
|
begin
|
92
108
|
next error(err, repo, ref) if !err.nil?
|
93
109
|
add_headers(response, :ref => ref)
|
@@ -99,7 +115,11 @@ module Dolt
|
|
99
115
|
end
|
100
116
|
|
101
117
|
def blame(repo, ref, path)
|
102
|
-
|
118
|
+
if oid = lookup_ref_oid(repo, ref)
|
119
|
+
redirect(blame_url(repo, oid, path)) and return
|
120
|
+
end
|
121
|
+
|
122
|
+
actions.blame(repo, u(ref), path) do |err, data|
|
103
123
|
next error(err, repo, ref) if !err.nil?
|
104
124
|
add_headers(response, :ref => ref)
|
105
125
|
body(renderer.render(:blame, data))
|
@@ -107,7 +127,11 @@ module Dolt
|
|
107
127
|
end
|
108
128
|
|
109
129
|
def history(repo, ref, path, count)
|
110
|
-
|
130
|
+
if oid = lookup_ref_oid(repo, ref)
|
131
|
+
redirect(history_url(repo, oid, path)) and return
|
132
|
+
end
|
133
|
+
|
134
|
+
actions.history(repo, u(ref), path, count) do |err, data|
|
111
135
|
next error(err, repo, ref) if !err.nil?
|
112
136
|
add_headers(response, :ref => ref)
|
113
137
|
body(renderer.render(:commits, data))
|
@@ -123,7 +147,11 @@ module Dolt
|
|
123
147
|
end
|
124
148
|
|
125
149
|
def tree_history(repo, ref, path, count = 1)
|
126
|
-
|
150
|
+
if oid = lookup_ref_oid(repo, ref)
|
151
|
+
redirect(tree_history_url(repo, oid, path)) and return
|
152
|
+
end
|
153
|
+
|
154
|
+
actions.tree_history(repo, u(ref), path, count) do |err, data|
|
127
155
|
begin
|
128
156
|
if !err.nil?
|
129
157
|
error(err, repo, ref)
|
@@ -137,7 +165,22 @@ module Dolt
|
|
137
165
|
end
|
138
166
|
end
|
139
167
|
|
168
|
+
def resolve_repository(repo)
|
169
|
+
actions.resolve_repository(repo)
|
170
|
+
end
|
171
|
+
|
140
172
|
private
|
173
|
+
def lookup_ref_oid(repo, ref)
|
174
|
+
return if !respond_to?(:redirect_refs?) || !redirect_refs? || ref.length == 40
|
175
|
+
actions.rev_parse_oid(repo, ref)
|
176
|
+
end
|
177
|
+
|
178
|
+
def u(str)
|
179
|
+
# Temporarily swap the + out with a magic byte, so
|
180
|
+
# filenames/branches with +'s won't get unescaped to a space
|
181
|
+
CGI.unescape(str.gsub("+", "\001")).gsub("\001", '+')
|
182
|
+
end
|
183
|
+
|
141
184
|
def add_headers(response, headers = {})
|
142
185
|
default_ct = "text/html; charset=utf-8"
|
143
186
|
response["Content-Type"] = headers[:content_type] || default_ct
|
@@ -48,6 +48,30 @@ class DummySinatraApp
|
|
48
48
|
def blob_url(repo, ref, path)
|
49
49
|
"/#{repo}/blob/#{ref}:#{path}"
|
50
50
|
end
|
51
|
+
|
52
|
+
def tree_entry_url(repo, ref, path)
|
53
|
+
"/#{repo}/source/#{ref}:#{path}"
|
54
|
+
end
|
55
|
+
|
56
|
+
def blame_url(repo, ref, path)
|
57
|
+
"/#{repo}/blame/#{ref}:#{path}"
|
58
|
+
end
|
59
|
+
|
60
|
+
def history_url(repo, ref, path)
|
61
|
+
"/#{repo}/history/#{ref}:#{path}"
|
62
|
+
end
|
63
|
+
|
64
|
+
def tree_history_url(repo, ref, path)
|
65
|
+
"/#{repo}/tree_history/#{ref}:#{path}"
|
66
|
+
end
|
67
|
+
|
68
|
+
def raw_url(repo, ref, path)
|
69
|
+
"/#{repo}/raw/#{ref}:#{path}"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
class RedirectingDummySinatraApp < DummySinatraApp
|
74
|
+
def redirect_refs?; true; end
|
51
75
|
end
|
52
76
|
|
53
77
|
class Renderer
|
@@ -119,6 +143,10 @@ class Actions
|
|
119
143
|
data[type != :tree_entry ? type : (@response.class.to_s =~ /Tree/ ? :tree : :blob)] = @response
|
120
144
|
block.call(nil, data)
|
121
145
|
end
|
146
|
+
|
147
|
+
def rev_parse_oid(repo, ref)
|
148
|
+
"a" * 40
|
149
|
+
end
|
122
150
|
end
|
123
151
|
|
124
152
|
describe Dolt::Sinatra::Actions do
|
@@ -151,11 +179,30 @@ describe Dolt::Sinatra::Actions do
|
|
151
179
|
end
|
152
180
|
|
153
181
|
it "unescapes ref" do
|
154
|
-
|
182
|
+
actions = Actions.new(BlobStub.new)
|
183
|
+
app = DummySinatraApp.new(actions, Renderer.new("Blob"))
|
155
184
|
app.blob("gitorious", "issue-%23221", "app/my documents")
|
156
185
|
|
157
186
|
assert_equal "issue-#221", actions.ref
|
158
187
|
end
|
188
|
+
|
189
|
+
it "does not redirect ref to oid by default" do
|
190
|
+
app = DummySinatraApp.new(Actions.new(BlobStub.new), Renderer.new("Blob"))
|
191
|
+
app.blob("gitorious", "master", "lib/gitorious.rb")
|
192
|
+
|
193
|
+
location = app.response["Location"]
|
194
|
+
refute_equal 302, app.response.status
|
195
|
+
end
|
196
|
+
|
197
|
+
it "redirects ref to oid if configured so" do
|
198
|
+
app = RedirectingDummySinatraApp.new(Actions.new(BlobStub.new), Renderer.new("Blob"))
|
199
|
+
app.blob("gitorious", "master", "lib/gitorious.rb")
|
200
|
+
|
201
|
+
location = app.response["Location"]
|
202
|
+
assert_equal 302, app.response.status
|
203
|
+
assert_equal "/gitorious/blob/#{'a' * 40}:lib/gitorious.rb", location
|
204
|
+
assert_equal "", app.body
|
205
|
+
end
|
159
206
|
end
|
160
207
|
|
161
208
|
describe "#tree" do
|
@@ -208,6 +255,21 @@ describe Dolt::Sinatra::Actions do
|
|
208
255
|
assert_equal "max-age=315360000, public", app.response["Cache-Control"]
|
209
256
|
refute_nil app.response["Expires"]
|
210
257
|
end
|
258
|
+
|
259
|
+
it "unescapes ref" do
|
260
|
+
actions = Actions.new(TreeStub.new)
|
261
|
+
app = DummySinatraApp.new(actions, Renderer.new("Tree"))
|
262
|
+
app.tree("gitorious", "issue-%23221", "app")
|
263
|
+
|
264
|
+
assert_equal "issue-#221", actions.ref
|
265
|
+
end
|
266
|
+
|
267
|
+
it "redirects ref to oid if configured so" do
|
268
|
+
app = RedirectingDummySinatraApp.new(Actions.new(TreeStub.new), Renderer.new("Tree"))
|
269
|
+
app.tree("gitorious", "master", "lib")
|
270
|
+
|
271
|
+
assert_equal "/gitorious/tree/#{'a' * 40}:lib", app.response["Location"]
|
272
|
+
end
|
211
273
|
end
|
212
274
|
|
213
275
|
describe "#tree_entry" do
|
@@ -226,6 +288,21 @@ describe Dolt::Sinatra::Actions do
|
|
226
288
|
assert_equal "text/html; charset=utf-8", app.response["Content-Type"]
|
227
289
|
assert_equal "blob:Blob", app.body
|
228
290
|
end
|
291
|
+
|
292
|
+
it "unescapes ref" do
|
293
|
+
actions = Actions.new(TreeStub.new)
|
294
|
+
app = DummySinatraApp.new(actions, Renderer.new("Tree"))
|
295
|
+
app.tree_entry("gitorious", "issue-%23221", "app")
|
296
|
+
|
297
|
+
assert_equal "issue-#221", actions.ref
|
298
|
+
end
|
299
|
+
|
300
|
+
it "redirects ref to oid if configured so" do
|
301
|
+
app = RedirectingDummySinatraApp.new(Actions.new(TreeStub.new), Renderer.new("Tree"))
|
302
|
+
app.tree_entry("gitorious", "master", "lib")
|
303
|
+
|
304
|
+
assert_equal "/gitorious/source/#{'a' * 40}:lib", app.response["Location"]
|
305
|
+
end
|
229
306
|
end
|
230
307
|
|
231
308
|
describe "#raw" do
|
@@ -256,6 +333,21 @@ describe Dolt::Sinatra::Actions do
|
|
256
333
|
assert_equal "/gitorious/tree/master:app/models", location
|
257
334
|
assert_equal "", app.body
|
258
335
|
end
|
336
|
+
|
337
|
+
it "unescapes ref" do
|
338
|
+
actions = Actions.new(BlobStub.new)
|
339
|
+
app = DummySinatraApp.new(actions, Renderer.new("Blob"))
|
340
|
+
app.raw("gitorious", "issue-%23221", "app/models/repository.rb")
|
341
|
+
|
342
|
+
assert_equal "issue-#221", actions.ref
|
343
|
+
end
|
344
|
+
|
345
|
+
it "redirects ref to oid if configured so" do
|
346
|
+
app = RedirectingDummySinatraApp.new(Actions.new(BlobStub.new), Renderer.new("Blob"))
|
347
|
+
app.raw("gitorious", "master", "lib/gitorious.rb")
|
348
|
+
|
349
|
+
assert_equal "/gitorious/raw/#{'a' * 40}:lib/gitorious.rb", app.response["Location"]
|
350
|
+
end
|
259
351
|
end
|
260
352
|
|
261
353
|
describe "#blame" do
|
@@ -276,6 +368,21 @@ describe Dolt::Sinatra::Actions do
|
|
276
368
|
assert_equal "text/html; charset=utf-8", app.response["Content-Type"]
|
277
369
|
assert_equal "blame:Text", app.body
|
278
370
|
end
|
371
|
+
|
372
|
+
it "unescapes ref" do
|
373
|
+
actions = Actions.new(BlobStub.new)
|
374
|
+
app = DummySinatraApp.new(actions, Renderer.new("Blob"))
|
375
|
+
app.blame("gitorious", "issue-%23221", "app/models/repository.rb")
|
376
|
+
|
377
|
+
assert_equal "issue-#221", actions.ref
|
378
|
+
end
|
379
|
+
|
380
|
+
it "redirects ref to oid if configured so" do
|
381
|
+
app = RedirectingDummySinatraApp.new(Actions.new(BlobStub.new), Renderer.new("Blob"))
|
382
|
+
app.blame("gitorious", "master", "lib/gitorious.rb")
|
383
|
+
|
384
|
+
assert_equal "/gitorious/blame/#{'a' * 40}:lib/gitorious.rb", app.response["Location"]
|
385
|
+
end
|
279
386
|
end
|
280
387
|
|
281
388
|
describe "#history" do
|
@@ -296,6 +403,21 @@ describe Dolt::Sinatra::Actions do
|
|
296
403
|
assert_equal "text/html; charset=utf-8", app.response["Content-Type"]
|
297
404
|
assert_equal "commits:Text", app.body
|
298
405
|
end
|
406
|
+
|
407
|
+
it "unescapes ref" do
|
408
|
+
actions = Actions.new(BlobStub.new)
|
409
|
+
app = DummySinatraApp.new(actions, Renderer.new("Blob"))
|
410
|
+
app.history("gitorious", "issue-%23221", "lib/gitorious.rb", 10)
|
411
|
+
|
412
|
+
assert_equal "issue-#221", actions.ref
|
413
|
+
end
|
414
|
+
|
415
|
+
it "redirects ref to oid if configured so" do
|
416
|
+
app = RedirectingDummySinatraApp.new(Actions.new(BlobStub.new), Renderer.new("Blob"))
|
417
|
+
app.history("gitorious", "master", "lib/gitorious.rb", 10)
|
418
|
+
|
419
|
+
assert_equal "/gitorious/history/#{'a' * 40}:lib/gitorious.rb", app.response["Location"]
|
420
|
+
end
|
299
421
|
end
|
300
422
|
|
301
423
|
describe "#refs" do
|
@@ -310,11 +432,26 @@ describe Dolt::Sinatra::Actions do
|
|
310
432
|
|
311
433
|
describe "#tree_history" do
|
312
434
|
it "renders the tree_history template as json" do
|
313
|
-
app = DummySinatraApp.new(Actions.new(
|
435
|
+
app = DummySinatraApp.new(Actions.new(TreeStub.new), Renderer.new("JSON"))
|
314
436
|
app.tree_history("gitorious", "master", "", 1)
|
315
437
|
|
316
438
|
assert_equal "application/json", app.response["Content-Type"]
|
317
439
|
assert_equal "tree_history:JSON", app.body
|
318
440
|
end
|
441
|
+
|
442
|
+
it "unescapes ref" do
|
443
|
+
actions = Actions.new(TreeStub.new)
|
444
|
+
app = DummySinatraApp.new(actions, Renderer.new("Tree"))
|
445
|
+
app.tree_history("gitorious", "issue-%23221", "app/models")
|
446
|
+
|
447
|
+
assert_equal "issue-#221", actions.ref
|
448
|
+
end
|
449
|
+
|
450
|
+
it "redirects ref to oid if configured so" do
|
451
|
+
app = RedirectingDummySinatraApp.new(Actions.new(TreeStub.new), Renderer.new("Tree"))
|
452
|
+
app.tree_history("gitorious", "master", "lib", 10)
|
453
|
+
|
454
|
+
assert_equal "/gitorious/tree_history/#{'a' * 40}:lib", app.response["Location"]
|
455
|
+
end
|
319
456
|
end
|
320
457
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dolt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '0.
|
21
|
+
version: '0.15'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: '0.
|
29
|
+
version: '0.15'
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: thin
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|