unicorn 4.9.0 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +5 -5
  2. data/.gitattributes +5 -0
  3. data/.olddoc.yml +13 -6
  4. data/Application_Timeouts +7 -7
  5. data/DESIGN +2 -4
  6. data/Documentation/.gitignore +1 -3
  7. data/Documentation/unicorn.1 +222 -0
  8. data/Documentation/unicorn_rails.1 +207 -0
  9. data/FAQ +17 -8
  10. data/GIT-VERSION-GEN +1 -1
  11. data/GNUmakefile +121 -56
  12. data/HACKING +1 -2
  13. data/ISSUES +40 -41
  14. data/KNOWN_ISSUES +11 -11
  15. data/LICENSE +2 -2
  16. data/Links +24 -25
  17. data/PHILOSOPHY +0 -6
  18. data/README +46 -39
  19. data/SIGNALS +2 -2
  20. data/Sandbox +10 -9
  21. data/TODO +0 -2
  22. data/TUNING +30 -9
  23. data/archive/slrnpull.conf +1 -1
  24. data/bin/unicorn +4 -2
  25. data/bin/unicorn_rails +3 -3
  26. data/examples/big_app_gc.rb +1 -1
  27. data/examples/init.sh +36 -8
  28. data/examples/logrotate.conf +17 -2
  29. data/examples/nginx.conf +14 -14
  30. data/examples/unicorn.conf.minimal.rb +2 -2
  31. data/examples/unicorn.conf.rb +3 -6
  32. data/examples/unicorn.socket +11 -0
  33. data/examples/unicorn@.service +40 -0
  34. data/ext/unicorn_http/common_field_optimization.h +23 -5
  35. data/ext/unicorn_http/ext_help.h +0 -20
  36. data/ext/unicorn_http/extconf.rb +37 -1
  37. data/ext/unicorn_http/global_variables.h +1 -1
  38. data/ext/unicorn_http/httpdate.c +2 -2
  39. data/ext/unicorn_http/unicorn_http.rl +167 -170
  40. data/ext/unicorn_http/unicorn_http_common.rl +1 -1
  41. data/lib/unicorn.rb +66 -46
  42. data/lib/unicorn/configurator.rb +110 -44
  43. data/lib/unicorn/const.rb +2 -25
  44. data/lib/unicorn/http_request.rb +110 -31
  45. data/lib/unicorn/http_response.rb +17 -31
  46. data/lib/unicorn/http_server.rb +238 -157
  47. data/lib/unicorn/launcher.rb +1 -1
  48. data/lib/unicorn/oob_gc.rb +6 -6
  49. data/lib/unicorn/socket_helper.rb +58 -78
  50. data/lib/unicorn/stream_input.rb +8 -7
  51. data/lib/unicorn/tee_input.rb +8 -10
  52. data/lib/unicorn/tmpio.rb +8 -7
  53. data/lib/unicorn/util.rb +5 -4
  54. data/lib/unicorn/worker.rb +36 -23
  55. data/t/GNUmakefile +3 -72
  56. data/t/README +4 -4
  57. data/t/t0011-active-unix-socket.sh +1 -1
  58. data/t/t0012-reload-empty-config.sh +2 -1
  59. data/t/t0301-no-default-middleware-ignored-in-config.sh +25 -0
  60. data/t/t0301.ru +13 -0
  61. data/t/test-lib.sh +2 -2
  62. data/test/benchmark/README +14 -4
  63. data/test/benchmark/ddstream.ru +50 -0
  64. data/test/benchmark/readinput.ru +40 -0
  65. data/test/benchmark/uconnect.perl +66 -0
  66. data/test/exec/test_exec.rb +73 -19
  67. data/test/test_helper.rb +40 -31
  68. data/test/unit/test_ccc.rb +91 -0
  69. data/test/unit/test_droplet.rb +1 -1
  70. data/test/unit/test_http_parser.rb +46 -16
  71. data/test/unit/test_http_parser_ng.rb +97 -114
  72. data/test/unit/test_request.rb +10 -10
  73. data/test/unit/test_response.rb +28 -16
  74. data/test/unit/test_server.rb +86 -12
  75. data/test/unit/test_signals.rb +8 -8
  76. data/test/unit/test_socket_helper.rb +14 -10
  77. data/test/unit/test_upload.rb +9 -14
  78. data/test/unit/test_util.rb +27 -2
  79. data/unicorn.gemspec +27 -19
  80. metadata +24 -45
  81. data/Documentation/GNUmakefile +0 -30
  82. data/Documentation/unicorn.1.txt +0 -185
  83. data/Documentation/unicorn_rails.1.txt +0 -175
  84. data/examples/git.ru +0 -13
  85. data/lib/unicorn/app/exec_cgi.rb +0 -154
  86. data/lib/unicorn/app/inetd.rb +0 -109
  87. data/lib/unicorn/ssl_client.rb +0 -11
  88. data/lib/unicorn/ssl_configurator.rb +0 -104
  89. data/lib/unicorn/ssl_server.rb +0 -42
  90. data/t/hijack.ru +0 -42
  91. data/t/t0016-trust-x-forwarded-false.sh +0 -30
  92. data/t/t0017-trust-x-forwarded-true.sh +0 -30
  93. data/t/t0200-rack-hijack.sh +0 -27
  94. data/test/unit/test_http_parser_xftrust.rb +0 -38
  95. data/test/unit/test_sni_hostnames.rb +0 -47
