about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2009-12-10 00:19:35 -0800
committerEric Wong <normalperson@yhbt.net>2009-12-10 00:48:41 -0800
commit50187c319bc5dcfe0f6f3ff7c96826f23716b8ae (patch)
treed4198d37ebe268bb02eb673a213fd910b1209bff
parenta8ef8c7f1156e2624d3cc3a37a72ff82bbc6a159 (diff)
downloadzbatery-0.0.0.tar.gz
prep for release v0.0.0
-rw-r--r--.document6
-rw-r--r--COPYING339
-rw-r--r--Documentation/.gitignore5
-rw-r--r--Documentation/GNUmakefile30
-rw-r--r--Documentation/zbatery.1.txt154
-rwxr-xr-xGIT-VERSION-GEN2
-rw-r--r--GNUmakefile12
-rw-r--r--LICENSE55
-rw-r--r--README130
-rw-r--r--Rakefile158
-rw-r--r--lib/zbatery.rb25
-rw-r--r--local.mk.sample78
-rw-r--r--zbatery.gemspec55
13 files changed, 1030 insertions, 19 deletions
diff --git a/.document b/.document
new file mode 100644
index 0000000..a324f6a
--- /dev/null
+++ b/.document
@@ -0,0 +1,6 @@
+ChangeLog
+lib
+LICENSE
+NEWS
+README
+zbatery.1
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..d511905
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/Documentation/.gitignore b/Documentation/.gitignore
new file mode 100644
index 0000000..46679d6
--- /dev/null
+++ b/Documentation/.gitignore
@@ -0,0 +1,5 @@
+*.1
+*.5
+*.7
+*.gz
+*.html
diff --git a/Documentation/GNUmakefile b/Documentation/GNUmakefile
new file mode 100644
index 0000000..5f97586
--- /dev/null
+++ b/Documentation/GNUmakefile
@@ -0,0 +1,30 @@
+all::
+
+PANDOC = pandoc
+PANDOC_OPTS = -f markdown --email-obfuscation=none --sanitize-html
+pandoc = $(PANDOC) $(PANDOC_OPTS)
+pandoc_html = $(pandoc) --toc -t html --no-wrap
+
+man1 := $(addsuffix .1,zbatery)
+html1 := $(addsuffix .html,$(man1))
+
+all:: html man
+
+html: $(html1)
+man: $(man1)
+
+install-html: html
+        mkdir -p ../doc/man1
+        install -m 644 $(html1) ../doc/man1
+
+install-man: man
+        mkdir -p ../man/man1
+        install -m 644 $(man1) ../man/man1
+
+%.1: %.1.txt
+        $(pandoc) -s -t man < $< > $@+ && mv $@+ $@
+%.1.html: %.1.txt
+        $(pandoc_html) < $< > $@+ && mv $@+ $@
+
+clean::
+        $(RM) $(man1) $(html1)
diff --git a/Documentation/zbatery.1.txt b/Documentation/zbatery.1.txt
new file mode 100644
index 0000000..c352aff
--- /dev/null
+++ b/Documentation/zbatery.1.txt
@@ -0,0 +1,154 @@
+% zbatery(1) Zbatery User Manual
+% Zbatery hackers <rainbows-talk@rubyforge.org>
+% December 9, 2009
+
+# NAME
+
+zbatery - rackup-like command to launch Zbatery
+
+# SYNOPSIS
+
+zbatery [-c CONFIG_FILE] [-E RACK_ENV] [-D] [RACKUP_FILE]
+
+# DESCRIPTION
+
+A rackup(1)-like command to launch Rack applications using
+Zbatery.  It is expected to be started in your application root
+(APP_ROOT), but "Dir.chdir" may also be executed in the CONFIG_FILE or
+RACKUP_FILE.
+
+While Zbatery takes a myriad of command-line options for
+compatibility with ruby(1) and rackup(1), it is recommended to stick
+to the few command-line options specified in the SYNOPSIS and use
+the CONFIG_FILE as much as possible.
+
+# RACKUP FILE
+
+This defaults to \"config.ru\" in APP_ROOT.  It should be the same
+file used by rackup(1) and other Rack launchers, it uses the
+*Rack::Builder* DSL.
+
+Embedded command-line options are mostly parsed for compatibility
+with rackup(1) but strongly discouraged.
+
+# UNICORN OPTIONS
+-c, \--config-file CONFIG_FILE
+:   Path to the Unicorn-specific config file.  The config file is
+    implemented as a Ruby DSL, so Ruby code may executed (e.g.
+    "Dir.chdir", "Process::UID.change_privilege").  See the RDoc/ri
+    for the *Unicorn::Configurator* class for the full list of
+    directives available from the DSL.
+
+-D, \--daemonize
+:   Run daemonized in the background.  The process is detached from
+    the controlling terminal and stdin is redirected to "/dev/null".
+    Unlike many common UNIX daemons, we do not chdir to \"/\"
+    upon daemonization to allow more control over the startup/upgrade
+    process.
+    Unless specified in the CONFIG_FILE, stderr and stdout will
+    also be redirected to "/dev/null".
+
+-E, \--env RACK_ENV
+:   Run under the given RACK_ENV.  See the RACK ENVIRONMENT section
+    for more details.
+
+-l, \--listen ADDRESS
+:   Listens on a given ADDRESS.  ADDRESS may be in the form of
+    HOST:PORT or PATH, HOST:PORT is taken to mean a TCP socket
+    and PATH is meant to be a path to a UNIX domain socket.
+    Defaults to "0.0.0.0:8080" (all addresses on TCP port 8080)
+    For production deployments, specifying the "listen" directive in
+    CONFIG_FILE is recommended as it allows fine-tuning of socket
+    options.
+
+# RACKUP COMPATIBILITY OPTIONS
+-o, \--host HOST
+:   Listen on a TCP socket belonging to HOST, default is
+    "0.0.0.0" (all addresses).
+    If specified multiple times on the command-line, only the
+    last-specified value takes effect.
+    This option only exists for compatibility with the rackup(1) command,
+    use of "-l"/"\--listen" switch is recommended instead.
+
+-p, \--port PORT
+:   Listen on the specified TCP PORT, default is 8080.
+    If specified multiple times on the command-line, only the last-specified
+    value takes effect.
+    This option only exists for compatibility with the rackup(1) command,
+    use of "-l"/"\--listen" switch is recommended instead.
+
+-s, \--server SERVER
+:   No-op, this exists only for compatibility with rackup(1).
+
+# RUBY OPTIONS
+-e, \--eval LINE
+:   Evaluate a LINE of Ruby code.  This evaluation happens
+    immediately as the command-line is being parsed.
+
+-d, \--debug
+:   Turn on debug mode, the $DEBUG variable is set to true.
+
+-w, \--warn
+:   Turn on verbose warnings, the $VERBOSE variable is set to true.
+
+-I, \--include PATH
+:   specify $LOAD_PATH.  PATH will be prepended to $LOAD_PATH.
+    The \':\' character may be used to delimit multiple directories.
+    This directive may be used more than once.  Modifications to
+    $LOAD_PATH take place immediately and in the order they were
+    specified on the command-line.
+
+-r, \--require LIBRARY
+:   require a specified LIBRARY before executing the application.  The
+    \"require\" statement will be executed immediately and in the order
+    they were specified on the command-line.
+
+# SIGNALS
+
+The following UNIX signals may be sent to Zbatery
+(only supported on UNIX):
+
+* HUP - reexecute the binary and exit the current one
+* INT/TERM - quick shutdown, quit immediately
+* QUIT - graceful shutdown, waits for current requests before exiting
+* USR1 - reopen all logs owned by the master and all workers
+  See Unicorn::Util.reopen_logs for what is considered a log.
+* USR2 - reexecute the running binary.  A separate QUIT
+  should be sent to the original process once the child is verified to
+  be up and running.
+
+#  RACK ENVIRONMENT
+
+Accepted values of RACK_ENV and the middleware they automatically load
+(outside of RACKUP_FILE) are exactly as those in rackup(1):
+
+* development - loads Rack::CommonLogger, Rack::ShowExceptions, and
+                Rack::Lint middleware
+* deployment  - loads Rack::CommonLogger middleware
+* none        - loads no middleware at all, relying
+                entirely on RACKUP_FILE
+
+All unrecognized values for RACK_ENV are assumed to be
+"none".  Production deployments are strongly encouraged to use
+"deployment" or "none" for maximum performance.
+
+Note that the Rack::ContentLength and Rack::Chunked middlewares
+are never loaded by default.  If needed, they should be
+individually specified in the RACKUP_FILE, some frameworks do
+not require them.
+
+# SEE ALSO
+
+* unicorn(1)
+* rainbows(1)
+* *Rack::Builder* ri/RDoc
+* *Unicorn::Configurator* ri/RDoc
+* [Zbatery RDoc][1]
+* [Rack RDoc][2]
+* [Rackup HowTo][3]
+* [Rainbows! RDoc][4]
+
+[1]: http://zbatery.bogomip.org/
+[2]: http://rack.rubyforge.org/doc/
+[3]: http://wiki.github.com/rack/rack/tutorial-rackup-howto
+[4]: http://rainbows.rubyforge.org/
diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
index 4e7f0e3..92e03e3 100755
--- a/GIT-VERSION-GEN
+++ b/GIT-VERSION-GEN
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=v0.1.0.GIT
+DEF_VER=v0.0.0.GIT
 
 LF='
 '
