unicorn 4.7.0 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. checksums.yaml +7 -0
  2. data/.document +0 -1
  3. data/.gitattributes +5 -0
  4. data/.gitignore +2 -2
  5. data/.manifest +14 -21
  6. data/.olddoc.yml +22 -0
  7. data/Application_Timeouts +7 -7
  8. data/DESIGN +2 -4
  9. data/Documentation/.gitignore +1 -3
  10. data/Documentation/unicorn.1 +222 -0
  11. data/Documentation/unicorn_rails.1 +207 -0
  12. data/FAQ +23 -6
  13. data/GIT-VERSION-FILE +1 -1
  14. data/GIT-VERSION-GEN +1 -1
  15. data/GNUmakefile +139 -92
  16. data/HACKING +13 -28
  17. data/ISSUES +82 -19
  18. data/KNOWN_ISSUES +18 -18
  19. data/LATEST +22 -44
  20. data/LICENSE +2 -2
  21. data/Links +24 -22
  22. data/NEWS +729 -0
  23. data/PHILOSOPHY +0 -6
  24. data/README +50 -48
  25. data/Rakefile +0 -44
  26. data/SIGNALS +12 -3
  27. data/Sandbox +11 -10
  28. data/TODO +0 -2
  29. data/TUNING +30 -9
  30. data/archive/.gitignore +3 -0
  31. data/archive/slrnpull.conf +4 -0
  32. data/bin/unicorn +4 -2
  33. data/bin/unicorn_rails +3 -3
  34. data/examples/big_app_gc.rb +1 -1
  35. data/examples/init.sh +36 -8
  36. data/examples/logrotate.conf +17 -2
  37. data/examples/nginx.conf +14 -14
  38. data/examples/unicorn.conf.minimal.rb +2 -2
  39. data/examples/unicorn.conf.rb +14 -6
  40. data/examples/unicorn.socket +11 -0
  41. data/examples/unicorn@.service +40 -0
  42. data/ext/unicorn_http/common_field_optimization.h +23 -5
  43. data/ext/unicorn_http/ext_help.h +0 -20
  44. data/ext/unicorn_http/extconf.rb +37 -1
  45. data/ext/unicorn_http/global_variables.h +1 -1
  46. data/ext/unicorn_http/httpdate.c +2 -2
  47. data/ext/unicorn_http/unicorn_http.c +940 -644
  48. data/ext/unicorn_http/unicorn_http.rl +167 -170
  49. data/ext/unicorn_http/unicorn_http_common.rl +1 -1
  50. data/lib/unicorn/configurator.rb +110 -46
  51. data/lib/unicorn/const.rb +2 -25
  52. data/lib/unicorn/http_request.rb +110 -31
  53. data/lib/unicorn/http_response.rb +17 -31
  54. data/lib/unicorn/http_server.rb +292 -199
  55. data/lib/unicorn/launcher.rb +1 -1
  56. data/lib/unicorn/oob_gc.rb +16 -6
  57. data/lib/unicorn/socket_helper.rb +58 -78
  58. data/lib/unicorn/stream_input.rb +9 -11
  59. data/lib/unicorn/tee_input.rb +16 -11
  60. data/lib/unicorn/tmpio.rb +10 -6
  61. data/lib/unicorn/util.rb +5 -4
  62. data/lib/unicorn/version.rb +1 -1
  63. data/lib/unicorn/worker.rb +99 -22
  64. data/lib/unicorn.rb +69 -42
  65. data/man/man1/unicorn.1 +124 -122
  66. data/man/man1/unicorn_rails.1 +113 -127
  67. data/t/.gitignore +0 -1
  68. data/t/GNUmakefile +3 -80
  69. data/t/README +4 -4
  70. data/t/t0002-parser-error.sh +3 -3
  71. data/t/t0011-active-unix-socket.sh +1 -1
  72. data/t/t0012-reload-empty-config.sh +2 -1
  73. data/t/t0300-no-default-middleware.sh +6 -1
  74. data/t/t0301-no-default-middleware-ignored-in-config.sh +25 -0
  75. data/t/t0301.ru +13 -0
  76. data/t/test-lib.sh +2 -2
  77. data/test/benchmark/README +14 -4
  78. data/test/benchmark/ddstream.ru +50 -0
  79. data/test/benchmark/readinput.ru +40 -0
  80. data/test/benchmark/uconnect.perl +66 -0
  81. data/test/exec/test_exec.rb +74 -20
  82. data/test/test_helper.rb +42 -33
  83. data/test/unit/test_ccc.rb +91 -0
  84. data/test/unit/test_droplet.rb +1 -1
  85. data/test/unit/test_http_parser.rb +49 -19
  86. data/test/unit/test_http_parser_ng.rb +98 -115
  87. data/test/unit/test_request.rb +11 -11
  88. data/test/unit/test_response.rb +31 -19
  89. data/test/unit/test_server.rb +89 -15
  90. data/test/unit/test_signals.rb +9 -9
  91. data/test/unit/test_socket_helper.rb +20 -14
  92. data/test/unit/test_tee_input.rb +10 -0
  93. data/test/unit/test_upload.rb +10 -15
  94. data/test/unit/test_util.rb +28 -3
  95. data/unicorn.gemspec +28 -23
  96. data/unicorn_1 +1 -0
  97. data/unicorn_rails_1 +1 -0
  98. metadata +64 -134
  99. data/.wrongdoc.yml +0 -10
  100. data/ChangeLog +0 -4694
  101. data/Documentation/GNUmakefile +0 -30
  102. data/Documentation/unicorn.1.txt +0 -178
  103. data/Documentation/unicorn_rails.1.txt +0 -175
  104. data/examples/git.ru +0 -13
  105. data/lib/unicorn/app/exec_cgi.rb +0 -154
  106. data/lib/unicorn/app/inetd.rb +0 -109
  107. data/lib/unicorn/ssl_client.rb +0 -11
  108. data/lib/unicorn/ssl_configurator.rb +0 -104
  109. data/lib/unicorn/ssl_server.rb +0 -42
  110. data/local.mk.sample +0 -59
  111. data/script/isolate_for_tests +0 -32
  112. data/t/hijack.ru +0 -42
  113. data/t/sslgen.sh +0 -71
  114. data/t/t0016-trust-x-forwarded-false.sh +0 -30
  115. data/t/t0017-trust-x-forwarded-true.sh +0 -30
  116. data/t/t0200-rack-hijack.sh +0 -27
  117. data/t/t0600-https-server-basic.sh +0 -48
  118. data/test/unit/test_http_parser_xftrust.rb +0 -38
  119. data/test/unit/test_sni_hostnames.rb +0 -47