data/FAQ CHANGED
@@ -1,5 +1,14 @@
1
1
  = Frequently Asked Questions about Unicorn
2
2
 
3
+ === Why is nginx getting ECONNRESET as a reverse proxy?
4
+
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
+
3
12
  === Why aren't my Rails log files rotated when I use SIGUSR1?
4
13
 
5
14
  The Rails autoflush_log option must remain disabled with multiprocess
@@ -8,14 +17,6 @@ partially written and lead to corruption in the presence of multiple
8
17
  processes. With reasonable amounts of logging, the performance impact
9
18
  of autoflush_log should be negligible on Linux and other modern kernels.
10
19
 
11
- === I've installed Rack 1.1.x, why can't Unicorn load Rails (2.3.5)?
12
-
13
- Rails 2.3.5 is not compatible with Rack 1.1.x. Unicorn is compatible
14
- with both Rack 1.1.x and Rack 1.0.x, and RubyGems will load the latest
15
- version of Rack installed on the system. Uninstalling the Rack 1.1.x
16
- gem should solve gem loading issues with Rails 2.3.5. Rails 2.3.6
17
- and later correctly support Rack 1.1.x.
18
-
19
20
  === Why are my redirects going to "http" URLs when my site uses https?
20
21
 
21
22
  If your site is entirely behind https, then Rack applications that use
@@ -59,3 +60,11 @@ queue makes failover to a different machine more difficult.
59
60
 
60
61
  See the TUNING and Unicorn::Configurator documents for more information
61
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-GEN CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- DEF_VER = "v4.9.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
@@ -10,6 +10,7 @@ RAGEL = ragel
10
10
  RSYNC = rsync
11
11
  OLDDOC = olddoc
12
12
  RDOC = rdoc
13
+ INSTALL = install
13
14
 
14
15
  GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
15
16
  @./GIT-VERSION-GEN
@@ -25,7 +26,38 @@ endif
25
26
 
26
27
  RUBY_ENGINE := $(shell $(RUBY) -e 'puts((RUBY_ENGINE rescue "ruby"))')
27
28
 
28
- MYLIBS = $(RUBYLIB)
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
29
61
 
30
62
  # dunno how to implement this as concisely in Ruby, and hell, I love awk
31
63
  awk_slow := awk '/def test_/{print FILENAME"--"$$2".n"}' 2>/dev/null
