unicorn 0.91.0 → 0.92.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. data/{CHANGELOG → .CHANGELOG.old} +0 -0
  2. data/.document +4 -0
  3. data/.gitignore +5 -0
  4. data/.mailmap +26 -0
  5. data/CONTRIBUTORS +1 -1
  6. data/Documentation/.gitignore +5 -0
  7. data/Documentation/GNUmakefile +30 -0
  8. data/Documentation/unicorn.1.txt +158 -0
  9. data/Documentation/unicorn_rails.1.txt +150 -0
  10. data/GIT-VERSION-GEN +40 -0
  11. data/GNUmakefile +102 -14
  12. data/README +3 -2
  13. data/Rakefile +104 -32
  14. data/SIGNALS +2 -4
  15. data/TODO +3 -9
  16. data/bin/unicorn +5 -2
  17. data/bin/unicorn_rails +5 -3
  18. data/ext/unicorn_http/c_util.h +2 -2
  19. data/ext/unicorn_http/common_field_optimization.h +2 -1
  20. data/ext/unicorn_http/ext_help.h +29 -4
  21. data/ext/unicorn_http/extconf.rb +5 -0
  22. data/ext/unicorn_http/unicorn_http.rl +131 -76
  23. data/lib/unicorn.rb +6 -2
  24. data/lib/unicorn/app/exec_cgi.rb +3 -1
  25. data/lib/unicorn/app/inetd.rb +2 -0
  26. data/lib/unicorn/app/old_rails.rb +2 -0
  27. data/lib/unicorn/app/old_rails/static.rb +3 -1
  28. data/lib/unicorn/cgi_wrapper.rb +3 -1
  29. data/lib/unicorn/configurator.rb +2 -0
  30. data/lib/unicorn/const.rb +8 -6
  31. data/lib/unicorn/http_request.rb +6 -5
  32. data/lib/unicorn/http_response.rb +4 -2
  33. data/lib/unicorn/launcher.rb +6 -0
  34. data/lib/unicorn/socket_helper.rb +5 -5
  35. data/lib/unicorn/tee_input.rb +2 -0
  36. data/lib/unicorn/util.rb +2 -0
  37. data/local.mk.sample +4 -2
  38. data/setup.rb +1 -0
  39. data/test/aggregate.rb +2 -0
  40. data/test/exec/test_exec.rb +157 -0
  41. data/test/rails/app-1.2.3/app/controllers/application.rb +2 -0
  42. data/test/rails/app-1.2.3/app/controllers/foo_controller.rb +2 -0
  43. data/test/rails/app-1.2.3/app/helpers/application_helper.rb +2 -0
  44. data/test/rails/app-1.2.3/config/boot.rb +2 -0
  45. data/test/rails/app-1.2.3/config/environment.rb +2 -0
  46. data/test/rails/app-1.2.3/config/environments/development.rb +2 -0
  47. data/test/rails/app-1.2.3/config/environments/production.rb +2 -0
  48. data/test/rails/app-1.2.3/config/routes.rb +2 -0
  49. data/test/rails/app-2.0.2/app/controllers/application.rb +2 -0
  50. data/test/rails/app-2.0.2/app/controllers/foo_controller.rb +2 -0
  51. data/test/rails/app-2.0.2/app/helpers/application_helper.rb +2 -0
  52. data/test/rails/app-2.0.2/config/boot.rb +2 -0
  53. data/test/rails/app-2.0.2/config/environment.rb +2 -0
  54. data/test/rails/app-2.0.2/config/environments/development.rb +2 -0
  55. data/test/rails/app-2.0.2/config/environments/production.rb +2 -0
  56. data/test/rails/app-2.0.2/config/routes.rb +2 -0
  57. data/test/rails/app-2.1.2/app/controllers/application.rb +2 -0
  58. data/test/rails/app-2.1.2/app/controllers/foo_controller.rb +2 -0
  59. data/test/rails/app-2.1.2/app/helpers/application_helper.rb +2 -0
  60. data/test/rails/app-2.1.2/config/boot.rb +2 -0
  61. data/test/rails/app-2.1.2/config/environment.rb +2 -0
  62. data/test/rails/app-2.1.2/config/environments/development.rb +2 -0
  63. data/test/rails/app-2.1.2/config/environments/production.rb +2 -0
  64. data/test/rails/app-2.1.2/config/routes.rb +2 -0
  65. data/test/rails/app-2.2.2/app/controllers/application.rb +2 -0
  66. data/test/rails/app-2.2.2/app/controllers/foo_controller.rb +2 -0
  67. data/test/rails/app-2.2.2/app/helpers/application_helper.rb +2 -0
  68. data/test/rails/app-2.2.2/config/boot.rb +2 -0
  69. data/test/rails/app-2.2.2/config/environment.rb +2 -0
  70. data/test/rails/app-2.2.2/config/environments/development.rb +2 -0
  71. data/test/rails/app-2.2.2/config/environments/production.rb +2 -0
  72. data/test/rails/app-2.2.2/config/routes.rb +2 -0
  73. data/test/rails/app-2.3.3.1/app/controllers/application_controller.rb +2 -0
  74. data/test/rails/app-2.3.3.1/app/controllers/foo_controller.rb +2 -0
  75. data/test/rails/app-2.3.3.1/app/helpers/application_helper.rb +2 -0
  76. data/test/rails/app-2.3.3.1/config/boot.rb +2 -0
  77. data/test/rails/app-2.3.3.1/config/environment.rb +2 -0
  78. data/test/rails/app-2.3.3.1/config/environments/development.rb +2 -0
  79. data/test/rails/app-2.3.3.1/config/environments/production.rb +2 -0
  80. data/test/rails/app-2.3.3.1/config/routes.rb +2 -0
  81. data/test/rails/test_rails.rb +2 -0
  82. data/test/test_helper.rb +8 -0
  83. data/test/unit/test_configurator.rb +2 -0
  84. data/test/unit/test_http_parser.rb +13 -0
  85. data/test/unit/test_http_parser_ng.rb +2 -0
  86. data/test/unit/test_request.rb +2 -0
  87. data/test/unit/test_response.rb +2 -0
  88. data/test/unit/test_server.rb +2 -0
  89. data/test/unit/test_signals.rb +2 -0
  90. data/test/unit/test_socket_helper.rb +2 -0
  91. data/test/unit/test_tee_input.rb +2 -1
  92. data/test/unit/test_upload.rb +2 -0
  93. data/test/unit/test_util.rb +2 -0
  94. data/unicorn.gemspec +38 -28
  95. metadata +38 -42
  96. data/Manifest +0 -137
