# [PATCH] instaweb: added support Ruby's WEBrick server

8 messages from 2007-09-18 to 2007-10-14. Participants: mike dalessio, Eric Wong, Junio C Hamano, David Symonds, Johannes Schindelin, mike@csa.net.
Thread: https://gitlist.dev/t/9924

## mike dalessio, 2007-09-18 12:16

Subject: [PATCH] instaweb: added support Ruby's WEBrick server
Message-ID: <20070918121634.E8EFF814635@cyrano>
URL: https://gitlist.dev/e/20070918121634.E8EFF814635%40cyrano

```
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>
---
 Documentation/git-instaweb.txt |    3 +-
 git-instaweb.sh                |   44 +++++++++++++++++++++++++++++++++++++++-
 2 files changed, 45 insertions(+), 2 deletions(-)

diff --git a/Documentation/git-instaweb.txt b/Documentation/git-instaweb.txt
index cec60ee..914fc4c 100644
--- a/Documentation/git-instaweb.txt
+++ b/Documentation/git-instaweb.txt
@@ -27,7 +27,8 @@ 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 the only supported
+	servers.
 	(Default: lighttpd)
 
 -m|--module-path::
diff --git a/git-instaweb.sh b/git-instaweb.sh
index b79c6b6..803a754 100755
--- a/git-instaweb.sh
+++ b/git-instaweb.sh
@@ -37,7 +37,9 @@ start_httpd () {
 	else
 		# many httpds are installed in /usr/sbin or /usr/local/sbin
 		# these days and those are not in most users $PATHs
-		for i in /usr/local/sbin /usr/sbin
+		# in addition, we may have generated a server script
+		# in $fqgitdir/gitweb.
+		for i in /usr/local/sbin /usr/sbin $fqgitdir/gitweb
 		do
 			if test -x "$i/$httpd_only"
 			then
@@ -137,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
+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"
@@ -237,6 +276,9 @@ case "$httpd" in
 *apache2*)
 	apache2_conf
 	;;
+webrick)
+	webrick_conf
+	;;
 *)
 	echo "Unknown httpd specified: $httpd"
 	exit 1
-- 
1.5.2.5

```

## Eric Wong, 2007-09-18 20:40

Subject: Re: [PATCH] instaweb: added support Ruby's WEBrick server
Message-ID: <20070918204012.GA28273@untitled>
URL: https://gitlist.dev/e/20070918204012.GA28273%40untitled
In-Reply-To: <20070918121634.E8EFF814635@cyrano>

```
mike dalessio <mike@csa.net> wrote:
> 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>

Acked-by: Eric Wong <normalperson@yhbt.net>

> ---
>  Documentation/git-instaweb.txt |    3 +-
>  git-instaweb.sh                |   44 +++++++++++++++++++++++++++++++++++++++-
>  2 files changed, 45 insertions(+), 2 deletions(-)
> 
> diff --git a/Documentation/git-instaweb.txt b/Documentation/git-instaweb.txt
> index cec60ee..914fc4c 100644
> --- a/Documentation/git-instaweb.txt
> +++ b/Documentation/git-instaweb.txt
> @@ -27,7 +27,8 @@ 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 the only supported
> +	servers.
>  	(Default: lighttpd)
>  
>  -m|--module-path::
> diff --git a/git-instaweb.sh b/git-instaweb.sh
> index b79c6b6..803a754 100755
> --- a/git-instaweb.sh
> +++ b/git-instaweb.sh
> @@ -37,7 +37,9 @@ start_httpd () {
>  	else
>  		# many httpds are installed in /usr/sbin or /usr/local/sbin
>  		# these days and those are not in most users $PATHs
> -		for i in /usr/local/sbin /usr/sbin
> +		# in addition, we may have generated a server script
> +		# in $fqgitdir/gitweb.
> +		for i in /usr/local/sbin /usr/sbin $fqgitdir/gitweb
>  		do
>  			if test -x "$i/$httpd_only"
>  			then
> @@ -137,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
> +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"
> @@ -237,6 +276,9 @@ case "$httpd" in
>  *apache2*)
>  	apache2_conf
>  	;;
> +webrick)
> +	webrick_conf
> +	;;
>  *)
>  	echo "Unknown httpd specified: $httpd"
>  	exit 1
> -- 
> 1.5.2.5
> 

-- 
Eric Wong

```

## Junio C Hamano, 2007-09-18 23:15