@@ -37,44 +69,21 @@ T := $(filter-out $(slow_tests), $(wildcard test/*/test*.rb))
37
69
  T_n := $(shell $(awk_slow) $(slow_tests))
38
70
  T_log := $(subst .rb,$(log_suffix),$(T))
39
71
  T_n_log := $(subst .n,$(log_suffix),$(T_n))
40
- test_prefix = $(CURDIR)/test/$(RUBY_ENGINE)-$(RUBY_VERSION)
41
72
 
42
- ext := ext/unicorn_http
43
- c_files := $(ext)/unicorn_http.c $(ext)/httpdate.c $(wildcard $(ext)/*.h)
44
- rl_files := $(wildcard $(ext)/*.rl)
45
73
  base_bins := unicorn unicorn_rails
46
74
  bins := $(addprefix bin/, $(base_bins))
47
75
  man1_rdoc := $(addsuffix _1, $(base_bins))
48
76
  man1_bins := $(addsuffix .1, $(base_bins))
49
77
  man1_paths := $(addprefix man/man1/, $(man1_bins))
50
- rb_files := $(bins) $(shell find lib ext -type f -name '*.rb')
51
- 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)
52
80
 
53
- ragel: $(ext)/unicorn_http.c
54
- $(ext)/unicorn_http.c: $(rl_files)
55
- cd $(@D) && $(RAGEL) unicorn_http.rl -C $(RLFLAGS) -o $(@F)
56
- $(ext)/Makefile: $(ext)/extconf.rb $(c_files)
57
- cd $(@D) && $(RUBY) extconf.rb
58
- $(ext)/unicorn_http.$(DLEXT): $(ext)/Makefile
59
- $(MAKE) -C $(@D)
60
- http: $(ext)/unicorn_http.$(DLEXT)
61
-
62
- # only used for tests
63
- http-install: $(ext)/unicorn_http.$(DLEXT)
64
- install -m644 $< lib/
81
+ $(tmp_bin)/%: bin/% | $(tmp_bin)
82
+ $(INSTALL) -m 755 $< $@.$(pid)
83
+ $(MRI) -i -p -e '$$_.gsub!(%r{^#!.*$$},"#!$(ruby_bin)")' $@.$(pid)
84
+ mv $@.$(pid) $@
65
85
 
66
- test-install: $(test_prefix)/.stamp
67
- $(test_prefix)/.stamp: $(inst_deps)
68
- mkdir -p $(test_prefix)/.ccache
69
- tar cf - $(inst_deps) GIT-VERSION-GEN | \
70
- (cd $(test_prefix) && tar xf -)
71
- $(MAKE) -C $(test_prefix) clean
72
- $(MAKE) -C $(test_prefix) http-install shebang RUBY="$(RUBY)"
73
- > $@
74
-
75
- # this is only intended to be run within $(test_prefix)
76
- shebang: $(bins)
77
- $(MRI) -i -p -e '$$_.gsub!(%r{^#!.*$$},"#!$(ruby_bin)")' $^
86
+ bins: $(tmp_bins)
78
87
 
79
88
  t_log := $(T_log) $(T_n_log)
80
89
  test: $(T) $(T_n)
@@ -83,13 +92,56 @@ test: $(T) $(T_n)
83
92
 
84
93
  test-exec: $(wildcard test/exec/test_*.rb)
85
94
  test-unit: $(wildcard test/unit/test_*.rb)
86
- $(slow_tests): $(test_prefix)/.stamp
95
+ $(slow_tests): $(ext_dl)
87
96
  @$(MAKE) $(shell $(awk_slow) $@)
88
97
 
89
- test-integration: $(test_prefix)/.stamp
90
- $(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)
91
103
 
92
- check: test test-integration
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
112
+
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
93
145
  test-all: check
94
146
 
95
147
  TEST_OPTS = -v
@@ -118,16 +170,16 @@ 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)/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)/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
@@ -146,13 +198,21 @@ prep_setup_rb := @-$(RM) $(setup_rb_files);$(MAKE) -C $(ext) clean
146
198
 
147
199
  clean:
148
200
  -$(MAKE) -C $(ext) clean
149
- -$(MAKE) -C Documentation clean
150
201
  $(RM) $(ext)/Makefile
151
202
  $(RM) $(setup_rb_files) $(t_log)
152
- $(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
153
210
 
154
- man html:
155
- $(MAKE) -C Documentation install-$@
211
+ html : $(html1) | doc/man1
212
+ $(INSTALL) -m 644 $(html1) doc/man1
213
+
214
+ %.1.html: %.1
215
+ $(OLDDOC) man2html -o $@ ./$<
156
216
 
157
217
  pkg_extra := GIT-VERSION-FILE lib/unicorn/version.rb LATEST NEWS \
158
218
  $(ext)/unicorn_http.c $(man1_paths)
@@ -171,20 +231,22 @@ doc: .document $(ext)/unicorn_http.c man html .olddoc.yml $(PLACEHOLDERS)
171
231
  find bin lib -type f -name '*.rbc' -exec rm -f '{}' ';'
172
232
  $(RM) -r doc
173
233
  $(OLDDOC) prepare
174
- $(RDOC) -f oldweb
234
+ $(RDOC) -f dark216
175
235
  $(OLDDOC) merge
176
- install -m644 COPYING doc/COPYING
177
- install -m644 $(shell LC_ALL=C grep '^[A-Z]' .document) doc/
178
- install -m644 $(man1_paths) doc/
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/
179
240
  tar cf - $$(git ls-files examples/) | (cd doc && tar xf -)
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
246
  $(MAKE) doc_gz
186
247
  chmod 644 $$(find doc -type f)
187
- $(RSYNC) -av doc/ unicorn.bogomips.org:/srv/unicorn/
248
+ $(RSYNC) -av doc/ yhbt.net:/srv/yhbt/unicorn/ \
249
+ --exclude index.html* --exclude created.rid*
188
250
  git ls-files | xargs touch
189
251
 
190
252
  # Create gzip variants of the same timestamp as the original so nginx
@@ -214,11 +276,10 @@ fix-perms:
214
276
  gem: $(pkggem)
215
277
 
216
278
  install-gem: $(pkggem)
217
- gem install $(CURDIR)/$<
279
+ gem install --local $(CURDIR)/$<
218
280
 
219
- $(pkggem): .manifest fix-perms
281
+ $(pkggem): .manifest fix-perms | pkg
220
282
  gem build $(rfpackage).gemspec
221
- mkdir -p pkg
222
283
  mv $(@F) $@
223
284
 
224
285
  $(pkgtgz): distdir = $(basename $@)
@@ -244,5 +305,9 @@ endif
244
305
  $(PLACEHOLDERS):
245
306
  echo olddoc_placeholder > $@
246
307
 
247
- .PHONY: .FORCE-GIT-VERSION-FILE doc $(T) $(slow_tests) man
248
- .PHONY: test-install
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
@@ -57,7 +57,7 @@ Please wrap documentation at 72 characters-per-line or less (long URLs
57
57
  are exempt) so it is comfortably readable from terminals.
58
58
 
59
59
  When referencing mailing list posts, use
60
- "http://bogomips.org/unicorn-public/m/$MESSAGE_ID.html" if possible
60
+ <tt>https://yhbt.net/unicorn-public/$MESSAGE_ID/</tt> if possible
61
61
  since the Message-ID remains searchable even if a particular site
62
62
  becomes unavailable.
63
63
 
@@ -104,7 +104,6 @@ don't email the git mailing list or maintainer with Unicorn patches :)
104
104
 
105
105
  In order to build the gem, you must install the following components:
106
106
 
107
- * olddoc (RubyGem)
108
107
  * pandoc
109
108
 
110
109
  You can build the Unicorn gem with the following command:
data/ISSUES CHANGED
@@ -1,19 +1,29 @@
1
1
  = Issues
2
2
 
3
- mailto:unicorn-public@bogomips.org is the best place to report bugs,
3
+ mailto:unicorn-public@yhbt.net is the best place to report bugs,
4
4
  submit patches and/or obtain support after you have searched the
5
- {email archives}[http://bogomips.org/unicorn-public/] and
6
- {documentation}[http://unicorn.bogomips.org/].
5
+ {email archives}[https://yhbt.net/unicorn-public/] and
6
+ {documentation}[https://yhbt.net/unicorn/].
7
7
 
8
- * No subscription will ever be required to email the public inbox.
8
+ * No subscription will ever be required to email us
9
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
11
  * Quote as little as possible of the message you're replying to
12
- * Do not send HTML mail, it will likely be flagged as spam
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.
@@ -29,6 +39,7 @@ https://bugs.ruby-lang.org/ and discuss+fix them on the ruby-core
29
39
  list at mailto:ruby-core@ruby-lang.org
30
40
  Subscription to post is required to ruby-core, unfortunately:
31
41
  mailto:ruby-core-request@ruby-lang.org?subject=subscribe
42
+ Unofficial archives are available at: https://public-inbox.org/ruby-core/
32
43
 
33
44
  For uncommon bugs in Rack, we may forward bugs to
34
45
  mailto:rack-devel@googlegroups.com and discuss there.
@@ -36,6 +47,7 @@ Subscription (without any web UI or Google account) is possible via:
36
47
  mailto:rack-devel+subscribe@googlegroups.com
37
48
  Note: not everyone can use the proprietary bug tracker used by Rack,
38
49
  but their mailing list remains operational.
50
+ Unofficial archives are available at: https://public-inbox.org/rack-devel/
39
51
 
40
52
  Uncommon bugs we encounter in the Linux kernel should be Cc:-ed to the
41
53
  Linux kernel mailing list (LKML) at mailto:linux-kernel@vger.kernel.org
@@ -44,11 +56,12 @@ and subsystem maintainers such as mailto:netdev@vger.kernel.org
44
56
  involved with any problematic commits (including those in the
45
57
  Signed-off-by: and other trailer lines). No subscription is necessary,
46
58
  and the our mailing list follows the same conventions as LKML for
47
- interopability. There is a kernel.org Bugzilla instance, but it is
48
- ignored by most developers.
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.
49
61
 
50
62
  Likewise for any rare glibc bugs we might encounter, we should Cc:
51
63
  mailto:libc-alpha@sourceware.org
64
+ Unofficial archives are available at: https://public-inbox.org/libc-alpha/
52
65
  Keep in mind glibc upstream does use Bugzilla for tracking bugs:
53
66
  https://sourceware.org/bugzilla/
54
67
 
@@ -60,41 +73,27 @@ document distributed with git) on guidelines for patch submission.
60
73
 
61
74
  == Contact Info
62
75
 
63
- * public: mailto:unicorn-public@bogomips.org
64
- * private: mailto:unicorn@bogomips.org
65
-
66
- We operate a {public-inbox}[http://public-inbox.org/] which
67
- feeds the mailing list. You may subscribe either using
68
- {ssoma}[http://ssoma.public-inbox.org/] or by sending a mail
69
- to mailto:unicorn-public+subscribe@bogomips.org
70
-
71
- ssoma is a mail archiver/fetcher using git. It operates in a similar
72
- fashion to tools such as slrnpull, fetchmail, or getmail. ssoma
73
- subscription instructions:
74
-
75
- URL=git://bogomips.org/unicorn-public
76
- LISTNAME=unicorn
77
-
78
- # to initialize a maildir (this may be a new or existing maildir,
79
- # ssoma will not touch existing messages)
80
- # If you prefer mbox, use mbox:/path/to/mbox as the last argument
81
- # You may also use imap://$MAILSERVER/INBOX for an IMAP account
82
- # or imaps:// for an IMAPS account, as well.
83
- ssoma add $LISTNAME $URL maildir:/path/to/maildir
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/
84
82
 
85
- # read with your favorite MUA (only using mutt as an example)
86
- mutt -f /path/to/maildir # (or /path/to/mbox)
83
+ Mailing list subscription is optional, so Cc: all participants.
87
84
 
88
- # to keep your mbox or maildir up-to-date, periodically run the following:
89
- ssoma sync $LISTNAME
85
+ You can follow along via NNTP or IMAP (read-only):
90
86
 
91
- # your MUA may modify and delete messages from the maildir or mbox,
92
- # this does not affect ssoma functionality at all
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
93
91
 
94
- # to sync all your ssoma subscriptions
95
- ssoma sync
92
+ Or Atom feeds:
96
93
 
97
- # You may wish to sync in your cronjob
98
- ssoma sync --cron
94
+ https://yhbt.net/unicorn-public/new.atom
95
+ http://ou63pmih66umazou.onion/unicorn-public/new.atom
99
96
 
100
- HTML archives are available here: http://bogomips.org/unicorn-public/
97
+ The HTML archives at https://yhbt.net/unicorn-public/
98
+ also has links to per-thread Atom feeds and downloadable
99
+ mboxes.