data/FAQ CHANGED
@@ -1,12 +1,21 @@
1
1
  = Frequently Asked Questions about Unicorn
2
2
 
3
- === I've installed Rack 1.1.x, why can't Unicorn load Rails (2.3.5)?
3
+ === Why is nginx getting ECONNRESET as a reverse proxy?
4
4
 
5
- Rails 2.3.5 is not compatible with Rack 1.1.x. Unicorn is compatible
6
- with both Rack 1.1.x and Rack 1.0.x, and RubyGems will load the latest
7
- version of Rack installed on the system. Uninstalling the Rack 1.1.x
8
- gem should solve gem loading issues with Rails 2.3.5. Rails 2.3.6
9
- and later correctly support Rack 1.1.x.
5
+ Request body data (commonly from POST and PUT requests) may not be
6
+ drained entirely by the application. This may happen when request
7
+ bodies are gzipped, as unicorn reads request body data lazily to avoid
8
+ overhead from bad requests.
9
+
10
+ Ref: https://yhbt.net/unicorn-public/FC91211E-FD32-432C-92FC-0318714C2170@zendesk.com/
11
+
12
+ === Why aren't my Rails log files rotated when I use SIGUSR1?
13
+
14
+ The Rails autoflush_log option must remain disabled with multiprocess
15
+ servers such as unicorn. Buffering in userspace may cause lines to be
16
+ partially written and lead to corruption in the presence of multiple
17
+ processes. With reasonable amounts of logging, the performance impact
18
+ of autoflush_log should be negligible on Linux and other modern kernels.
10
19
 
11
20
  === Why are my redirects going to "http" URLs when my site uses https?
12
21
 
@@ -51,3 +60,11 @@ queue makes failover to a different machine more difficult.
51
60
 
52
61
  See the TUNING and Unicorn::Configurator documents for more information
53
62
  on :backlog-related topics.
63
+
64
+ === I've installed Rack 1.1.x, why can't Unicorn load Rails (2.3.5)?
65
+
66
+ Rails 2.3.5 is not compatible with Rack 1.1.x. Unicorn is compatible
67
+ with both Rack 1.1.x and Rack 1.0.x, and RubyGems will load the latest
68
+ version of Rack installed on the system. Uninstalling the Rack 1.1.x
69
+ gem should solve gem loading issues with Rails 2.3.5. Rails 2.3.6
70
+ and later correctly support Rack 1.1.x.
data/GIT-VERSION-FILE CHANGED
@@ -1 +1 @@
1
- GIT_VERSION = 4.7.0
1
+ GIT_VERSION = 6.0.0
data/GIT-VERSION-GEN CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- DEF_VER = "v4.7.0"
2
+ DEF_VER = "v6.0.0"
3
3
  CONSTANT = "Unicorn::Const::UNICORN_VERSION"
4
4
  RVF = "lib/unicorn/version.rb"
5
5
  GVF = "GIT-VERSION-FILE"
data/GNUmakefile CHANGED
@@ -8,6 +8,9 @@ RUBY = ruby
8
8
  RAKE = rake
9
9
  RAGEL = ragel
10
10
  RSYNC = rsync
11
+ OLDDOC = olddoc
12
+ RDOC = rdoc
13
+ INSTALL = install
11
14
 
12
15
  GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
13
16
  @./GIT-VERSION-GEN
@@ -23,11 +26,38 @@ endif
23
26
 
24
27
  RUBY_ENGINE := $(shell $(RUBY) -e 'puts((RUBY_ENGINE rescue "ruby"))')