Subject: Re: [PATCH] instaweb: added support Ruby's WEBrick server
Message-ID: <7vodfztviv.fsf@gitster.siamese.dyndns.org>
URL: https://gitlist.dev/e/7vodfztviv.fsf%40gitster.siamese.dyndns.org
In-Reply-To: <20070918121634.E8EFF814635@cyrano>

```
mike@csa.net (mike dalessio) writes:

> diff --git a/Documentation/git-instaweb.txt b/Documentation/git-instaweb.txt
> index cec60ee..914fc4c 100644
> --- a/Documentation/git-instaweb.txt
> +++ b/Documentation/git-instaweb.txt
> @@ -27,7 +27,8 @@ 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 the only supported
> +	servers.
>  	(Default: lighttpd)

Perhaps we can start thinking about rewording "are the only
suported servers" to "are supported".

> diff --git a/git-instaweb.sh b/git-instaweb.sh
> index b79c6b6..803a754 100755
> --- a/git-instaweb.sh
> +++ b/git-instaweb.sh
> @@ -37,7 +37,9 @@ start_httpd () {
>  	else
>  		# many httpds are installed in /usr/sbin or /usr/local/sbin
>  		# these days and those are not in most users $PATHs
> -		for i in /usr/local/sbin /usr/sbin
> +		# in addition, we may have generated a server script
> +		# in $fqgitdir/gitweb.
> +		for i in /usr/local/sbin /usr/sbin $fqgitdir/gitweb
>  		do
>  			if test -x "$i/$httpd_only"
>  			then

I do not think this hunk belongs to this patch.  It alone would
be a useful addition to the program even without the rest of
your patch, wouldn't it?  Imagine a case where I automatically
would reject all patches that have "Ruby" in it for some unknown
reason.  Do we want to drop this hunk in such a case?

> +	# 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.

No games with env, type, nor which.  Good.

Just a few style things (-) and one concern (+):

> +	cat > "$fqgitdir/gitweb/$httpd" <<EOF
> +#! /bin/sh
> +ruby $fqgitdir/gitweb/$httpd.rb \$*
> +EOF

 - I do not like extra whitespace between she-bang #! and the
   path.  Looks very ugly.

 - I do not like extra whitespace between redirection > and
   redirected filename either.  Looks very ugly.

 - I prefer such wrapper to exec the command, like this:

	#!/bin/sh
        exec ruby ...

 + fqgitdir and httpd need to be shell quoted.  I do not think
   anybody is stupid enough to have his GIT_DIR set to something
   like "/opt/funny/; rm -f / nuke-me/.git/" but you would see
   spaces and single quotes in pathnames in odd environments.

I wonder how popular instaweb is and how widely it is used.
I've actually wondering if we should demote it to contrib/
somewhere, but it gets occasional updates so people must be
using it...

```

## David Symonds, 2007-09-19 00:41

Subject: Re: [PATCH] instaweb: added support Ruby's WEBrick server
Message-ID: <ee77f5c20709181741jbb2d727t59f561eeaaa075d@mail.gmail.com>
URL: https://gitlist.dev/e/ee77f5c20709181741jbb2d727t59f561eeaaa075d%40mail.gmail.com
In-Reply-To: <7vodfztviv.fsf@gitster.siamese.dyndns.org>

```
On 19/09/2007, Junio C Hamano <gitster@pobox.com> wrote:

>  - I do not like extra whitespace between she-bang #! and the
>    path.  Looks very ugly.

At least according to the Autoconf manual, there are some UNIXes that
require a space after the shebang. Not that I've seen such a system.
Personally, I find it easier to read with the space.


Dave.

```

## Johannes Schindelin, 2007-09-19 01:27

Subject: Re: [PATCH] instaweb: added support Ruby's WEBrick server
Message-ID: <Pine.LNX.4.64.0709190225550.28395@racer.site>
URL: https://gitlist.dev/e/Pine.LNX.4.64.0709190225550.28395%40racer.site
In-Reply-To: <7vodfztviv.fsf@gitster.siamese.dyndns.org>

```
Hi,

On Tue, 18 Sep 2007, Junio C Hamano wrote:

> I wonder how popular instaweb is and how widely it is used. I've 
> actually wondering if we should demote it to contrib/ somewhere, but it 
> gets occasional updates so people must be using it...

I have to admit that I found it easier to install gitweb manually, 
especially with recent documentation enhancements, _and_ the constraint 
that I had to use an existing DocumentRoot.

So I would not be opposed to move this into contrib/.

Ciao,
Dscho

```

