Code

instaweb: support for Ruby's WEBrick server
authorMike Dalessio <mike@csa.net>
Sat, 6 Oct 2007 17:29:49 +0000 (13:29 -0400)
committerShawn O. Pearce <spearce@spearce.org>
Tue, 16 Oct 2007 01:36:19 +0000 (21:36 -0400)
running the webrick server with git requires Ruby and Ruby's YAML and
Webrick libraries (both of which come standard with Ruby). nice for
single-user standalone invocations.

the --httpd=webrick option generates a ruby script on the fly to read
httpd.conf options and invoke the web server via library call. this
script is placed in the .git/gitweb directory. it also generates a
shell script in a feeble attempt to invoke ruby in a portable manner,
which assumes that 'ruby' is in the user's $PATH.

Signed-off-by: Mike Dalessio <mike@csa.net>
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Documentation/git-instaweb.txt
git-instaweb.sh

index cec60ee78075aa4411cd637aece93fc38080b0c5..735008c1ab172cda93e6f98b75b401c37f1cd22f 100644 (file)
@@ -27,7 +27,7 @@ OPTIONS
        The HTTP daemon command-line that will be executed.
        Command-line options may be specified here, and the
        configuration file will be added at the end of the command-line.
-       Currently, lighttpd and apache2 are the only supported servers.
+       Currently lighttpd, apache2 and webrick are supported.
        (Default: lighttpd)
 
 -m|--module-path::
index 8eb7f3ed1a1307beb78355aa048812bdbdb1cfbd..2e4eeccaceb434696071be9a8a2f6af24000d976 100755 (executable)
@@ -139,6 +139,43 @@ GIT_DIR="$fqgitdir"
 export GIT_EXEC_PATH GIT_DIR
 
 
+webrick_conf () {
+       # generate a standalone server script in $fqgitdir/gitweb.
+       cat >"$fqgitdir/gitweb/$httpd.rb" <<EOF
+require 'webrick'
+require 'yaml'
+options = YAML::load_file(ARGV[0])
+options[:StartCallback] = proc do
+  File.open(options[:PidFile],"w") do |f|
+    f.puts Process.pid
+  end
+end
+options[:ServerType] = WEBrick::Daemon
+server = WEBrick::HTTPServer.new(options)
+['INT', 'TERM'].each do |signal|
+  trap(signal) {server.shutdown}
+end
+server.start
+EOF
+       # generate a shell script to invoke the above ruby script,
+       # which assumes _ruby_ is in the user's $PATH. that's _one_
+       # portable way to run ruby, which could be installed anywhere,
+       # really.
+       cat >"$fqgitdir/gitweb/$httpd" <<EOF
+#!/bin/sh
+exec ruby "$fqgitdir/gitweb/$httpd.rb" \$*
+EOF
+       chmod +x "$fqgitdir/gitweb/$httpd"
+
+       cat >"$conf" <<EOF
+:Port: $port
+:DocumentRoot: "$fqgitdir/gitweb"
+:DirectoryIndex: ["gitweb.cgi"]
+:PidFile: "$fqgitdir/pid"
+EOF
+       test "$local" = true && echo ':BindAddress: "127.0.0.1"' >> "$conf"
+}
+
 lighttpd_conf () {
        cat > "$conf" <<EOF
 server.document-root = "$fqgitdir/gitweb"
@@ -239,6 +276,9 @@ case "$httpd" in
 *apache2*)
        apache2_conf
        ;;
+webrick)
+       webrick_conf
+       ;;
 *)
        echo "Unknown httpd specified: $httpd"
        exit 1