gitlab-grack 2.0.0 → 2.0.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fdf3609511e6c0a489c572a4add4f89af65bae4b
4
- data.tar.gz: 8ad35782833f609c0dba191250746d5a2dfd20bc
3
+ metadata.gz: 25c3243797c8eb47ef7a3b23c51b158302e1a678
4
+ data.tar.gz: 7f61020402644b75ccd37b71b8685b2ffe2bb098
5
5
  SHA512:
6
- metadata.gz: 4f506cdcc801556af8b5ab796d8ebf46585ef4025805307bc2cef094a653c5a3a2b3efa941bf61f48593def2696b99ba31c4a026e0195309d63e1ede3d70f0e9
7
- data.tar.gz: 0c5bb7dd97d1d5f07e57d3642a0f27b3bdc3d65b00586780d0e23a435e16f2ff5fd2f2185b563070ad77cd0ff15e695471466498dc7868af04ba4416e4ebfbd1
6
+ metadata.gz: 111327afddbdd3c21e878264390031f3a8eec351402c044759dcaefe2403a2d17324e4d2351535dd116e9fa30a6039621f8ac19782c82e2ba2a802394725f3a9
7
+ data.tar.gz: dc300d7e110cef0d994943c309a3ad92ba91ee6e43432a11d8ba0df55685e5087c401b0edd38d7de951a3e615bbf4650dd34fafe9775cfe408eb5091a8ecbcf7
data/.gitignore CHANGED
@@ -1,4 +1,5 @@
1
1
  coverage/