## mike@csa.net, 2007-10-06 17:29

Subject: [PATCH 1/2] instaweb: allow for use of auto-generated scripts
Message-ID: <11916917892652-git-send-email-mike@csa.net>
URL: https://gitlist.dev/e/11916917892652-git-send-email-mike%40csa.net
In-Reply-To: <7vodfztviv.fsf@gitster.siamese.dyndns.org>

```
this patch allows scripts that reside in $fqgitdir/gitweb to be used
for firing up an instaweb server. this lays the groundwork for
extending instaweb support to non-standard web servers, which may
require a script for proper invocation.

Signed-off-by: Mike Dalessio <mike@csa.net>
---
 git-instaweb.sh |    4 +++-
 1 files changed, 3 insertions(+), 1 deletions(-)

diff --git a/git-instaweb.sh b/git-instaweb.sh
index b79c6b6..42d9c34 100755
--- a/git-instaweb.sh
+++ b/git-instaweb.sh
@@ -37,7 +37,9 @@ start_httpd () {
 	else
 		# many httpds are installed in /usr/sbin or /usr/local/sbin
 		# these days and those are not in most users $PATHs
-		for i in /usr/local/sbin /usr/sbin
+		# in addition, we may have generated a server script
+		# in $fqgitdir/gitweb.
+		for i in /usr/local/sbin /usr/sbin "$fqgitdir/gitweb"
 		do
 			if test -x "$i/$httpd_only"
 			then
-- 
1.5.2.5

```

## mike@csa.net, 2007-10-06 17:29

Subject: [PATCH 2/2] instaweb: support for Ruby's WEBrick server
Message-ID: <1191691789249-git-send-email-mike@csa.net>
URL: https://gitlist.dev/e/1191691789249-git-send-email-mike%40csa.net
In-Reply-To: <11916917892652-git-send-email-mike@csa.net>

```
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>
---
 Documentation/git-instaweb.txt |    2 +-
 git-instaweb.sh                |   40 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 41 insertions(+), 1 deletions(-)

diff --git a/Documentation/git-instaweb.txt b/Documentation/git-instaweb.txt
index cec60ee..735008c 100644
--- a/Documentation/git-instaweb.txt
+++ b/Documentation/git-instaweb.txt
@@ -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::
diff --git a/git-instaweb.sh b/git-instaweb.sh
index 42d9c34..859be4a 100755
--- a/git-instaweb.sh
+++ b/git-instaweb.sh
@@ -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
-- 
1.5.2.5

```

## Eric Wong, 2007-10-14 09:49

Subject: Re: [PATCH 1/2] instaweb: allow for use of auto-generated scripts
Message-ID: <20071014094922.GA20297@soma>
URL: https://gitlist.dev/e/20071014094922.GA20297%40soma
In-Reply-To: <55e906d58f15c79c61d83ad4c52ef085de8ad736.1191687881.git.mike@csa.net>

```
mike@csa.net wrote:
> this patch allows scripts that reside in $fqgitdir/gitweb to be used
> for firing up an instaweb server. this lays the groundwork for
> extending instaweb support to non-standard web servers, which may
> require a script for proper invocation.
> 
> Signed-off-by: Mike Dalessio <mike@csa.net>

Thanks, sorry for the late reply, it slipped my mind for a while.

Both patches in this series:
Acked-by: Eric Wong <normalperson@yhbt.net>

> ---
>  git-instaweb.sh |    4 +++-
>  1 files changed, 3 insertions(+), 1 deletions(-)
> 
> diff --git a/git-instaweb.sh b/git-instaweb.sh
> index b79c6b6..42d9c34 100755
> --- a/git-instaweb.sh
> +++ b/git-instaweb.sh
> @@ -37,7 +37,9 @@ start_httpd () {
>  	else
>  		# many httpds are installed in /usr/sbin or /usr/local/sbin
>  		# these days and those are not in most users $PATHs
> -		for i in /usr/local/sbin /usr/sbin
> +		# in addition, we may have generated a server script
> +		# in $fqgitdir/gitweb.
> +		for i in /usr/local/sbin /usr/sbin "$fqgitdir/gitweb"
>  		do
>  			if test -x "$i/$httpd_only"
>  			then
> -- 
-- 
Eric Wong

```