@@ -1,8 +1,15 @@
1
1
  # use GNU Make to run tests in parallel, and without depending on Rubygems
2
2
  all:: test
3
3
  ruby = ruby
4
+ rake = rake
4
5
  ragel = ragel
6
+ GIT_URL = $(shell git config --get remote.origin.url 2>/dev/null || \
7
+ echo git://git.bogomips.org/unicorn.git)
5
8
  RLFLAGS = -G2
9
+
10
+ GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
11
+ @./GIT-VERSION-GEN
12
+ -include GIT-VERSION-FILE
6
13
  -include local.mk
7
14
  ruby_bin := $(shell which $(ruby))
8
15
  ifeq ($(DLEXT),) # "so" for Linux
@@ -29,8 +36,9 @@ test_prefix = $(CURDIR)/test/install-$(RUBY_VERSION)
29
36
 
30
37
  ext := ext/unicorn_http
31
38
  c_files := $(ext)/unicorn_http.c $(wildcard $(ext)/*.h)
32
- rl_files := $(addprefix $(ext)/,unicorn_http.rl unicorn_http_common.rl)
33
- rb_files := $(shell grep '^\(bin\|lib\)' Manifest)
39
+ rl_files := $(wildcard $(ext)/*.rl)
40
+ bins := $(wildcard bin/*)
41
+ rb_files := $(bins) $(shell find lib -type f -name '*.rb')
34
42
  inst_deps := $(c_files) $(rb_files)
35
43
 
36
44
  ragel: $(ext)/unicorn_http.c
@@ -48,13 +56,11 @@ http: lib/unicorn_http.$(DLEXT)
48
56
 
49
57
  $(test_prefix)/.stamp: $(inst_deps)
50
58
  mkdir -p $(test_prefix)/.ccache
51
- tar c `cat Manifest` | (cd $(test_prefix) && tar x)
59
+ tar c `cat .manifest` | (cd $(test_prefix) && tar x)
52
60
  $(MAKE) -C $(test_prefix) clean
53
61
  $(MAKE) -C $(test_prefix) http shebang
54
62
  > $@
55
63
 
56
- bins := $(wildcard bin/*)
57
-
58
64
  # this is only intended to be run within $(test_prefix)
59
65
  shebang: $(bins)
60
66
  $(ruby) -i -p -e '$$_.gsub!(%r{^#!.*$$},"#!$(ruby_bin)")' $^
@@ -119,20 +125,54 @@ prep_setup_rb := @-$(RM) $(setup_rb_files);$(MAKE) -C $(ext) clean
119
125
 
120
126
  clean:
121
127
  -$(MAKE) -C $(ext) clean
128
+ -$(MAKE) -C Documentation clean
122
129
  $(RM) $(ext)/Makefile lib/unicorn_http.$(DLEXT)
123
130
  $(RM) $(setup_rb_files) $(t_log)
124
- $(RM) -r $(test_prefix)
125
-
126
- Manifest:
127
- (git ls-files && echo $(ext)/unicorn_http.c) | LC_ALL=C sort > $@+
131
+ $(RM) -r $(test_prefix) man
132
+
133
+ man:
134
+ $(MAKE) -C Documentation install-man
135
+ .manifest: GIT-VERSION-FILE NEWS ChangeLog $(ext)/unicorn_http.c
136
+ $(MAKE) man
137
+ (git ls-files && \
138
+ for i in $@ $^ $(wildcard man/*/*.1); \
139
+ do echo $$i; done) | LC_ALL=C sort > $@+
128
140
  cmp $@+ $@ || mv $@+ $@
