gitlab-grack 2.0.0.pre → 2.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
metadata CHANGED
@@ -1,41 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab-grack
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.pre
4
+ version: 2.0.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Chacon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-06 00:00:00.000000000 Z
11
+ date: 2015-01-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: 1.5.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 1.5.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: mocha
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0.11'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0.11'
41
41
  description: Ruby/Rack Git Smart-HTTP Server Handler
@@ -45,23 +45,28 @@ executables: []
45
45
  extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
- - .gitignore
49
- - .gitmodules
50
- - .travis.yml
51
- - CHANGELOG
48
+ - ".gitignore"
49
+ - ".ssh/.gitkeep"
52
50
  - Gemfile
53
51
  - Gemfile.lock
52
+ - Makefile
53
+ - Procfile.example
54
54
  - README.md
55
- - Rakefile
56
- - examples/dispatch.fcgi
57
- - grack.gemspec
58
- - install.txt
59
- - lib/grack.rb
60
- - lib/grack/auth.rb
61
- - lib/grack/bundle.rb
62
- - lib/grack/server.rb
63
- - lib/grack/version.rb
64
- - tests/main_test.rb
55
+ - Vagrantfile
56
+ - database.yml.example
57
+ - gitlab-openldap/.gitignore
58
+ - gitlab-openldap/Makefile
59
+ - gitlab-openldap/README.md
60
+ - gitlab-openldap/bootstrap.ldif
61
+ - gitlab-openldap/frontend.alt.example.com.ldif
62
+ - gitlab-openldap/frontend.example.com.ldif
63
+ - gitlab-openldap/run-slapd
64
+ - gitlab-openldap/run-slapd-alt
65
+ - gitlab-satellites/.gitkeep
66
+ - redis/redis.conf.example
67
+ - redis/resque.yml.example
68
+ - repositories/.gitkeep
69
+ - support/edit-gitlab.yml
65
70
  homepage: https://github.com/gitlabhq/grack
66
71
  licenses: []
67
72
  metadata: {}
@@ -71,19 +76,18 @@ require_paths:
71
76
  - lib
72
77
  required_ruby_version: !ruby/object:Gem::Requirement
73
78
  requirements:
74
- - - '>='
79
+ - - ">="
75
80
  - !ruby/object:Gem::Version
76
81
  version: '0'
77
82
  required_rubygems_version: !ruby/object:Gem::Requirement
78
83
  requirements:
79
- - - '>'
84
+ - - ">"
80
85
  - !ruby/object:Gem::Version
81
86
  version: 1.3.1
82
87
  requirements: []
83
88
  rubyforge_project:
84
- rubygems_version: 2.1.11
89
+ rubygems_version: 2.4.3
85
90
  signing_key:
86
91
  specification_version: 4
87
92
  summary: Ruby/Rack Git Smart-HTTP Server Handler