diff --git a/GNUmakefile b/GNUmakefile
index 8655ca8..febc331 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -6,7 +6,6 @@ GIT_URL = git://git.bogomips.org/zbatery.git
 
 GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
         @./GIT-VERSION-GEN
-RUBY = ruby
 -include GIT-VERSION-FILE
 -include local.mk
 ifeq ($(DLEXT),) # "so" for Linux
@@ -59,18 +58,20 @@ NEWS: GIT-VERSION-FILE
         $(RAKE) -s news_rdoc > $@+
         mv $@+ $@
 
-SINCE = 0.5.0
+SINCE =
 ChangeLog: LOG_VERSION = \
   $(shell git rev-parse -q "$(GIT_VERSION)" >/dev/null 2>&1 && \
           echo $(GIT_VERSION) || git describe)
+ifneq ($(SINCE),)
 ChangeLog: log_range = v$(SINCE)..$(LOG_VERSION)
+endif
 ChangeLog: GIT-VERSION-FILE
         @echo "ChangeLog from $(GIT_URL) ($(log_range))" > $@+
         @echo >> $@+
         git log $(log_range) | sed -e 's/^/    /' >> $@+
         mv $@+ $@
 
-news_atom := http://zbatery.bogomips.org.org/NEWS.atom.xml
+news_atom := http://zbatery.bogomip.org/NEWS.atom.xml
 cgit_atom := http://git.bogomips.org/cgit/zbatery.git/atom/?h=master
 atom = <link rel="alternate" title="Atom feed" href="$(1)" \
              type="application/atom+xml"/>