129
- $(RM) -f $@+
141
+ $(RM) $@+
142
+
143
+ NEWS: GIT-VERSION-FILE
144
+ $(rake) -s news_rdoc > $@+
145
+ mv $@+ $@
146
+
147
+ ChangeLog: GIT-VERSION-FILE
148
+ @echo "ChangeLog from $(GIT_URL) ($(GIT_VERSION))" > $@+
149
+ @echo >> $@+
150
+ git log | sed -e 's/^/ /' >> $@+
151
+ mv $@+ $@
152
+
153
+ news_atom := http://unicorn.bogomips.org/NEWS.atom.xml
154
+ cgit_atom := http://git.bogomips.org/cgit/unicorn.git/atom/?h=master
155
+ atom = <link rel="alternate" title="Atom feed" href="$(1)" \
156
+ type="application/atom+xml"/>
130
157
 
131
158
  # using rdoc 2.4.1+
132
- doc: .document $(ext)/unicorn_http.c
159
+ doc: .document $(ext)/unicorn_http.c NEWS ChangeLog
160
+ > unicorn.1 && > unicorn_rails.1
133
161
  rdoc -Na -t "$(shell sed -ne '1s/^= //p' README)"
134
- install -m644 COPYING doc/COPYING
135
- cd doc && ln README.html tmp.html && mv tmp.html index.html
162
+ install -m644 $(shell grep '^[A-Z]' .document) doc/
163
+ $(MAKE) -C Documentation install-html
164
+ cd doc && for i in unicorn unicorn_rails; do \
165
+ sed -e '/"documentation">/r man1/'$$i'.1.html' \
166
+ < $${i}_1.html > tmp && mv tmp $${i}_1.html; done
167
+ $(ruby) -i -p -e \
168
+ '$$_.gsub!("</title>",%q{\&$(call atom,$(cgit_atom))})' \
169
+ doc/ChangeLog.html
170
+ $(ruby) -i -p -e \
171
+ '$$_.gsub!("</title>",%q{\&$(call atom,$(news_atom))})' \
172
+ doc/NEWS.html doc/README.html
173
+ $(rake) -s news_atom > doc/NEWS.atom.xml
174
+ cd doc && ln README.html tmp && mv tmp index.html
175
+ $(RM) unicorn.1 unicorn_rails.1
136
176
 