88
- test_files:
89
- - tests/main_test.rb
93
+ test_files: []
@@ -1,3 +0,0 @@
1
- [submodule "tests/example"]
2
- path = tests/example
3
- url = git://github.com/schacon/simplegit.git
@@ -1,14 +0,0 @@
1
- language: ruby
2
- env:
3
- - TRAVIS=true
4
- branches:
5
- only:
6
- - 'master'
7
- rvm:
8
- - 1.9.3-p327
9
- - 2.0.0
10
- before_script:
11
- - "bundle install"
12
- - "git submodule init"
13
- - "git submodule update"
14
- script: "bundle exec rake"
data/CHANGELOG DELETED
@@ -1,2 +0,0 @@
1
- 1.1.0
2
- - Modifies service_rpc to use chunked transfer (https://github.com/gitlabhq/grack/pull/1)
data/Rakefile DELETED
@@ -1,27 +0,0 @@
1
- #!/usr/bin/env rake
2
- require "bundler/gem_tasks"
3
-
4
- task :default => :test
5
-
6
- desc "Run the tests."
7
- task :test do
8
- Dir.glob("tests/*_test.rb").each do |f|
9
- system "ruby #{f}"
10
- end
11
- end
12
-
13
- desc "Run test coverage."
14
- task :rcov do
15
- system "rcov tests/*_test.rb -i lib/git_http.rb -x rack -x Library -x tests"
16
- system "open coverage/index.html"
17
- end
18
-
19
- namespace :grack do
20
- desc "Start Grack"
21
- task :start do
22
- system "rackup config.ru -p 8080"
23
- end
24
- end
25
-
26
- desc "Start everything."
27
- multitask :start => [ 'grack:start' ]
@@ -1,9 +0,0 @@
1
- #! /usr/bin/env ruby
2
- $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/lib')
3
- require 'lib/git_http'
4
- config = {
5
- :project_root => "/opt",
6
- :upload_pack => true,
7
- :receive_pack => false,
8
- }
9
- Rack::Handler::FastCGI.run(GitHttp::App.new(config))
@@ -1,20 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- require File.expand_path('../lib/grack/version', __FILE__)
3
-
4
- Gem::Specification.new do |gem|
5
- gem.authors = ["Scott Chacon"]
6
- gem.email = ["schacon@gmail.com"]
7
- gem.description = %q{Ruby/Rack Git Smart-HTTP Server Handler}
8
- gem.summary = %q{Ruby/Rack Git Smart-HTTP Server Handler}
9
- gem.homepage = "https://github.com/gitlabhq/grack"
10
-
11
- gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
12
- gem.files = `git ls-files`.split("\n")
13
- gem.test_files = `git ls-files -- tests/*`.split("\n")
14
- gem.name = "gitlab-grack"
15
- gem.require_paths = ["lib"]
16
- gem.version = Grack::VERSION
17
-
18
- gem.add_dependency("rack", "~> 1.5.1")
19
- gem.add_development_dependency("mocha", "~> 0.11")
20
- end
@@ -1,60 +0,0 @@
1
- Installation
2
- ========================
3
-
4
- ** This documentation is not finished yet. I haven't tested all of
5
- these and it's obviously incomplete - these are currently just notes.
6
-
7
- FastCGI
8
- ---------------------------------------
9
- Here is an example config from lighttpd server:
10
- ----
11
- # main fastcgi entry
12
- $HTTP["url"] =~ "^/myapp/.+$" {
13
- fastcgi.server = ( "/myapp" =>
14
- ( "localhost" =>
15
- ( "bin-path" => "/var/www/localhost/cgi-bin/dispatch.fcgi",
16
- "docroot" => "/var/www/localhost/htdocs/myapp",
17
- "host" => "127.0.0.1",
18
- "port" => 1026,
19
- "check-local" => "disable"
20
- )
21
- )
22
- )
23
- } # HTTP[url]
24
- ----
25
- You can use the examples/dispatch.fcgi file as your dispatcher.
26
-
27
- (Example Apache setup?)
28
-
29
- Installing in a Java application server
30
- ---------------------------------------
31
- # install Warbler
32
- $ sudo gem install warbler
33
- $ cd gitsmart
34
- $ (edit config.ru)
35
- $ warble
36
- $ cp gitsmart.war /path/to/java/autodeploy/dir
37
-
38
- Unicorn
39
- ---------------------------------------
40
- With Unicorn (http://unicorn.bogomips.org/) you can just run 'unicorn'
41
- in the directory with the config.ru file.
42
-
43
- Thin
44
- ---------------------------------------
45
- thin.yml
46
- ---
47
- pid: /home/deploy/myapp/server/thin.pid
48
- log: /home/deploy/myapp/logs/thin.log
49
- timeout: 30
50
- port: 7654
51
- max_conns: 1024
52
- chdir: /home/deploy/myapp/site_files
53
- rackup: /home/deploy/myapp/server/config.ru
54
- max_persistent_conns: 512
55
- environment: production
56
- address: 127.0.0.1
57
- servers: 1
58
- daemonize: true
59
-
60
-
@@ -1,5 +0,0 @@
1
- require "grack/bundle"
2
-
3
- module Grack
4
-
5
- end
@@ -1,37 +0,0 @@
1
- require 'rack/auth/basic'
2
- require 'rack/auth/abstract/handler'
3
- require 'rack/auth/abstract/request'
4
-
5
- module Grack
6
- class Auth < Rack::Auth::Basic
7
- def call(env)
8
- @env = env
9
- @request = Rack::Request.new(env)
10
- @auth = Request.new(env)
11
-
12
- if not @auth.provided?
13
- unauthorized
14
- elsif not @auth.basic?
15
- bad_request
16
- else
17
- result = if (access = valid? and access == true)
18
- @env['REMOTE_USER'] = @auth.username
19
- @app.call(env)
20
- else
21
- if access == '404'
22
- render_not_found
23
- elsif access == '403'
24
- render_no_access
25
- else
26
- unauthorized
27
- end
28
- end
29
- result
30
- end
31
- end# method call
32
-
33
- def valid?
34
- false
35
- end
36
- end# class Auth
37
- end# module Grack
@@ -1,20 +0,0 @@
1
- require 'rack/builder'
2
- require 'grack/auth'
3
- require 'grack/server'
4
-
5
- module Grack
6
- module Bundle
7
- extend self
8
-
9
- def new(config)
10
- Rack::Builder.new do
11
- use Grack::Auth do |username, password|
12
- false
13
- end
14
-
15
- run Grack::Server.new(config)
16
- end
17
- end
18
-
19
- end
20
- end
@@ -1,324 +0,0 @@
1
- require 'zlib'
2
- require 'rack/request'
3
- require 'rack/response'
4
- require 'rack/utils'
5
- require 'time'
6
-
7
- module Grack
8
- class Server
9
-
10
- SERVICES = [
11
- ["POST", 'service_rpc', "(.*?)/git-upload-pack$", 'upload-pack'],
12
- ["POST", 'service_rpc', "(.*?)/git-receive-pack$", 'receive-pack'],
13
-
14
- ["GET", 'get_info_refs', "(.*?)/info/refs$"],
15
- ["GET", 'get_text_file', "(.*?)/HEAD$"],
16
- ["GET", 'get_text_file', "(.*?)/objects/info/alternates$"],
17
- ["GET", 'get_text_file', "(.*?)/objects/info/http-alternates$"],
18
- ["GET", 'get_info_packs', "(.*?)/objects/info/packs$"],
19
- ["GET", 'get_text_file', "(.*?)/objects/info/[^/]*$"],
20
- ["GET", 'get_loose_object', "(.*?)/objects/[0-9a-f]{2}/[0-9a-f]{38}$"],
21
- ["GET", 'get_pack_file', "(.*?)/objects/pack/pack-[0-9a-f]{40}\\.pack$"],
22
- ["GET", 'get_idx_file', "(.*?)/objects/pack/pack-[0-9a-f]{40}\\.idx$"],
23
- ]
24
-
25
- def initialize(config = false)
26
- set_config(config)
27
- end
28
-
29
- def set_config(config)
30
- @config = config || {}
31
- end
32
-
33
- def set_config_setting(key, value)
34
- @config[key] = value
35
- end
36
-
37
- def call(env)
38
- @env = env
39
- @req = Rack::Request.new(env)
40
-
41
- cmd, path, @reqfile, @rpc = match_routing
42
-
43
- return render_method_not_allowed if cmd == 'not_allowed'
44
- return render_not_found if !cmd
45
-
46
- @dir = get_git_dir(path)
47
- return render_not_found if !@dir
48
-
49
- Dir.chdir(@dir) do
50
- self.method(cmd).call()
51
- end
52
- end
53
-
54
- # ---------------------------------
55
- # actual command handling functions
56
- # ---------------------------------
57
-
58
- # Uses chunked (streaming) transfer, otherwise response
59
- # blocks to calculate Content-Length header
60
- # http://en.wikipedia.org/wiki/Chunked_transfer_encoding
61
-
62
- CRLF = "\r\n"
63
-
64
- def service_rpc
65
- return render_no_access if !has_access(@rpc, true)
66
- input = read_body
67
-
68
- @res = Rack::Response.new
69
- @res.status = 200
70
- @res["Content-Type"] = "application/x-git-%s-result" % @rpc
71
- @res["Transfer-Encoding"] = "chunked"
72
- @res["Cache-Control"] = "no-cache"
73
-
74
- @res.finish do
75
- command = git_command("#{@rpc} --stateless-rpc #{@dir}")
76
- IO.popen(command, File::RDWR) do |pipe|
77
- pipe.write(input)
78
- pipe.close_write
79
- while !pipe.eof?
80
- block = pipe.read(8192) # 8KB at a time
81
- @res.write encode_chunk(block) # stream it to the client
82
- end
83
- @res.write terminating_chunk
84
- end
85
- end
86
- end
87
-
88
- def encode_chunk(chunk)
89
- size_in_hex = chunk.size.to_s(16)
90
- [ size_in_hex, CRLF, chunk, CRLF ].join
91
- end
92
-
93
- def terminating_chunk
94
- [ 0, CRLF, CRLF ].join
95
- end
96
-
97
- def get_info_refs
98
- service_name = get_service_type
99
-
100
- if has_access(service_name)
101
- cmd = git_command("#{service_name} --stateless-rpc --advertise-refs .")
102
- refs = `#{cmd}`
103
-
104
- @res = Rack::Response.new
105
- @res.status = 200
106
- @res["Content-Type"] = "application/x-git-%s-advertisement" % service_name
107
- hdr_nocache
108
- @res.write(pkt_write("# service=git-#{service_name}\n"))
109
- @res.write(pkt_flush)
110
- @res.write(refs)
111
- @res.finish
112
- else
113
- dumb_info_refs
114
- end
115
- end
116
-
117
- def dumb_info_refs
118
- update_server_info
119
- send_file(@reqfile, "text/plain; charset=utf-8") do
120
- hdr_nocache
121
- end
122
- end
123
-
124
- def get_info_packs
125
- # objects/info/packs
126
- send_file(@reqfile, "text/plain; charset=utf-8") do
127
- hdr_nocache
128
- end
129
- end
130
-
131
- def get_loose_object
132
- send_file(@reqfile, "application/x-git-loose-object") do
133
- hdr_cache_forever
134
- end
135
- end
136
-
137
- def get_pack_file
138
- send_file(@reqfile, "application/x-git-packed-objects") do
139
- hdr_cache_forever
140
- end
141
- end
142
-
143
- def get_idx_file
144
- send_file(@reqfile, "application/x-git-packed-objects-toc") do
145
- hdr_cache_forever
146
- end
147
- end
148
-
149
- def get_text_file
150
- send_file(@reqfile, "text/plain") do
151
- hdr_nocache
152
- end
153
- end
154
-
155
- # ------------------------
156
- # logic helping functions
157
- # ------------------------
158
-
159
- F = ::File
160
-
161
- # some of this borrowed from the Rack::File implementation
162
- def send_file(reqfile, content_type)
163
- reqfile = File.join(@dir, reqfile)
164
- return render_not_found if !F.exists?(reqfile)
165
-
166
- @res = Rack::Response.new
167
- @res.status = 200
168
- @res["Content-Type"] = content_type
169
- @res["Last-Modified"] = F.mtime(reqfile).httpdate
170
-
171
- yield
172
-
173
- if size = F.size?(reqfile)
174
- @res["Content-Length"] = size.to_s
175
- @res.finish do
176
- F.open(reqfile, "rb") do |file|
177
- while part = file.read(8192)
178
- @res.write part
179
- end
180
- end
181
- end
182
- else
183
- body = [F.read(reqfile)]
184
- size = Rack::Utils.bytesize(body.first)
185
- @res["Content-Length"] = size
186
- @res.write body
187
- @res.finish
188
- end
189
- end
190
-
191
- def get_git_dir(path)
192
- root = @config[:project_root] || `pwd`
193
- path = File.join(root, path)
194
- if File.exists?(path) # TODO: check is a valid git directory
195
- return path
196
- end
197
- false
198
- end
199
-
200
- def get_service_type
201
- service_type = @req.params['service']
202
- return false if !service_type
203
- return false if service_type[0, 4] != 'git-'
204
- service_type.gsub('git-', '')
205
- end
206
-
207
- def match_routing
208
- cmd = nil
209
- path = nil
210
- SERVICES.each do |method, handler, match, rpc|
211
- if m = Regexp.new(match).match(@req.path_info)
212
- return ['not_allowed'] if method != @req.request_method
213
- cmd = handler
214
- path = m[1]
215
- file = @req.path_info.sub(path + '/', '')
216
- return [cmd, path, file, rpc]
217
- end
218
- end
219
- return nil
220
- end
221
-
222
- def has_access(rpc, check_content_type = false)
223
- if check_content_type
224
- return false if @req.content_type != "application/x-git-%s-request" % rpc
225
- end
226
- return false if !['upload-pack', 'receive-pack'].include? rpc
227
- if rpc == 'receive-pack'
228
- return @config[:receive_pack] if @config.include? :receive_pack
229
- end
230
- if rpc == 'upload-pack'
231
- return @config[:upload_pack] if @config.include? :upload_pack
232
- end
233
- return get_config_setting(rpc)
234
- end
235
-
236
- def get_config_setting(service_name)
237
- service_name = service_name.gsub('-', '')
238
- setting = get_git_config("http.#{service_name}")
239
- if service_name == 'uploadpack'
240
- return setting != 'false'
241
- else
242
- return setting == 'true'
243
- end
244
- end
245
-
246
- def get_git_config(config_name)
247
- cmd = git_command("config #{config_name}")
248
- `#{cmd}`.chomp
249
- end
250
-
251
- def read_body
252
- if @env["HTTP_CONTENT_ENCODING"] =~ /gzip/
253
- input = Zlib::GzipReader.new(@req.body).read
254
- else
255
- input = @req.body.read
256
- end
257
- end
258
-
259
- def update_server_info
260
- cmd = git_command("update-server-info")
261
- `#{cmd}`
262
- end
263
-
264
- def git_command(command)
265
- git_bin = @config[:git_path] || 'git'
266
- command = "#{git_bin} #{command}"
267
- command
268
- end
269
-
270
- # --------------------------------------
271
- # HTTP error response handling functions
272
- # --------------------------------------
273
-
274
- PLAIN_TYPE = {"Content-Type" => "text/plain"}
275
-
276
- def render_method_not_allowed
277
- if @env['SERVER_PROTOCOL'] == "HTTP/1.1"
278
- [405, PLAIN_TYPE, ["Method Not Allowed"]]
279
- else
280
- [400, PLAIN_TYPE, ["Bad Request"]]
281
- end
282
- end
283
-
284
- def render_not_found
285
- [404, PLAIN_TYPE, ["Not Found"]]
286
- end
287
-
288
- def render_no_access
289
- [403, PLAIN_TYPE, ["Forbidden"]]
290
- end
291
-
292
-
293
- # ------------------------------
294
- # packet-line handling functions
295
- # ------------------------------
296
-
297
- def pkt_flush
298
- '0000'
299
- end
300
-
301
- def pkt_write(str)
302
- (str.size + 4).to_s(base=16).rjust(4, '0') + str
303
- end
304
-
305
-
306
- # ------------------------
307
- # header writing functions
308
- # ------------------------
309
-
310
- def hdr_nocache
311
- @res["Expires"] = "Fri, 01 Jan 1980 00:00:00 GMT"
312
- @res["Pragma"] = "no-cache"
313
- @res["Cache-Control"] = "no-cache, max-age=0, must-revalidate"
314
- end
315
-
316
- def hdr_cache_forever
317
- now = Time.now().to_i
318
- @res["Date"] = now.to_s
319
- @res["Expires"] = (now + 31536000).to_s;
320
- @res["Cache-Control"] = "public, max-age=31536000";
321
- end
322
-
323
- end
324
- end