2
2
  examples/*.git
3
+ tests/*.git
3
4
  pkg/
4
5
  *.gem
data/.travis.yml CHANGED
@@ -5,10 +5,9 @@ branches:
5
5
  only:
6
6
  - 'master'
7
7
  rvm:
8
- - 1.9.3-p327
9
8
  - 2.0.0
10
9
  before_script:
11
10
  - "bundle install"
12
- - "git submodule init"
13
- - "git submodule update"
11
+ - "git clone --bare git://github.com/schacon/simplegit.git tests/example.git"
12
+ - "cd tests/example.git && git repack && cd ../.."
14
13
  script: "bundle exec rake"
data/CHANGELOG CHANGED
@@ -1,3 +1,6 @@
1
+ 2.0.1
2
+ Make sure child processes get reaped after popen, again.
3
+
1
4
  2.0.0
2
5
  - Use safer shell commands and avoid Dir.chdir
3
6
  - Restrict the environment for shell commands
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- gitlab-grack (2.0.0.rc2)
4
+ gitlab-grack (2.0.1)
5
5
  rack (~> 1.5.1)
6
6
 
7
7
  GEM
data/Rakefile CHANGED
@@ -5,9 +5,13 @@ task :default => :test
5
5
 
6
6
  desc "Run the tests."
7
7
  task :test do
8
+ system "git clone --bare git://github.com/schacon/simplegit.git tests/example.git"
9
+ # We could put this in a chdir block but we should keep it consistent with Travis
10
+ system "cd tests/example.git && git repack && cd ../.."
8
11
  Dir.glob("tests/*_test.rb").each do |f|
9
12
  system "ruby #{f}"
10
13
  end
14
+ system "rm -rf tests/example.git"
11
15
  end
12
16
 
13
17
  desc "Run test coverage."
data/lib/grack/git.rb CHANGED
@@ -16,7 +16,10 @@ module Grack
16
16
  end
17
17
 
18
18
  def capture(cmd)
19
- IO.popen(popen_env, cmd, popen_options).read
19
+ # _Not_ the same as `IO.popen(...).read`
20
+ # By using a block we tell IO.popen to close (wait for) the child process
21
+ # after we are done reading its output.
22
+ IO.popen(popen_env, cmd, popen_options) { |p| p.read }
20
23
  end
21
24
 
22
25
  def execute(cmd)
data/lib/grack/server.rb CHANGED
@@ -82,7 +82,8 @@ module Grack
82
82
  pipe.write(input)
83
83
  pipe.close_write
84
84
 
85
- while block = pipe.read(8192) # 8KB at a time
85
+ while !pipe.eof?
86
+ block = pipe.read(8192) # 8KB at a time
86
87
  @res.write encode_chunk(block) # stream it to the client
87
88
  end
88
89
 
@@ -102,13 +103,14 @@ module Grack
102
103
 
103
104
  def get_info_refs
104
105
  service_name = get_service_type
105
- return dumb_info_refs unless has_access?(service_name)
106
+ return dumb_info_refs unless smart_http?(service_name)
107
+ return render_no_access unless has_access?(service_name)
106
108
 
107
109
  refs = git.execute([service_name, '--stateless-rpc', '--advertise-refs', git.repo])
108
110
 
109
111
  @res = Rack::Response.new
110
112
  @res.status = 200
111
- @res["Content-Type"] = "application/x-git-%s-advertisement" % service_name
113
+ @res["Content-Type"] = "application/x-git-#{service_name}-advertisement"
112
114
  hdr_nocache
113
115
 
114
116
  @res.write(pkt_write("# service=git-#{service_name}\n"))
@@ -226,10 +228,13 @@ module Grack
226
228
  nil
227
229
  end
228
230
 
231
+ def smart_http?(rpc = @rpc)
232
+ @req.content_type == "application/x-git-#{rpc}-request"
233
+ end
234
+
229
235
  def has_access?(rpc, check_content_type = false)
230
236
  if check_content_type
231
- conten_type = "application/x-git-%s-request" % rpc
232
- return false unless @req.content_type == conten_type
237
+ return false unless smart_http?(rpc)
233
238
  end
234
239
 
235
240
  return false unless ['upload-pack', 'receive-pack'].include?(rpc)
data/lib/grack/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Grack
2
- VERSION = "2.0.0"
2
+ VERSION = "2.0.1"
3
3
  end
data/tests/main_test.rb CHANGED
@@ -25,7 +25,7 @@ class GitHttpTest < Test::Unit::TestCase
25
25
  end
26
26
 
27
27
  def test_upload_pack_advertisement
28
- get "/example/info/refs?service=git-upload-pack"
28
+ get "/example.git/info/refs?service=git-upload-pack", {}, {"CONTENT_TYPE" => "application/x-git-upload-pack-request"}
29
29
  assert_equal 200, r.status
30
30
  assert_equal "application/x-git-upload-pack-advertisement", r.headers["Content-Type"]
31
31
  assert_equal "001e# service=git-upload-pack", r.body.split("\n").first
@@ -33,22 +33,22 @@ class GitHttpTest < Test::Unit::TestCase
33
33
  end
34
34
 
35
35
  def test_no_access_wrong_content_type_up
36
- post "/example/git-upload-pack"
36
+ post "/example.git/git-upload-pack"
37
37
  assert_equal 403, r.status
38
38
  end
39
39
 
40
40
  def test_no_access_wrong_content_type_rp
41
- post "/example/git-receive-pack"
41
+ post "/example.git/git-receive-pack"
42
42
  assert_equal 403, r.status
43
43
  end
44
44
 
45
45
  def test_no_access_wrong_method_rcp
46
- get "/example/git-upload-pack"
46
+ get "/example.git/git-upload-pack"
47
47
  assert_equal 400, r.status
48
48
  end
49
49
 
50
50
  def test_no_access_wrong_command_rcp
51
- post "/example/git-upload-packfile"
51
+ post "/example.git/git-upload-packfile"
52
52
  assert_equal 404, r.status
53
53
  end
54
54
 
@@ -61,13 +61,13 @@ class GitHttpTest < Test::Unit::TestCase
61
61
  def test_upload_pack_rpc
62
62
  Grack::Git.any_instance.stubs(:valid_repo?).returns(true)
63
63
  IO.stubs(:popen).returns(MockProcess.new)
64
- post "/example/git-upload-pack", {}, {"CONTENT_TYPE" => "application/x-git-upload-pack-request"}
64
+ post "/example.git/git-upload-pack", {}, {"CONTENT_TYPE" => "application/x-git-upload-pack-request"}
65
65
  assert_equal 200, r.status
66
66
  assert_equal "application/x-git-upload-pack-result", r.headers["Content-Type"]
67
67
  end
68
68
 
69
69
  def test_receive_pack_advertisement
70
- get "/example/info/refs?service=git-receive-pack"
70
+ get "/example.git/info/refs?service=git-receive-pack", {}, {"CONTENT_TYPE" => "application/x-git-receive-pack-request"}
71
71
  assert_equal 200, r.status
72
72
  assert_equal "application/x-git-receive-pack-advertisement", r.headers["Content-Type"]
73
73
  assert_equal "001f# service=git-receive-pack", r.body.split("\n").first
@@ -79,25 +79,25 @@ class GitHttpTest < Test::Unit::TestCase
79
79
  def test_recieve_pack_rpc
80
80
  Grack::Git.any_instance.stubs(:valid_repo?).returns(true)
81
81
  IO.stubs(:popen).yields(MockProcess.new)
82
- post "/example/git-receive-pack", {}, {"CONTENT_TYPE" => "application/x-git-receive-pack-request"}
82
+ post "/example.git/git-receive-pack", {}, {"CONTENT_TYPE" => "application/x-git-receive-pack-request"}
83
83
  assert_equal 200, r.status
84
84
  assert_equal "application/x-git-receive-pack-result", r.headers["Content-Type"]
85
85
  end
86
86
 
87
87
  def test_info_refs_dumb
88
- get "/example/.git/info/refs"
88
+ get "/example.git/info/refs"
89
89
  assert_equal 200, r.status
90
90
  end
91
91
 
92
92
  def test_info_packs
93
- get "/example/.git/objects/info/packs"
93
+ get "/example.git/objects/info/packs"
94
94
  assert_equal 200, r.status
95
95
  assert_match /P pack-(.*?).pack/, r.body
96
96
  end
97
97
 
98
98
  def test_loose_objects
99
99
  path, content = write_test_objects
100
- get "/example/.git/objects/#{path}"
100
+ get "/example.git/objects/#{path}"
101
101
  assert_equal 200, r.status
102
102
  assert_equal content, r.body
103
103
  remove_test_objects
@@ -105,7 +105,7 @@ class GitHttpTest < Test::Unit::TestCase
105
105
 
106
106
  def test_pack_file
107
107
  path, content = write_test_objects
108
- get "/example/.git/objects/pack/pack-#{content}.pack"
108
+ get "/example.git/objects/pack/pack-#{content}.pack"
109
109
  assert_equal 200, r.status
110
110
  assert_equal content, r.body
111
111
  remove_test_objects
@@ -113,44 +113,44 @@ class GitHttpTest < Test::Unit::TestCase
113
113
 
114
114
  def test_index_file
115
115
  path, content = write_test_objects
116
- get "/example/.git/objects/pack/pack-#{content}.idx"
116
+ get "/example.git/objects/pack/pack-#{content}.idx"
117
117
  assert_equal 200, r.status
118
118
  assert_equal content, r.body
119
119
  remove_test_objects
120
120
  end
121
121
 
122
122
  def test_text_file
123
- get "/example/.git/HEAD"
123
+ get "/example.git/HEAD"
124
124
  assert_equal 200, r.status
125
- assert_equal 41, r.body.size # submodules have detached head
125
+ assert_equal 23, r.body.size # submodules have detached head
126
126
  end
127
127
 
128
128
  def test_no_size_avail
129
129
  File.stubs('size?').returns(false)
130
- get "/example/.git/HEAD"
130
+ get "/example.git/HEAD"
131
131
  assert_equal 200, r.status
132
- assert_equal 46, r.body.size # submodules have detached head
132
+ assert_equal 28, r.body.size # submodules have detached head
133
133
  end
134
134
 
135
135
  def test_config_upload_pack_off
136
136
  a1 = app
137
137
  a1.set_config_setting(:upload_pack, false)
138
138
  session = Rack::Test::Session.new(a1)
139
- session.get "/example/info/refs?service=git-upload-pack"
140
- assert_equal 404, session.last_response.status
139
+ session.get "/example.git/info/refs?service=git-upload-pack", {}, {"CONTENT_TYPE" => "application/x-git-upload-pack-request"}
140
+ assert_equal 403, session.last_response.status
141
141
  end
142
142
 
143
143
  def test_config_receive_pack_off
144
144
  a1 = app
145
145
  a1.set_config_setting(:receive_pack, false)
146
146
  session = Rack::Test::Session.new(a1)
147
- session.get "/example/info/refs?service=git-receive-pack"
148
- assert_equal 404, session.last_response.status
147
+ session.get "/example.git/info/refs?service=git-receive-pack", {}, {"CONTENT_TYPE" => "application/x-git-receive-pack-request"}
148
+ assert_equal 403, session.last_response.status
149
149
  end
150
150
 
151
151
  def test_config_bad_service
152
- get "/example/info/refs?service=git-receive-packfile"
153
- assert_equal 404, r.status
152
+ get "/example.git/info/refs?service=git-receive-packfile", {}, {"CONTENT_TYPE" => "application/x-git-receive-packfile-request"}
153
+ assert_equal 403, r.status
154
154
  end
155
155
 
156
156
  def test_git_config_receive_pack
@@ -159,16 +159,16 @@ class GitHttpTest < Test::Unit::TestCase
159
159
  session = Rack::Test::Session.new(app1)
160
160
  git = Grack::Git
161
161
  git.any_instance.stubs(:config).with('http.receivepack').returns('')
162
- session.get "/example/info/refs?service=git-receive-pack"
163
- assert_equal 404, session.last_response.status
162
+ session.get "/example.git/info/refs?service=git-receive-pack", {}, {"CONTENT_TYPE" => "application/x-git-receive-pack-request"}
163
+ assert_equal 403, session.last_response.status
164
164
 
165
165
  git.any_instance.stubs(:config).with('http.receivepack').returns('true')
166
- session.get "/example/info/refs?service=git-receive-pack"
166
+ session.get "/example.git/info/refs?service=git-receive-pack", {}, {"CONTENT_TYPE" => "application/x-git-receive-pack-request"}
167
167
  assert_equal 200, session.last_response.status
168
168
 
169
169
  git.any_instance.stubs(:config).with('http.receivepack').returns('false')
170
- session.get "/example/info/refs?service=git-receive-pack"
171
- assert_equal 404, session.last_response.status
170
+ session.get "/example.git/info/refs?service=git-receive-pack", {}, {"CONTENT_TYPE" => "application/x-git-receive-pack-request"}
171
+ assert_equal 403, session.last_response.status
172
172
  end
173
173
 
174
174
  def test_git_config_upload_pack
@@ -177,16 +177,16 @@ class GitHttpTest < Test::Unit::TestCase
177
177
  session = Rack::Test::Session.new(app1)
178
178
  git = Grack::Git
179
179
  git.any_instance.stubs(:config).with('http.uploadpack').returns('')
180
- session.get "/example/info/refs?service=git-upload-pack"
180
+ session.get "/example.git/info/refs?service=git-upload-pack", {}, {"CONTENT_TYPE" => "application/x-git-upload-pack-request"}
181
181
  assert_equal 200, session.last_response.status
182
182
 
183
183
  git.any_instance.stubs(:config).with('http.uploadpack').returns('true')
184
- session.get "/example/info/refs?service=git-upload-pack"
184
+ session.get "/example.git/info/refs?service=git-upload-pack", {}, {"CONTENT_TYPE" => "application/x-git-upload-pack-request"}
185
185
  assert_equal 200, session.last_response.status
186
186
 
187
187
  git.any_instance.stubs(:config).with('http.uploadpack').returns('false')
188
- session.get "/example/info/refs?service=git-upload-pack"
189
- assert_equal 404, session.last_response.status
188
+ session.get "/example.git/info/refs?service=git-upload-pack", {}, {"CONTENT_TYPE" => "application/x-git-upload-pack-request"}
189
+ assert_equal 403, session.last_response.status
190
190
  end
191
191
 
192
192
  def test_send_file
@@ -215,7 +215,7 @@ class GitHttpTest < Test::Unit::TestCase
215
215
 
216
216
  def write_test_objects
217
217
  content = Digest::SHA1.hexdigest('gitrocks')
218
- base = File.join(File.expand_path(File.dirname(__FILE__)), 'example', '.git', 'objects')
218
+ base = File.join(File.expand_path(File.dirname(__FILE__)), 'example.git', 'objects')
219
219
  obj = File.join(base, '20')
220
220
  Dir.mkdir(obj) rescue nil
221
221
  file = File.join(obj, content[0, 38])
@@ -229,7 +229,7 @@ class GitHttpTest < Test::Unit::TestCase
229
229
 
230
230
  def remove_test_objects
231
231
  content = Digest::SHA1.hexdigest('gitrocks')
232
- base = File.join(File.expand_path(File.dirname(__FILE__)), 'example', '.git', 'objects')
232
+ base = File.join(File.expand_path(File.dirname(__FILE__)), 'example.git', 'objects')
233
233
  obj = File.join(base, '20')
234
234
  file = File.join(obj, content[0, 38])
235
235
  pack = File.join(base, 'pack', "pack-#{content}.pack")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab-grack
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Chacon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-17 00:00:00.000000000 Z
11
+ date: 2015-04-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -48,7 +48,6 @@ extensions: []
48
48
  extra_rdoc_files: []
49
49
  files:
50
50
  - ".gitignore"
51
- - ".gitmodules"
52
51
  - ".travis.yml"
53
52
  - CHANGELOG
54
53
  - Gemfile
@@ -92,4 +91,3 @@ specification_version: 4
92
91
  summary: Ruby/Rack Git Smart-HTTP Server Handler
93
92
  test_files:
94
93
  - tests/main_test.rb
95
- has_rdoc:
data/.gitmodules DELETED
@@ -1,3 +0,0 @@
1
- [submodule "tests/example"]
2
- path = tests/example
3
- url = git://github.com/schacon/simplegit.git