137
177
  rails_git_url = git://github.com/rails/rails.git
138
178
  rails_git := vendor/rails.git
@@ -153,4 +193,52 @@ $(T_r).%.r: export RAILS_GIT_REPO = $(CURDIR)/$(rails_git)
153
193
  $(T_r).%.r: $(test_prefix)/.stamp $(rails_git)/info/cloned-stamp
154
194
  $(run_test)
155
195
 
156
- .PHONY: doc $(T) $(slow_tests) Manifest
196
+ ifneq ($(VERSION),)
197
+ rfproject := mongrel
198
+ rfpackage := unicorn
199
+ pkggem := pkg/$(rfpackage)-$(VERSION).gem
200
+ pkgtgz := pkg/$(rfpackage)-$(VERSION).tgz
201
+ release_notes := release_notes-$(VERSION)
202
+ release_changes := release_changes-$(VERSION)
203
+
204
+ release-notes: $(release_notes)
205
+ release-changes: $(release_changes)
206
+ $(release_changes):
207
+ $(rake) -s release_changes > $@+
208
+ $(VISUAL) $@+ && test -s $@+ && mv $@+ $@
209
+ $(release_notes):
210
+ GIT_URL=$(GIT_URL) $(rake) -s release_notes > $@+
211
+ $(VISUAL) $@+ && test -s $@+ && mv $@+ $@
212
+
213
+ # ensures we're actually on the tagged $(VERSION), only used for release
214
+ verify:
215
+ git rev-parse --verify refs/tags/v$(VERSION)^{}
216
+ git diff-index --quiet HEAD^0
217
+ test `git rev-parse --verify HEAD^0` = \
218
+ `git rev-parse --verify refs/tags/v$(VERSION)^{}`
219
+
220
+ $(pkggem): .manifest
221
+ gem build $(rfpackage).gemspec
222
+ mkdir -p pkg
223
+ mv $(@F) $@
224
+
225
+ $(pkgtgz): distdir = $(basename $@)
226
+ $(pkgtgz): HEAD = v$(VERSION)
227
+ $(pkgtgz): .manifest
228
+ @test -n "$(distdir)"
229
+ $(RM) -r $(distdir)
230
+ mkdir -p $(distdir)
231
+ tar c `cat .manifest` | (cd $(distdir) && tar x)
232
+ cd pkg && tar c $(basename $(@F)) | gzip -9 > $(@F)+
233
+ mv $@+ $@
234
+
235
+ package: $(pkgtgz) $(pkggem)
236
+
237
+ release: verify package $(release_notes) $(release_changes)
238
+ rubyforge add_release -f -n $(release_notes) -a $(release_changes) \
239
+ $(rfproject) $(rfpackage) $(VERSION) $(pkggem)
240
+ rubyforge add_file \
241
+ $(rfproject) $(rfpackage) $(VERSION) $(pkgtgz)
242
+ endif
243
+
244
+ .PHONY: .FORCE-GIT-VERSION-FILE doc $(T) $(slow_tests) .manifest man
data/README CHANGED
@@ -6,7 +6,7 @@
6
6
  cut out everything that is better supported by the operating system,