@@ -94,11 +95,6 @@ doc: .document NEWS ChangeLog
           doc/NEWS.html doc/README.html
         $(RAKE) -s news_atom > doc/NEWS.atom.xml
         cd doc && ln README.html tmp && mv tmp index.html
-        $(MAKE) -C Documentation comparison.html
-        $(RUBY) -i -p -e \
-          '$$_.gsub!(/INCLUDE/){File.read("Documentation/comparison.html")}' \
-          doc/Summary.html
-        cat Documentation/comparison.css >> doc/rdoc.css
         $(RM) $(man1_bins)
 
 ifneq ($(VERSION),)
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..87eac50
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,55 @@
+Zbatery is copyrighted Free Software by all contributors, see the
+logs in revision control for all of them.  You can redistribute it
+and/or modify it under either the terms of the
+{GPL2}[http://www.gnu.org/licenses/gpl-2.0.txt] (see link:COPYING) or
+the conditions below:
+
+  1. You may make and give away verbatim copies of the source form of the
+     software without restriction, provided that you duplicate all of the
+     original copyright notices and associated disclaimers.
+
+  2. You may modify your copy of the software in any way, provided that
+     you do at least ONE of the following:
+
+       a) place your modifications in the Public Domain or otherwise make them
+       Freely Available, such as by posting said modifications to Usenet or an
+       equivalent medium, or by allowing the author to include your
+       modifications in the software.
+
+       b) use the modified software only within your corporation or
+          organization.
+
+       c) rename any non-standard executables so the names do not conflict with
+       standard executables, which must also be provided.
+
+       d) make other distribution arrangements with the author.
+
+  3. You may distribute the software in object code or executable
+     form, provided that you do at least ONE of the following:
+
+       a) distribute the executables and library files of the software,
+       together with instructions (in the manual page or equivalent) on where
+       to get the original distribution.
+
+       b) accompany the distribution with the machine-readable source of the
+       software.
+
+       c) give non-standard executables non-standard names, with
+          instructions on where to get the original software distribution.
+
+       d) make other distribution arrangements with the author.
+
+  4. You may modify and include the part of the software into any other
+     software (possibly commercial).  But some files in the distribution
+     are not written by the author, so that they are not under this terms.
+
+  5. The scripts and library files supplied as input to or produced as
+     output from the software do not automatically fall under the
+     copyright of the software, but belong to whomever generated them,
+     and may be sold commercially, and may be aggregated with this
+     software.
+
+  6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
+     IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+     PURPOSE.
diff --git a/README b/README
new file mode 100644
index 0000000..af5ffb0
--- /dev/null
+++ b/README
@@ -0,0 +1,130 @@
+= Zbatery: Rack HTTP server without a fork stuck in it
+
+Zbatery is an HTTP server for Rack applications on systems that either
+do not support fork(), or have no memory (nor need) to run the
+master/worker model.  It is based on Rainbows! (which is based on
+Unicorn (which is based on Mongrel)) and inherits parts of each.
+Zbatery supports your choice of all the thread/fiber/event/actor-based
+concurrency models and Rack middleware that Rainbows! supports (or will
+ever support) in a single process.
+
+Zbatery will still exploit certain features of Unix for transparent
+upgrades, log reopening, and graceful stops, but does not rely on them
+for basic functionality.
+
+== Features
+
+* Designed for {Rack}[http://rack.rubyforge.org/], the standard for
+  modern Ruby HTTP applications.
+
+* Configuration files are compatible with Rainbows!, a superset
+  of the Unicorn
+  {DSL}[http://unicorn.bogomips.org/Unicorn/Configurator.html].
+
+* Inherits all features and concurrency models Rainbows! supports
+  (and ever will support): http://rainbows.rubyforge.org/Summary.html
+
+* -Untested- Works under operating systems that don't support signals,
+  pipe and fork().  Unicorn 0.95.2+ has rake-compiler support, so
+  compiling the HTTP parser should be easier at least.
+
+* -Untested- HTML 5 Web Sockets support
+
+== License
+
+Zbatery is copyright 2009 by all contributors (see logs in git).
+It is ultimately based on Mongrel and carries the same license.
+
+Mongrel is copyright 2007 Zed A. Shaw and contributors. It is licensed
+under the Ruby license and the GPL2. See the included LICENSE file for
+details.
+
+Zbatery is 100% Free Software.
+
+== Install
+
+You may download the tarball from the Rainbows project page on Rubyforge
+and run setup.rb after unpacking it:
+
+http://rubyforge.org/frs/?group_id=8977
+
+You may also install it via RubyGems on Gemcutter:
+
+  gem install zbatery
+
+== Usage
+
+=== for Rack applications
+
+In APP_ROOT (where config.ru is located), run:
+
+  zbatery
+
+Zbatery will bind to all interfaces on TCP port 8080 by default.
+
+=== Configuration File(s)
+
+Zbatery will look for the config.ru file used by rackup in APP_ROOT.
+
+For deployments, it can use a config file for Unicorn and
+Rainbows!-specific options specified by the +--config-file/-c+
+command-line switch.  Zbatery accepts all options found in
+{Unicorn::Configurator}[http://unicorn.bogomips.org/Unicorn/Configurator.html]
+as well as the "Rainbows!" block, so you can have the following in your
+config file:
+
+    Rainbows! do
+      use :FiberSpawn
+      worker_connections 400
+    end
+
+See the Rainbows! configuration
+{documentation}[http://rainbows.rubyforge.org/Rainbows.html#M000001]
+for more details.
+
+== Disclaimer
+
+There is NO WARRANTY whatsoever if anything goes wrong, but let us know
+and we'll try our best to fix it.
+
+This project may be temporary and may eventually have its name encoded
+with uncrackable ROT13 encryption leaving you with no way to upgrade.
+
+== Development
+
+Most of the work is done in Rainbows!, Zbatery is just a shim to
+allow access to Rainbows! without requiring fork() or signals.
+
+You can get the latest source via git from the following locations:
+
+  git://git.bogomips.org/zbatery.git
+  git://repo.or.cz/zbatery.git (mirror)
+
+You may browse the code from the web and download the latest snapshot
+tarballs here:
+
+* http://git.bogomips.org/cgit/zbatery.git (cgit)
+* http://repo.or.cz/w/zbatery.git (gitweb)
+
+Inline patches (from "git format-patch") to the mailing list are
+preferred because they allow code review and comments in the reply to
+the patch.
+
+We will adhere to mostly the same conventions for patch submissions as
+git itself.  See the Documentation/SubmittingPatches document
+distributed with git on on patch submission guidelines to follow.  Just
+don't email the git mailing list or maintainer with Zbatery patches.
+
+== Tests
+
+There currently are no tests specific to Zbatery.  Keep in mind that
+Zbatery is only a small shim to drive Rainbows! (and Unicorn)
+underneath.  Rainbows! and Unicorn both have extensive (but very
+UNIX-specific) test suites.
+
+== Contact
+
+All feedback (bug reports, user/development dicussion, patches, pull
+requests) go to the mailing list/newsgroup.  We are currently
+borrowing the Rainbows! mailing list since most of our code (and
+problems) are related to Rainbows! mailto:rainbows-talk@rubyforge.org.
diff --git a/Rakefile b/Rakefile
new file mode 100644
index 0000000..340ce38
--- /dev/null
+++ b/Rakefile
@@ -0,0 +1,158 @@
+# -*- encoding: binary -*-
+
+# most tasks are in the GNUmakefile which offers better parallelism
+
+def tags
+  timefmt = '%Y-%m-%dT%H:%M:%SZ'
+  @tags ||= `git tag -l`.split(/\n/).map do |tag|
+    if %r{\Av[\d\.]+\z} =~ tag
+      header, subject, body = `git cat-file tag #{tag}`.split(/\n\n/, 3)
+      header = header.split(/\n/)
+      tagger = header.grep(/\Atagger /).first
+      body ||= "initial"
+      {
+        :time => Time.at(tagger.split(/ /)[-2].to_i).utc.strftime(timefmt),
+        :tagger_name => %r{^tagger ([^<]+)}.match(tagger)[1].strip,
+        :tagger_email => %r{<([^>]+)>}.match(tagger)[1].strip,
+        :id => `git rev-parse refs/tags/#{tag}`.chomp!,
+        :tag => tag,
+        :subject => subject,
+        :body => body,
+      }
+    end
+  end.compact.sort { |a,b| b[:time] <=> a[:time] }
+end
+
+cgit_url = "http://git.bogomips.org/cgit/zbatery.git"
+git_url = ENV['GIT_URL'] || 'git://git.bogomips.org/zbatery.git'
+
+desc 'prints news as an Atom feed'
+task :news_atom do
+  require 'nokogiri'
+  new_tags = tags[0,10]
+  puts(Nokogiri::XML::Builder.new do
+    feed :xmlns => "http://www.w3.org/2005/Atom" do
+      id! "http://zbatery.bogomip.org/NEWS.atom.xml"
+      title "Zbatery news"
+      subtitle "HTTP server without a fork stuck in it"
+      link! :rel => 'alternate', :type => 'text/html',
+            :href => 'http://zbatery.bogomip.org/NEWS.html'
+      updated(new_tags.empty? ? "1970-01-01T00:00:00Z" : new_tags.first[:time])
+      new_tags.each do |tag|
+        entry do
+          title tag[:subject]
+          updated tag[:time]
+          published tag[:time]
+          author {
+            name tag[:tagger_name]
+            email tag[:tagger_email]
+          }
+          url = "#{cgit_url}/tag/?id=#{tag[:tag]}"
+          link! :rel => "alternate", :type => "text/html", :href =>url
+          id! url
+          message_only = tag[:body].split(/\n.+\(\d+\):\n {6}/s).first.strip
+          content({:type =>:text}, message_only)
+          content(:type =>:xhtml) { pre tag[:body] }
+        end
+      end
+    end
+  end.to_xml)
+end
+
+desc 'prints RDoc-formatted news'
+task :news_rdoc do
+  tags.each do |tag|
+    time = tag[:time].tr!('T', ' ').gsub!(/:\d\dZ/, ' UTC')
+    puts "=== #{tag[:tag].sub(/^v/, '')} / #{time}"
+    puts ""
+
+    body = tag[:body]
+    puts tag[:body].gsub(/^/sm, "  ").gsub(/[ \t]+$/sm, "")
+    puts ""
+  end
+end
+
+desc "print release changelog for Rubyforge"
+task :release_changes do
+  version = ENV['VERSION'] or abort "VERSION= needed"
+  version = "v#{version}"
+  vtags = tags.map { |tag| tag[:tag] =~ /\Av/ and tag[:tag] }.sort
+  prev = vtags[vtags.index(version) - 1]
+  if prev
+    system('git', 'diff', '--stat', prev, version) or abort $?
+    puts ""
+    system('git', 'log', "#{prev}..#{version}") or abort $?
+  else
+    system('git', 'log', version) or abort $?
+  end
+end
+
+desc "print release notes for Rubyforge"
+task :release_notes do
+  require 'rubygems'
+
+  spec = Gem::Specification.load('zbatery.gemspec')
+  puts spec.description.strip
+  puts ""
+  puts "* #{spec.homepage}"
+  puts "* #{spec.email}"
+  puts "* #{git_url}"
+
+  _, _, body = `git cat-file tag v#{spec.version}`.split(/\n\n/, 3)
+  print "\nChanges:\n\n"
+  puts body
+end
+
+desc "read news article from STDIN and post to rubyforge"
+task :publish_news do
+  require 'rubyforge'
+  IO.select([STDIN], nil, nil, 1) or abort "E: news must be read from stdin"
+  msg = STDIN.readlines
+  subject = msg.shift
+  blank = msg.shift
+  blank == "\n" or abort "no newline after subject!"
+  subject.strip!
+  body = msg.join("").strip!
+
+  rf = RubyForge.new.configure
+  rf.login
+  rf.post_news('rainbows', subject, body)
+end
+
+desc "post to RAA"
+task :raa_update do
+  require 'rubygems'
+  require 'net/http'
+  require 'net/netrc'
+  rc = Net::Netrc.locate('zbatery-raa') or abort "~/.netrc not found"
+  password = rc.password
+
+  s = Gem::Specification.load('zbatery.gemspec')
+  desc = [ s.description.strip ]
+  desc << ""
+  desc << "* #{s.email}"
+  desc << "* #{git_url}"
+  desc << "* #{cgit_url}"
+  desc = desc.join("\n")
+  uri = URI.parse('http://raa.ruby-lang.org/regist.rhtml')
+  form = {
+    :name => s.name,
+    :short_description => s.summary,
+    :version => s.version.to_s,
+    :status => 'experimental',
+    :owner => s.authors.first,
+    :email => s.email,
+    :category_major => 'Library',
+    :category_minor => 'Web',
+    :url => s.homepage,
+    :download => "http://rubyforge.org/frs/?group_id=8977",
+    :license => "Ruby's",
+    :description_style => 'Plain',
+    :description => desc,
+    :pass => password,
+    :submit => "Update",
+  }
+  res = Net::HTTP.post_form(uri, form)
+  p res
+  puts res.body
+end
diff --git a/lib/zbatery.rb b/lib/zbatery.rb
index 6ed9134..6b69e6d 100644
--- a/lib/zbatery.rb
+++ b/lib/zbatery.rb
@@ -3,7 +3,21 @@ require 'rainbows'
 
 module Zbatery
 
-  # check if our Ruby implementation supports unlinked files
+  # current version of Zbatery
+  VERSION = "0.0.0"
+
+  class << self
+
+    # runs the Zbatery HttpServer with +app+ and +options+ and does
+    # not return until the server has exited.
+    def run(app, options = {})
+      HttpServer.new(app, options).start.join
+    end
+  end
+
+  Rainbows::Const::RACK_DEFAULTS["SERVER_SOFTWARE"] = "Zbatery #{VERSION}"
+
+  # true if our Ruby implementation supports unlinked files
   UnlinkedIO = begin
     tmp = Unicorn::Util.tmpio
     tmp.chmod(0)
@@ -18,15 +32,6 @@ module Zbatery
   # config files...
   FORK_HOOK = lambda { |_,_| }
 
-  class << self
-
-    # runs the Rainbows! HttpServer with +app+ and +options+ and does
-    # not return until the server has exited.
-    def run(app, options = {})
-      HttpServer.new(app, options).start.join
-    end
-  end
-
   class HttpServer < Rainbows::HttpServer
 
     # only used if no concurrency model is specified
diff --git a/local.mk.sample b/local.mk.sample
new file mode 100644
index 0000000..27311ef
--- /dev/null
+++ b/local.mk.sample
@@ -0,0 +1,78 @@
+
+# this is the local.mk file used by Eric Wong on his dev boxes.
+# GNUmakefile will source local.mk in the top-level source tree
+# if it is present.
+#
+# This is depends on a bunch of GNU-isms from bash, sed, touch.
+
+RSYNC = rsync
+DLEXT := so
+gems := rack-1.0.1
+# gems += unicorn-0.95.2 # installed via setup.rb
+# gems += rainbows-0.8.0 # installed via setup.rb
+gems += rev-0.3.1
+gems += iobuffer-0.1.1
+gems += eventmachine-0.12.10
+gems += async_sinatra-0.1.5 sinatra-0.9.4
+
+# Avoid loading rubygems to speed up tests because gmake is
+# fork+exec heavy with Ruby.
+prefix = $(HOME)
+ifeq ($(r19),)
+  RUBY := $(prefix)/bin/ruby
+  gem_paths := $(addprefix $(prefix)/lib/ruby/gems/1.8/gems/,$(gems))
+else
+  prefix := $(prefix)/ruby-1.9
+  export PATH := $(prefix)/bin:$(PATH)
+  RUBY := $(prefix)/bin/ruby --disable-gems
+  gems += case-0.5 revactor-0.1.5
+  gem_paths := $(addprefix $(prefix)/lib/ruby/gems/1.9.1/gems/,$(gems))
+endif
+
+ifdef gem_paths
+  sp :=
+  sp +=
+  export RUBYLIB := $(subst $(sp),:,$(addsuffix /lib,$(gem_paths)))
+endif
+
+# pipefail is THE reason to use bash (v3+) or never revisions of ksh93
+# SHELL := /bin/bash -e -o pipefail
+SHELL := /bin/ksh93 -e -o pipefail
+
+# trace execution of tests
+# TRACER = strace -f -o $(t_pfx).strace -s 100000
+TRACER = /usr/bin/time -v -o $(t_pfx).time
+
+full-test: test-18 test-19
+test-18:
+        $(MAKE) test 2>&1 | sed -e 's!^!1.8 !'
+test-19:
+        $(MAKE) test r19=t 2>&1 | sed -e 's!^!1.9 !'
+
+latest: NEWS
+        @awk 'BEGIN{RS="=== ";ORS=""}NR==2{sub(/\n$$/,"");print RS""$$0 }' < $<
+
+# publishes docs to http://zbatery.bogomip.org/
+publish_doc:
+        -git set-file-times
+        $(RM) -r doc ChangeLog NEWS
+        $(MAKE) doc LOG_VERSION=$(shell git tag -l | tail -1)
+        $(MAKE) -s latest > doc/LATEST
+        find doc/images doc/js -type f | \
+                TZ=UTC xargs touch -d '1970-01-01 00:00:00' doc/rdoc.css
+        $(MAKE) doc_gz
+        chmod 644 $$(find doc -type f)
+        $(RSYNC) -av doc/ dcvr:/srv/zbatery/
+        git ls-files | xargs touch
+
+# Create gzip variants of the same timestamp as the original so nginx
+# "gzip_static on" can serve the gzipped versions directly.
+doc_gz: docs = $(shell find doc -type f ! -regex '^.*\.\(gif\|jpg\|png\|gz\)$$')
+doc_gz:
+        touch doc/NEWS.atom.xml -d "$$(awk 'NR==1{print $$4,$$5,$$6}' NEWS)"
+        for i in $(docs); do \
+          gzip --rsyncable -9 < $$i > $$i.gz; touch -r $$i $$i.gz; done
+
+# launches any of the following shells with RUBYLIB set
+irb sh bash ksh:
+        $@
diff --git a/zbatery.gemspec b/zbatery.gemspec
new file mode 100644
index 0000000..00510ea
--- /dev/null
+++ b/zbatery.gemspec
@@ -0,0 +1,55 @@
+# -*- encoding: binary -*-
+
+ENV["VERSION"] or abort "VERSION= must be specified"
+manifest = File.readlines('.manifest').map! { |x| x.chomp! }
+
+# don't bother with tests that fork, not worth our time to get working
+# with `gem check -t` ... (of course we care for them when testing with
+# GNU make when they can run in parallel)
+test_files = manifest.grep(%r{\Atest/unit/test_.*\.rb\z}).map do |f|
+  File.readlines(f).grep(/\bfork\b/).empty? ? f : nil
+end.compact
+
+Gem::Specification.new do |s|
+  s.name = %q{zbatery}
+  s.version = ENV["VERSION"]
+
+  s.authors = ["Zbatery hackers"]
+  s.date = Time.now.utc.strftime('%Y-%m-%d')
+  s.description = File.read("README").split(/\n\n/)[1]
+  s.email = %q{rainbows-talk@rubyforge.org}
+  s.executables = %w(zbatery)
+
+  s.extra_rdoc_files = File.readlines('.document').map! do |x|
+    x.chomp!
+    if File.directory?(x)
+      manifest.grep(%r{\A#{x}/})
+    elsif File.file?(x)
+      x
+    else
+      nil
+    end
+  end.flatten.compact
+
+  s.files = manifest
+  s.homepage = %q{http://zbatery.bogomip.org/}
+  s.summary = %q{Rack HTTP server without a fork stuck in it}
+  s.rdoc_options = [ "-Na", "-t", "Zbatery - #{s.summary}" ]
+  s.require_paths = %w(lib)
+  s.rubyforge_project = %q{rainbows}
+
+  s.test_files = test_files
+
+  # rainbows has a boatload of dependencies
+  # required:
+  #   unicorn + rack
+  # optional:
+  #   revactor + rev + iobuffer
+  #   rev + iobuffer
+  #   eventmachine
+  #   espace-neverblock + eventmachine
+  #   async_sinatra + sinatra + eventmachine
+  s.add_dependency(%q<rainbows>, ["~> 0.8.0"])
+
+  # s.licenses = %w(GPLv2 Ruby) # accessor not compatible with older RubyGems
+end