25
28
 
26
- isolate_libs := tmp/isolate/$(RUBY_ENGINE)-$(RUBY_VERSION).mk
27
- $(isolate_libs): script/isolate_for_tests
28
- @$(RUBY) script/isolate_for_tests
29
- -include $(isolate_libs)
30
- MYLIBS = $(RUBYLIB):$(ISOLATE_LIBS)
29
+ # we should never package more than one ext to avoid DSO proliferation:
30
+ # https://udrepper.livejournal.com/8790.html
31
+ ext := $(firstword $(wildcard ext/*))
32
+
33
+ ragel: $(ext)/unicorn_http.c
34
+
35
+ rl_files := $(wildcard $(ext)/*.rl)
36
+ ragel: $(ext)/unicorn_http.c
37
+ $(ext)/unicorn_http.c: $(rl_files)
38
+ cd $(@D) && $(RAGEL) unicorn_http.rl -C $(RLFLAGS) -o $(@F)
39
+ ext_pfx := test/$(RUBY_ENGINE)-$(RUBY_VERSION)
40
+ tmp_bin := $(ext_pfx)/bin
41
+ ext_h := $(wildcard $(ext)/*/*.h $(ext)/*.h)
42
+ ext_src := $(sort $(wildcard $(ext)/*.c) $(ext_h) $(ext)/unicorn_http.c)
43
+ ext_pfx_src := $(addprefix $(ext_pfx)/,$(ext_src))
44
+ ext_dir := $(ext_pfx)/$(ext)
45
+ $(ext)/extconf.rb: $(wildcard $(ext)/*.h)
46
+ @>>$@
47
+ $(ext_dir) $(tmp_bin) man/man1 doc/man1 pkg t/trash:
48
+ @mkdir -p $@
49
+ $(ext_pfx)/$(ext)/%: $(ext)/% | $(ext_dir)
50
+ $(INSTALL) -m 644 $< $@
51
+ $(ext_pfx)/$(ext)/Makefile: $(ext)/extconf.rb $(ext_h) | $(ext_dir)
52
+ $(RM) -f $(@D)/*.o
53
+ cd $(@D) && $(RUBY) $(CURDIR)/$(ext)/extconf.rb $(EXTCONF_ARGS)
54
+ ext_sfx := _ext.$(DLEXT)
55
+ ext_dl := $(ext_pfx)/$(ext)/$(notdir $(ext)_ext.$(DLEXT))
56
+ $(ext_dl): $(ext_src) $(ext_pfx_src) $(ext_pfx)/$(ext)/Makefile
57
+ $(MAKE) -C $(@D)
58
+ lib := $(CURDIR)/lib:$(CURDIR)/$(ext_pfx)/$(ext)
59
+ http build: $(ext_dl)
60
+ $(ext_pfx)/$(ext)/unicorn_http.c: ext/unicorn_http/unicorn_http.c
31
61
 
32
62
  # dunno how to implement this as concisely in Ruby, and hell, I love awk
33
63
  awk_slow := awk '/def test_/{print FILENAME"--"$$2".n"}' 2>/dev/null
@@ -39,43 +69,21 @@ T := $(filter-out $(slow_tests), $(wildcard test/*/test*.rb))
39
69
  T_n := $(shell $(awk_slow) $(slow_tests))
40
70
  T_log := $(subst .rb,$(log_suffix),$(T))
41
71
  T_n_log := $(subst .n,$(log_suffix),$(T_n))
42
- test_prefix = $(CURDIR)/test/$(RUBY_ENGINE)-$(RUBY_VERSION)
43
72
 