7
7
  {nginx}[http://nginx.net/] or {Rack}[http://rack.rubyforge.org/].
8
8
 
9
- * Compatible with both Ruby 1.8 and 1.9, Rubinius support is planned.
9
+ * Compatible with both Ruby 1.8 and 1.9. Rubinius support is in-progress.
10
10
 
11
11
  * Process management: Unicorn will reap and restart workers that
12
12
  die from broken apps. There is no need to manage multiple processes
@@ -53,7 +53,7 @@
53
53
 
54
54
  == Versions
55
55
 
56
- {Current v0.90.0}[http://git.bogomips.org/cgit/unicorn.git/tag/?id=v0.90.0]
56
+ {Current v0.92.0}[http://git.bogomips.org/cgit/unicorn.git/tag/?id=v0.92.0]
57
57
 
58
58
  {Old Stable v0.8.4}[http://git.bogomips.org/cgit/unicorn.git/tag/?id=v0.8.4]
59
59
 
@@ -166,3 +166,4 @@ to post on the mailing list. No top posting. Address replies +To:+ (or
166
166
  * nntp: nntp://news.gmane.org/gmane.comp.lang.ruby.unicorn.general
167
167
  * archives: http://rubyforge.org/pipermail/mongrel-unicorn/
168
168
  * subscribe: http://rubyforge.org/mailman/listinfo/mongrel-unicorn/
169
+ * finger: unicorn@bogomips.org
data/Rakefile CHANGED
@@ -1,38 +1,110 @@
1
+ # -*- encoding: binary -*-
1
2
 
2
- require 'rubygems'
3
- require 'echoe'
4
-
5
- Echoe.new("unicorn") do |p|
6
- p.summary = "Rack HTTP server for Unix, fast clients and nothing else"
7
- p.author = "Eric Wong"
8
- p.email = "normalperson@yhbt.net"
9
- p.clean_pattern = ['ext/unicorn_http/*.{bundle,so,o,obj,pdb,lib,def,exp}',
10
- 'lib/*.{bundle,so,o,obj,pdb,lib,def,exp}',
11
- 'ext/unicorn_http/Makefile',
12
- 'pkg', 'lib/*.bundle', '*.gem',
13
- 'site/output', '.config', 'coverage',
14
- 'test_*.log', 'log', 'doc']
15
- p.url = "http://unicorn.bogomips.org/"
16
- p.ignore_pattern = /^(pkg|site|projects|doc|log)|CVS|\.log/
17
- p.need_tar_gz = false
18
- p.need_tgz = true
19
- p.dependencies = [ 'rack' ]
20
-
21
- p.extension_pattern = ["ext/**/extconf.rb"]
22
-
23
- # Eric hasn't bothered to figure out running exec tests properly
24
- # from Rake, but Eric prefers GNU make to Rake for tests anyways...
25
- p.test_pattern = [ 'test/unit/test*.rb' ]
3
+ # most tasks are in the GNUmakefile which offers better parallelism
4
+
5
+ def old_summaries
6
+ @old_summaries ||= File.readlines(".CHANGELOG.old").inject({}) do |hash, line|
7
+ version, summary = line.split(/ - /, 2)
8
+ hash[version] = summary
9
+ hash
10
+ end
11
+ end
12
+
13
+ def tags
14
+ timefmt = '%Y-%m-%dT%H:%M:%SZ'
15
+ @tags ||= `git tag -l`.split(/\n/).map do |tag|
16
+ next if tag == "v0.0.0"
17
+ if %r{\Av[\d\.]+\z} =~ tag
18
+ header, subject, body = `git cat-file tag #{tag}`.split(/\n\n/, 3)
19
+ header = header.split(/\n/)
20
+ tagger = header.grep(/\Atagger /).first
21
+ body ||= "initial"
22
+ {
23
+ :time => Time.at(tagger.split(/ /)[-2].to_i).utc.strftime(timefmt),
24
+ :tagger_name => %r{^tagger ([^<]+)}.match(tagger)[1],
25
+ :tagger_email => %r{<([^>]+)>}.match(tagger)[1],
26
+ :id => `git rev-parse refs/tags/#{tag}`.chomp!,
27
+ :tag => tag,
28
+ :subject => subject,
29
+ :body => (old = old_summaries[tag]) ? "#{old}\n#{body}" : body,
30
+ }
31
+ end
32
+ end.compact.sort { |a,b| b[:time] <=> a[:time] }
33
+ end
34
+
35
+ cgit_url = "http://git.bogomips.org/cgit/unicorn.git"
36
+
37
+ desc 'prints news as an Atom feed'
38
+ task :news_atom do
39
+ require 'nokogiri'
40
+ new_tags = tags[0,10]
41
+ puts(Nokogiri::XML::Builder.new do
42
+ feed :xmlns => "http://www.w3.org/2005/Atom" do
43
+ id! "http://unicorn.bogomips.org/NEWS.atom.xml"
44
+ title "Unicorn news"
45
+ subtitle "Rack HTTP server for Unix and fast clients"
46
+ link! :rel => 'alternate', :type => 'text/html',
47
+ :href => 'http://unicorn.bogomips.org/NEWS.html'
48
+ updated new_tags.first[:time]
49
+ new_tags.each do |tag|
50
+ entry do
51
+ title tag[:subject]
52
+ updated tag[:time]
53
+ published tag[:time]
54
+ author {
55
+ name tag[:tagger_name]
56
+ email tag[:tagger_email]
57
+ }
58
+ url = "#{cgit_url}/tag/?id=#{tag[:tag]}"
59
+ link! :rel => "alternate", :type => "text/html", :href =>url
60
+ id! url
61
+ content(:type => 'text') { tag[:body] }
62
+ end
63
+ end
64
+ end
65
+ end.to_xml)
26
66
  end
27
67
 
28
- #### Ragel builder
68
+ desc 'prints RDoc-formatted news'
69
+ task :news_rdoc do
70
+ tags.each do |tag|
71
+ time = tag[:time].tr!('T', ' ').gsub!(/:\d\dZ/, ' UTC')
72
+ puts "=== #{tag[:tag].sub(/^v/, '')} / #{time}"
73
+ puts ""
29
74
 
30
- desc "Rebuild the Ragel sources"
31
- task :ragel do
32
- Dir.chdir "ext/unicorn_http" do
33
- target = "unicorn_http.c"
34
- File.unlink target if File.exist? target
35
- sh "ragel unicorn_http.rl -C -G2 -o #{target}"
36
- raise "Failed to build C source" unless File.exist? target
75
+ body = tag[:body]
76
+ puts tag[:body].gsub(/^/sm, " ").gsub!(/[ \t]+$/sm, "")
77
+ puts ""
37
78
  end
38
79
  end
80
+
81
+ desc "print release changelog for Rubyforge"
82
+ task :release_changes do
83
+ version = ENV['VERSION'] or abort "VERSION= needed"
84
+ version = "v#{version}"
85
+ vtags = tags.map { |tag| tag[:tag] =~ /\Av/ and tag[:tag] }.sort
86
+ prev = vtags[vtags.index(version) - 1]
87
+ system('git', 'diff', '--stat', prev, version) or abort $?
88
+ puts ""
89
+ system('git', 'log', "#{prev}..#{version}") or abort $?
90
+ end
91
+
92
+ desc "print release notes for Rubyforge"
93
+ task :release_notes do
94
+ require 'rubygems'
95
+
96
+ git_url = ENV['GIT_URL'] ||
97
+ `git config --get remote.origin.url 2>/dev/null`.chomp! ||
98
+ 'git://git.bogomips.org/unicorn.git'
99
+
100
+ spec = Gem::Specification.load('unicorn.gemspec')
101
+ puts spec.description.strip
102
+ puts ""
103
+ puts "* #{spec.homepage}"
104
+ puts "* #{spec.email}"
105
+ puts "* #{git_url}"
106
+
107
+ _, _, body = `git cat-file tag v#{spec.version}`.split(/\n\n/, 3)
108
+ print "\nChanges:\n\n"
109
+ puts body
110
+ end
data/SIGNALS CHANGED
@@ -1,7 +1,7 @@
1
1
  == Signal handling
2
2
 
3
3
  In general, signals need only be sent to the master process. However,
4
- the signals unicorn uses internally to communicate with the worker
4
+ the signals Unicorn uses internally to communicate with the worker
5
5
  processes are documented here as well.
6
6
 
7
7
  === Master Process
@@ -54,9 +54,7 @@ losing any incoming connections. Doing so will reload all of your
54
54
  application code, Unicorn config, Ruby executable, and all libraries.
55
55
  The only things that will not change (due to OS limitations) are:
56
56
 
57
- 1. The listener backlog size of already-bound sockets
58
-
59
- 2. The path to the unicorn executable script. If you want to change to
57
+ 1. The path to the unicorn executable script. If you want to change to
60
58
  a different installation of Ruby, you can modify the shebang
61
59
  line to point to your alternative interpreter.
62
60
 
data/TODO CHANGED
@@ -1,11 +1,5 @@
1
- * security audit, fuzz testing
1
+ * Documentation improvements
2
2
 
3
- * manpages (why do so few Ruby executables come with proper manpages?)
3
+ * launchers - add --kill switch to allow DRY pid file path definition
4
4
 
5
- * code cleanups
6
-
7
- * launchers - add stop/start/kill/upgrade commands
8
-
9
- * Rainbows!
10
-
11
- * Rubinius support
5
+ * Rainbows! (http://article.gmane.org/gmane.comp.lang.ruby.unicorn.general/22)
@@ -1,4 +1,5 @@
1
1
  #!/home/ew/bin/ruby
2
+ # -*- encoding: binary -*-
2
3
  require 'unicorn/launcher'
3
4
  require 'optparse'
4
5
 
@@ -64,7 +65,9 @@ opts = OptionParser.new("", 24, ' ') do |opts|
64
65
  daemonize = d ? true : false
65
66
  end
66
67
 
67
- opts.on("-P", "--pid FILE", "file to store PID (default: none)") do |f|
68
+ opts.on("-P", "--pid FILE", "DEPRECATED") do |f|
69
+ warn %q{Use of --pid/-P is strongly discouraged}
70
+ warn %q{Use the 'pid' directive in the Unicorn config file instead}
68
71
  options[:pid] = File.expand_path(f)
69
72
  end
70
73
 
@@ -93,7 +96,7 @@ opts = OptionParser.new("", 24, ' ') do |opts|
93
96
  opts.separator "Common options:"
94
97
 
95
98
  opts.on_tail("-h", "--help", "Show this message") do
96
- puts opts
99
+ puts opts.to_s.gsub(/^.*DEPRECATED.*$/s, '')
97
100
  exit
98
101
  end
99
102
 
@@ -1,4 +1,5 @@
1
1
  #!/home/ew/bin/ruby
2
+ # -*- encoding: binary -*-
2
3
  require 'unicorn/launcher'
3
4
  require 'optparse'
4
5
  require 'fileutils'
@@ -78,8 +79,9 @@ opts = OptionParser.new("", 24, ' ') do |opts|
78
79
  options[:config_file] = File.expand_path(f)
79
80
  end
80
81
 
81
- opts.on("-P", "--path PATH", "Runs Rails app mounted at a specific path.",
82
- "(default: /") do |v|
82
+ opts.on("-P", "--path PATH", "DEPRECATED") do |v|
83
+ warn %q{Use of --path/-P is strongly discouraged}
84
+ warn %q{Use the 'map' directive in the rackup config instead}
83
85
  ENV['RAILS_RELATIVE_URL_ROOT'] = map_path = v
84
86
  end
85
87
 
@@ -91,7 +93,7 @@ opts = OptionParser.new("", 24, ' ') do |opts|
91
93
  opts.separator "Common options:"
92
94
 
93
95
  opts.on_tail("-h", "--help", "Show this message") do
94
- puts opts
96
+ puts opts.to_s.gsub(/^.*DEPRECATED.*$/s, '')
95
97
  exit
96
98
  end
97
99
 
@@ -27,7 +27,7 @@
27
27
  # endif
28
28
  #else
29
29
  # error off_t size unknown for this platform!
30
- #endif
30
+ #endif /* SIZEOF_OFF_T check */
31
31
 
32
32
  /*
33
33
  * capitalizes all lower-case ASCII characters and converts dashes
@@ -56,7 +56,7 @@ static int hexchar2int(int xdigit)
56
56
  return xdigit - 'a' + 10;
57
57
 
58
58
  /* Ragel already does runtime range checking for us in Unicorn: */
59
- assert(xdigit >= '0' && xdigit <= '9');
59
+ assert(xdigit >= '0' && xdigit <= '9' && "invalid digit character");
60
60
 
61
61
  return xdigit - '0';
62
62
  }
@@ -103,7 +103,8 @@ static VALUE uncommon_field(const char *field, size_t flen)
103
103
  VALUE f = rb_str_new(NULL, HTTP_PREFIX_LEN + flen);
104
104
  memcpy(RSTRING_PTR(f), HTTP_PREFIX, HTTP_PREFIX_LEN);
105
105
  memcpy(RSTRING_PTR(f) + HTTP_PREFIX_LEN, field, flen);
106
- assert(*(RSTRING_PTR(f) + RSTRING_LEN(f)) == '\0'); /* paranoia */
106
+ assert(*(RSTRING_PTR(f) + RSTRING_LEN(f)) == '\0' &&
107
+ "string didn't end with \\0"); /* paranoia */
107
108
  return rb_obj_freeze(f);
108
109
  }
109
110
 
@@ -3,10 +3,15 @@
3
3
 
4
4
  #ifndef RSTRING_PTR
5
5
  #define RSTRING_PTR(s) (RSTRING(s)->ptr)
6
- #endif
6
+ #endif /* !defined(RSTRING_PTR) */
7
7
  #ifndef RSTRING_LEN
8
8
  #define RSTRING_LEN(s) (RSTRING(s)->len)
9
- #endif
9
+ #endif /* !defined(RSTRING_LEN) */
10
+
11
+ #ifndef RUBINIUS
12
+ # define rb_str_update(x) do {} while (0)
13
+ # define rb_str_flush(x) do {} while (0)
14
+ #endif /* !RUBINIUS */
10
15
 
11
16
  #ifndef HAVE_RB_STR_SET_LEN
12
17
  /* this is taken from Ruby 1.8.7, 1.8.6 may not have it */
@@ -14,9 +19,29 @@ static void rb_18_str_set_len(VALUE str, long len)
14
19
  {
15
20
  RSTRING(str)->len = len;
16
21
  RSTRING(str)->ptr[len] = '\0';
22
+ rb_str_flush(str);
17
23
  }
18
24
  # define rb_str_set_len(str,len) rb_18_str_set_len(str,len)
19
- #endif
25
+ #endif /* !defined(HAVE_RB_STR_SET_LEN) */
26
+
27
+ /* not all Ruby implementations support frozen objects (Rubinius does not) */
28
+ #if defined(OBJ_FROZEN)
29
+ # define assert_frozen(f) assert(OBJ_FROZEN(f) && "unfrozen object")
30
+ #else
31
+ # define assert_frozen(f) do {} while (0)
32
+ #endif /* !defined(OBJ_FROZEN) */
33
+
34
+ #if !defined(OFFT2NUM)
35
+ # if SIZEOF_OFF_T == SIZEOF_LONG
36
+ # define OFFT2NUM(n) LONG2NUM(n)
37
+ # else
38
+ # define OFFT2NUM(n) LL2NUM(n)
39
+ # endif
40
+ #endif /* ! defined(OFFT2NUM) */
41
+
42
+ #ifndef HAVE_RB_STR_MODIFY
43
+ # define rb_str_modify(x) do {} while (0)
44
+ #endif /* ! defined(HAVE_RB_STR_MODIFY) */
20
45
 
21
46
  static inline int str_cstr_eq(VALUE val, const char *ptr, size_t len)
22
47
  {
@@ -45,4 +70,4 @@ static int str_cstr_case_eq(VALUE val, const char *ptr, size_t len)
45
70
  #define STR_CSTR_CASE_EQ(val, const_str) \
46
71
  str_cstr_case_eq(val, const_str, sizeof(const_str) - 1)
47
72
 
48
- #endif
73
+ #endif /* ext_help_h */