44
- ext := ext/unicorn_http
45
- c_files := $(ext)/unicorn_http.c $(ext)/httpdate.c $(wildcard $(ext)/*.h)
46
- rl_files := $(wildcard $(ext)/*.rl)
47
73
  base_bins := unicorn unicorn_rails
48
74
  bins := $(addprefix bin/, $(base_bins))
49
75
  man1_rdoc := $(addsuffix _1, $(base_bins))
50
76
  man1_bins := $(addsuffix .1, $(base_bins))
51
77
  man1_paths := $(addprefix man/man1/, $(man1_bins))
52
- rb_files := $(bins) $(shell find lib ext -type f -name '*.rb')
53
- inst_deps := $(c_files) $(rb_files) GNUmakefile test/test_helper.rb
78
+ tmp_bins = $(addprefix $(tmp_bin)/, unicorn unicorn_rails)
79
+ pid := $(shell echo $$PPID)
54
80
 
55
- ragel: $(ext)/unicorn_http.c
56
- $(ext)/unicorn_http.c: $(rl_files)
57
- cd $(@D) && $(RAGEL) unicorn_http.rl -C $(RLFLAGS) -o $(@F)
58
- $(ext)/Makefile: $(ext)/extconf.rb $(c_files)
59
- cd $(@D) && $(RUBY) extconf.rb
60
- $(ext)/unicorn_http.$(DLEXT): $(ext)/Makefile
61
- $(MAKE) -C $(@D)
62
- lib/unicorn_http.$(DLEXT): $(ext)/unicorn_http.$(DLEXT)
63
- @mkdir -p lib
64
- install -m644 $< $@
65
- http: lib/unicorn_http.$(DLEXT)
66
-
67
- test-install: $(test_prefix)/.stamp
68
- $(test_prefix)/.stamp: $(inst_deps)
69
- mkdir -p $(test_prefix)/.ccache
70
- tar cf - $(inst_deps) GIT-VERSION-GEN | \
71
- (cd $(test_prefix) && tar xf -)
72
- $(MAKE) -C $(test_prefix) clean
73
- $(MAKE) -C $(test_prefix) http shebang RUBY="$(RUBY)"
74
- > $@
75
-
76
- # this is only intended to be run within $(test_prefix)
77
- shebang: $(bins)
78
- $(MRI) -i -p -e '$$_.gsub!(%r{^#!.*$$},"#!$(ruby_bin)")' $^
81
+ $(tmp_bin)/%: bin/% | $(tmp_bin)
82
+ $(INSTALL) -m 755 $< $@.$(pid)
83
+ $(MRI) -i -p -e '$$_.gsub!(%r{^#!.*$$},"#!$(ruby_bin)")' $@.$(pid)
84
+ mv $@.$(pid) $@
85
+
86
+ bins: $(tmp_bins)
79
87
 
80
88
  t_log := $(T_log) $(T_n_log)
81
89
  test: $(T) $(T_n)
@@ -84,13 +92,57 @@ test: $(T) $(T_n)
84
92
 
85
93
  test-exec: $(wildcard test/exec/test_*.rb)
86
94
  test-unit: $(wildcard test/unit/test_*.rb)
87
- $(slow_tests): $(test_prefix)/.stamp
95
+ $(slow_tests): $(ext_dl)
88
96
  @$(MAKE) $(shell $(awk_slow) $@)
89
97
 
90
- test-integration: $(test_prefix)/.stamp
91
- $(MAKE) -C t
98
+ # ensure we can require just the HTTP parser without the rest of unicorn
99
+ test-require: $(ext_dl)
100
+ $(RUBY) --disable-gems -I$(ext_pfx)/$(ext) -runicorn_http -e Unicorn
101
+
102
+ test_prereq := $(tmp_bins) $(ext_dl)
103
+
104
+ SH_TEST_OPTS =
105
+ ifdef V
106
+ ifeq ($(V),2)
107
+ SH_TEST_OPTS += --trace
108
+ else
109
+ SH_TEST_OPTS += --verbose
110
+ endif
111
+ endif
92
112
 
93
- test-all: test test-integration
113
+ # do we trust Ruby behavior to be stable? some tests are
114
+ # (mostly) POSIX sh (not bash or ksh93, so no "set -o pipefail"
115
+ # TRACER = strace -f -o $(t_pfx).strace -s 100000
116
+ # TRACER = /usr/bin/time -o $(t_pfx).time
117
+ t_pfx = trash/$@-$(RUBY_ENGINE)-$(RUBY_VERSION)
118
+ T_sh = $(wildcard t/t[0-9][0-9][0-9][0-9]-*.sh)
119
+ $(T_sh): export RUBY := $(RUBY)
120
+ $(T_sh): export PATH := $(CURDIR)/$(tmp_bin):$(PATH)
121
+ $(T_sh): export RUBYLIB := $(lib):$(RUBYLIB)
122
+ $(T_sh): dep $(test_prereq) t/random_blob t/trash/.gitignore
123
+ cd t && $(TRACER) $(SHELL) $(SH_TEST_OPTS) $(@F) $(TEST_OPTS)
124
+
125
+ t/trash/.gitignore : | t/trash
126
+ echo '*' >$@
127
+
128
+ dependencies := socat curl
129
+ deps := $(addprefix t/.dep+,$(dependencies))
130
+ $(deps): dep_bin = $(lastword $(subst +, ,$@))
131
+ $(deps):
132
+ @which $(dep_bin) > $@.$(pid) 2>/dev/null || :
133
+ @test -s $@.$(pid) || \
134
+ { echo >&2 "E '$(dep_bin)' not found in PATH=$(PATH)"; exit 1; }
135
+ @mv $@.$(pid) $@
136
+ dep: $(deps)
137
+
138
+ t/random_blob:
139
+ dd if=/dev/urandom bs=1M count=30 of=$@.$(pid)
140
+ mv $@.$(pid) $@
141
+
142
+ test-integration: $(T_sh)
143
+
144
+ check: test-require test test-integration
145
+ test-all: check
94
146
 
95
147
  TEST_OPTS = -v
96
148
  check_test = grep '0 failures, 0 errors' $(t) >/dev/null
@@ -118,21 +170,20 @@ run_test = $(quiet_pre) \
118
170
 
119
171
  %.n: arg = $(subst .n,,$(subst --, -n ,$@))
120
172
  %.n: t = $(subst .n,$(log_suffix),$@)
121
- %.n: export PATH := $(test_prefix)/bin:$(PATH)
122
- %.n: export RUBYLIB := $(test_prefix):$(test_prefix)/lib:$(MYLIBS)
123
- %.n: $(test_prefix)/.stamp
173
+ %.n: export PATH := $(CURDIR)/$(tmp_bin):$(PATH)
174
+ %.n: export RUBYLIB := $(lib):$(RUBYLIB)
175
+ %.n: $(test_prereq)
124
176
  $(run_test)
125
177
 
126
178
  $(T): arg = $@
127
179
  $(T): t = $(subst .rb,$(log_suffix),$@)
128
- $(T): export PATH := $(test_prefix)/bin:$(PATH)
129
- $(T): export RUBYLIB := $(test_prefix):$(test_prefix)/lib:$(MYLIBS)
130
- $(T): $(test_prefix)/.stamp
180
+ $(T): export PATH := $(CURDIR)/$(tmp_bin):$(PATH)
181
+ $(T): export RUBYLIB := $(lib):$(RUBYLIB)
182
+ $(T): $(test_prereq)
131
183
  $(run_test)
132
184
 
133
185
  install: $(bins) $(ext)/unicorn_http.c
134
186
  $(prep_setup_rb)
135
- $(RM) lib/unicorn_http.$(DLEXT)
136
187
  $(RM) -r .install-tmp
137
188
  mkdir .install-tmp
138
189
  cp -p bin/* .install-tmp
@@ -147,71 +198,68 @@ prep_setup_rb := @-$(RM) $(setup_rb_files);$(MAKE) -C $(ext) clean
147
198
 
148
199
  clean:
149
200
  -$(MAKE) -C $(ext) clean
150
- -$(MAKE) -C Documentation clean
151
- $(RM) $(ext)/Makefile lib/unicorn_http.$(DLEXT)
201
+ $(RM) $(ext)/Makefile
152
202
  $(RM) $(setup_rb_files) $(t_log)
153
- $(RM) -r $(test_prefix) man
203
+ $(RM) -r $(ext_pfx) man t/trash
204
+ $(RM) $(html1)
205
+
206
+ man1 := $(addprefix Documentation/, unicorn.1 unicorn_rails.1)
207
+ html1 := $(addsuffix .html, $(man1))
208
+ man : $(man1) | man/man1
209
+ $(INSTALL) -m 644 $(man1) man/man1
210
+
211
+ html : $(html1) | doc/man1
212
+ $(INSTALL) -m 644 $(html1) doc/man1
154
213
 
155
- man html:
156
- $(MAKE) -C Documentation install-$@
214
+ %.1.html: %.1
215
+ $(OLDDOC) man2html -o $@ ./$<
157
216
 
158
- pkg_extra := GIT-VERSION-FILE lib/unicorn/version.rb ChangeLog LATEST NEWS \
217
+ pkg_extra := GIT-VERSION-FILE lib/unicorn/version.rb LATEST NEWS \
159
218
  $(ext)/unicorn_http.c $(man1_paths)
160
219
 
161
- ChangeLog: GIT-VERSION-FILE .wrongdoc.yml
162
- wrongdoc prepare
220
+ NEWS:
221
+ $(OLDDOC) prepare
163
222
 
164
- .manifest: ChangeLog $(ext)/unicorn_http.c man
223
+ .manifest: $(ext)/unicorn_http.c man NEWS
165
224
  (git ls-files && for i in $@ $(pkg_extra); do echo $$i; done) | \
166
225
  LC_ALL=C sort > $@+
167
226
  cmp $@+ $@ || mv $@+ $@
168
227
  $(RM) $@+
169
228
 
170
- doc: .document $(ext)/unicorn_http.c man html .wrongdoc.yml
171
- for i in $(man1_rdoc); do echo > $$i; done
229
+ PLACEHOLDERS = $(man1_rdoc)
230
+ doc: .document $(ext)/unicorn_http.c man html .olddoc.yml $(PLACEHOLDERS)
172
231
  find bin lib -type f -name '*.rbc' -exec rm -f '{}' ';'
173
232
  $(RM) -r doc
174
- wrongdoc all
175
- install -m644 COPYING doc/COPYING
176
- install -m644 $(shell LC_ALL=C grep '^[A-Z]' .document) doc/
177
- install -m644 $(man1_paths) doc/
233
+ $(OLDDOC) prepare
234
+ $(RDOC) -f dark216
235
+ $(OLDDOC) merge
236
+ $(INSTALL) -m 644 COPYING doc/COPYING
237
+ $(INSTALL) -m 644 NEWS.atom.xml doc/NEWS.atom.xml
238
+ $(INSTALL) -m 644 $(shell LC_ALL=C grep '^[A-Z]' .document) doc/
239
+ $(INSTALL) -m 644 $(man1_paths) doc/
178
240
  tar cf - $$(git ls-files examples/) | (cd doc && tar xf -)
179
- $(RM) $(man1_rdoc)
180
241
 
181
- # publishes docs to http://unicorn.bogomips.org
242
+ # publishes docs to https://yhbt.net/unicorn/
182
243
  publish_doc:
183
244
  -git set-file-times
184
245
  $(MAKE) doc
185
- find doc/images -type f | \
186
- TZ=UTC xargs touch -d '1970-01-01 00:00:02' doc/rdoc.css
187
246
  $(MAKE) doc_gz
188
247
  chmod 644 $$(find doc -type f)
189
- $(RSYNC) -av doc/ unicorn.bogomips.org:/srv/unicorn/
248
+ $(RSYNC) -av doc/ yhbt.net:/srv/yhbt/unicorn/ \
249
+ --exclude index.html* --exclude created.rid*
190
250
  git ls-files | xargs touch
191
251
 
192
252
  # Create gzip variants of the same timestamp as the original so nginx
193
253
  # "gzip_static on" can serve the gzipped versions directly.
194
- doc_gz: docs = $(shell find doc -type f ! -regex '^.*\.\(gif\|jpg\|png\|gz\)$$')
254
+ doc_gz: docs = $(shell find doc -type f ! -regex '^.*\.gz$$')
195
255
  doc_gz:
196
256
  for i in $(docs); do \
197
257
  gzip --rsyncable -9 < $$i > $$i.gz; touch -r $$i $$i.gz; done
198
258
 
199
259
  ifneq ($(VERSION),)
200
- rfproject := mongrel
201
260
  rfpackage := unicorn
202
261
  pkggem := pkg/$(rfpackage)-$(VERSION).gem
203
262
  pkgtgz := pkg/$(rfpackage)-$(VERSION).tgz
204
- release_notes := release_notes-$(VERSION)
205
- release_changes := release_changes-$(VERSION)
206
-
207
- release-notes: $(release_notes)
208
- release-changes: $(release_changes)
209
- $(release_changes):
210
- wrongdoc release_changes > $@+
211
- $(VISUAL) $@+ && test -s $@+ && mv $@+ $@
212
- $(release_notes):
213
- wrongdoc release_notes > $@+
214
- $(VISUAL) $@+ && test -s $@+ && mv $@+ $@
215
263
 
216
264
  # ensures we're actually on the tagged $(VERSION), only used for release
217
265
  verify:
@@ -228,11 +276,10 @@ fix-perms:
228
276
  gem: $(pkggem)
229
277
 
230
278
  install-gem: $(pkggem)
231
- gem install $(CURDIR)/$<
279
+ gem install --local $(CURDIR)/$<
232
280
 
233
- $(pkggem): .manifest fix-perms
281
+ $(pkggem): .manifest fix-perms | pkg
234
282
  gem build $(rfpackage).gemspec
235
- mkdir -p pkg
236
283
  mv $(@F) $@
237
284
 
238
285
  $(pkgtgz): distdir = $(basename $@)
@@ -247,20 +294,20 @@ $(pkgtgz): .manifest fix-perms
247
294
 
248
295
  package: $(pkgtgz) $(pkggem)
249
296
 
250
- release: verify package $(release_notes) $(release_changes)
251
- # make tgz release on RubyForge
252
- rubyforge add_release -f -n $(release_notes) -a $(release_changes) \
253
- $(rfproject) $(rfpackage) $(VERSION) $(pkgtgz)
297
+ release: verify package
254
298
  # push gem to Gemcutter
255
299
  gem push $(pkggem)
256
- # in case of gem downloads from RubyForge releases page
257
- -rubyforge add_file \
258
- $(rfproject) $(rfpackage) $(VERSION) $(pkggem)
259
- $(RAKE) fm_update VERSION=$(VERSION)
260
300
  else
261
301
  gem install-gem: GIT-VERSION-FILE
262
302
  $(MAKE) $@ VERSION=$(GIT_VERSION)
263
303
  endif
264
304
 
265
- .PHONY: .FORCE-GIT-VERSION-FILE doc $(T) $(slow_tests) man
266
- .PHONY: test-install
305
+ $(PLACEHOLDERS):
306
+ echo olddoc_placeholder > $@
307
+
308
+ check-warnings:
309
+ @(for i in $$(git ls-files '*.rb' bin | grep -v '^setup\.rb$$'); \
310
+ do $(RUBY) --disable-gems -d -W2 -c \
311
+ $$i; done) | grep -v '^Syntax OK$$' || :
312
+
313
+ .PHONY: .FORCE-GIT-VERSION-FILE doc $(T) $(slow_tests) man $(T_sh) clean
data/HACKING CHANGED
@@ -19,16 +19,9 @@ RubyGems.
19
19
  Users of GNU-based systems (such as GNU/Linux) usually have GNU make
20
20
  installed as "make" instead of "gmake".
21
21
 
22
- Since we don't load RubyGems by default, loading Rack properly requires
23
- setting up RUBYLIB to point to where Rack is located. Not loading
24
- RubyGems drastically lowers the time to run the full test suite. You
25
- may setup a "local.mk" file in the top-level working directory to setup
26
- your RUBYLIB and any other environment variables. A "local.mk.sample"
27
- file is provided for reference.
28
-
29
22
  Running the entire test suite with 4 tests in parallel:
30
23
 
31
- gmake -j4 test
24
+ gmake -j4 check
32
25
 
33
26
  Running just one unit test:
34
27
 
@@ -57,24 +50,22 @@ programming experience will come in handy (or be learned) here.
57
50
 
58
51
  === Documentation
59
52
 
60
- We use RDoc 2.5.x with Darkfish for documentation as much as possible,
61
- if you're on Ruby 1.8 you want to install the latest "rdoc" gem. Due to
62
- the lack of RDoc-to-manpage converters we know about, we're writing
63
- manpages in Markdown and converting to troff/HTML with Pandoc.
53
+ Due to the lack of RDoc-to-manpage converters we know about, we're
54
+ writing manpages in Markdown and converting to troff/HTML with Pandoc.
64
55
 
65
56
  Please wrap documentation at 72 characters-per-line or less (long URLs
66
57
  are exempt) so it is comfortably readable from terminals.
67
58
 
68
59
  When referencing mailing list posts, use
69
- "http://mid.gmane.org/$MESSAGE_ID" if possible since the Message-ID
70
- remains searchable even if Gmane becomes unavailable.
60
+ <tt>https://yhbt.net/unicorn-public/$MESSAGE_ID/</tt> if possible
61
+ since the Message-ID remains searchable even if a particular site
62
+ becomes unavailable.
71
63
 
72
64
  === Ruby/C Compatibility
73
65
 
74
- We target Ruby 1.8.6+, 1.9 and will target Rubinius as it becomes
75
- production-ready. We need the Ruby implementation to support fork,
76
- exec, pipe, UNIX signals, access to integer file descriptors and
77
- ability to use unlinked files.
66
+ We target mainline Ruby 1.9.3 and later. We need the Ruby
67
+ implementation to support fork, exec, pipe, UNIX signals, access to
68
+ integer file descriptors and ability to use unlinked files.
78
69
 
79
70
  All of our C code is OS-independent and should run on compilers
80
71
  supported by the versions of Ruby we target.
@@ -103,7 +94,9 @@ preferred because they allow code review and comments in the reply to
103
94
  the patch.
104
95
 
105
96
  We will adhere to mostly the same conventions for patch submissions as
106
- git itself. See the Documentation/SubmittingPatches document
97
+ git itself. See the
98
+ {SubmittingPatches}[https://git.kernel.org/cgit/git/git.git/tree/Documentation/SubmittingPatches]
99
+ document
107
100
  distributed with git on on patch submission guidelines to follow. Just
108
101
  don't email the git mailing list or maintainer with Unicorn patches :)
109
102
 
@@ -111,7 +104,6 @@ don't email the git mailing list or maintainer with Unicorn patches :)
111
104
 
112
105
  In order to build the gem, you must install the following components:
113
106
 
114
- * wrongdoc
115
107
  * pandoc
116
108
 
117
109
  You can build the Unicorn gem with the following command:
@@ -122,13 +114,6 @@ You can build the Unicorn gem with the following command:
122
114
 
123
115
  It is easy to install the contents of your git working directory:
124
116
 
125
- Via RubyGems (RubyGems 1.3.5+ recommended for prerelease versions):
117
+ Via RubyGems
126
118
 
127
119
  gmake install-gem
128
-
129
- Without RubyGems (via setup.rb):
130
-
131
- gmake install
132
-
133
- It is not at all recommended to mix a RubyGems installation with an
134
- installation done without RubyGems, however.
data/ISSUES CHANGED
@@ -1,36 +1,99 @@
1
1
  = Issues
2
2
 
3
- The {mailing list}[mailto:mongrel-unicorn@rubyforge.org] is the best
4
- place to report bugs, submit patches and/or obtain support after you
5
- have searched the mailing list archives and
6
- {documentation}[http://unicorn.bogomips.org].
3
+ mailto:unicorn-public@yhbt.net is the best place to report bugs,
4
+ submit patches and/or obtain support after you have searched the
5
+ {email archives}[https://yhbt.net/unicorn-public/] and
6
+ {documentation}[https://yhbt.net/unicorn/].
7
7
 
8
- * No subscription is needed to post to the mailing list,
9
- let us know that we need to Cc: replies to you if you're unsubscribed.
8
+ * No subscription will ever be required to email us
9
+ * Cc: all participants in a thread or commit, as subscription is optional
10
10
  * Do not {top post}[http://catb.org/jargon/html/T/top-post.html] in replies
11
- * Quote only the relevant portions of the message you're replying to
12
- * Do not send HTML mail
11
+ * Quote as little as possible of the message you're replying to
12
+ * Do not send HTML mail or images,
13
+ they hurt reader privacy and will be flagged as spam
14
+ * Anonymous and pseudonymous messages will ALWAYS be welcome
15
+ * The email submission port (587) is enabled on the yhbt.net MX:
16
+ https://yhbt.net/unicorn-public/20141004232241.GA23908@dcvr.yhbt.net/t/
17
+
18
+ We will never have a centralized or formal bug tracker. Instead we
19
+ can interoperate with any bug tracker which can Cc: us plain-text to
20
+ mailto:unicorn-public@yhbt.net This includes the Debian BTS
21
+ at https://bugs.debian.org/unicorn and possibly others.
13
22
 
14
23
  If your issue is of a sensitive nature or you're just shy in public,
15
- then feel free to email us privately at mailto:unicorn@bogomips.org
16
- instead and your issue will be handled discreetly.
24
+ use anonymity tools such as Tor or Mixmaster; and rely on the public
25
+ mail archives for responses. Be sure to scrub sensitive log messages
26
+ and such.
17
27
 
18
28
  If you don't get a response within a few days, we may have forgotten
19
29
  about it so feel free to ask again.
20
30
 
31
+ == Bugs in related projects
32
+
33
+ unicorn is sometimes affected by bugs in its dependencies. Bugs
34
+ triggered by unicorn in mainline Ruby, rack, GNU C library (glibc),
35
+ or the Linux kernel will be reported upstream and fixed.
36
+
37
+ For bugs in Ruby itself, we may forward bugs to
38
+ https://bugs.ruby-lang.org/ and discuss+fix them on the ruby-core
39
+ list at mailto:ruby-core@ruby-lang.org
40
+ Subscription to post is required to ruby-core, unfortunately:
41
+ mailto:ruby-core-request@ruby-lang.org?subject=subscribe
42
+ Unofficial archives are available at: https://public-inbox.org/ruby-core/
43
+
44
+ For uncommon bugs in Rack, we may forward bugs to
45
+ mailto:rack-devel@googlegroups.com and discuss there.
46
+ Subscription (without any web UI or Google account) is possible via:
47
+ mailto:rack-devel+subscribe@googlegroups.com
48
+ Note: not everyone can use the proprietary bug tracker used by Rack,
49
+ but their mailing list remains operational.
50
+ Unofficial archives are available at: https://public-inbox.org/rack-devel/
51
+
52
+ Uncommon bugs we encounter in the Linux kernel should be Cc:-ed to the
53
+ Linux kernel mailing list (LKML) at mailto:linux-kernel@vger.kernel.org
54
+ and subsystem maintainers such as mailto:netdev@vger.kernel.org
55
+ (for networking issues). It is expected practice to Cc: anybody
56
+ involved with any problematic commits (including those in the
57
+ Signed-off-by: and other trailer lines). No subscription is necessary,
58
+ and the our mailing list follows the same conventions as LKML for
59
+ interopability. Archives are available at https://lore.kernel.org/lkml/
60
+ There is a kernel.org Bugzilla instance, but it is ignored by most.
61
+
62
+ Likewise for any rare glibc bugs we might encounter, we should Cc:
63
+ mailto:libc-alpha@sourceware.org
64
+ Unofficial archives are available at: https://public-inbox.org/libc-alpha/
65
+ Keep in mind glibc upstream does use Bugzilla for tracking bugs:
66
+ https://sourceware.org/bugzilla/
67
+
21
68
  == Submitting Patches
22
69
 
23
70
  See the HACKING document (and additionally, the
24
- Documentation/SubmittingPatches document distributed with git) on
25
- guidelines for patch submission.
71
+ {SubmittingPatches}[https://git.kernel.org/cgit/git/git.git/tree/Documentation/SubmittingPatches]
72
+ document distributed with git) on guidelines for patch submission.
73
+
74
+ == Contact Info
75
+
76
+ * public: mailto:unicorn-public@yhbt.net
77
+ * nntp://news.gmane.io/gmane.comp.lang.ruby.unicorn.general
78
+ * nntp://news.public-inbox.org/inbox.comp.lang.ruby.unicorn
79
+ * imaps://news.public-inbox.org/inbox.comp.lang.ruby.unicorn.0
80
+ * https://yhbt.net/unicorn-public/
81
+ * http://ou63pmih66umazou.onion/unicorn-public/
82
+
83
+ Mailing list subscription is optional, so Cc: all participants.
84
+
85
+ You can follow along via NNTP or IMAP (read-only):
26
86
 
27
- == Mailing List Info
87
+ nntp://news.public-inbox.org/inbox.comp.lang.ruby.unicorn
88
+ nntp://news.gmane.io/gmane.comp.lang.ruby.unicorn.general
89
+ imaps://news.public-inbox.org/inbox.comp.lang.ruby.unicorn.0
90
+ imap://ou63pmih66umazou.onion/inbox.comp.lang.ruby.unicorn.0
28
91
 
29
- * subscribe: http://rubyforge.org/mailman/listinfo/mongrel-unicorn
30
- * post: mailto:mongrel-unicorn@rubyforge.org
31
- * private: mailto:unicorn@bogomips.org
92
+ Or Atom feeds:
32
93
 
33
- == Mailing List Archives
94
+ https://yhbt.net/unicorn-public/new.atom
95
+ http://ou63pmih66umazou.onion/unicorn-public/new.atom
34
96
 
35
- * nntp://news.gmane.org/gmane.comp.lang.ruby.unicorn.general
36
- * http://rubyforge.org/pipermail/mongrel-unicorn
97
+ The HTML archives at https://yhbt.net/unicorn-public/
98
+ also has links to per-thread Atom feeds and downloadable
99
+ mboxes.