Subject: Re: [RFC/PATCHv3] git-instaweb: Add support for running gitweb via 'plackup'

From: Jakub Narebski <[email-masked]>
Date: Sun, 23 May 2010 13:17:07 +0200

On Sun, 23 May 2010, Eric Wong wrote:
> Jakub Narebski <[email-masked]> wrote:
> > On Thu, 20 May 2010, Jakub Narebski wrote:
> > 
> > > The configuration for 'plackup' is currently embedded in generated
> > > gitweb.psgi wrapper, instead of using httpd.conf ($conf).
> > 
> > A question: is this solution acceptable?  Or should the configuration
> > (port, address if git-instaweb was run with '--local', root) be in
> > a separate file.
> 
> Hi Jakub,
> 
> Yes, the psgi wrapper is acceptable and probably ideal.
> 
> My understanding is that the .psgi file is analogous to a .ru file in
> the (Ruby) Rack world[1], and having only a .ru file is probably how I
> would add Rack support to git-instaweb if WEBrick weren't in Ruby
> core[2].

Yes, .psgi file in the (Perl) PSGI/Plack world is, as I understand it,
analogous to .ru file in the (Ruby) Rack world.  PSGI/Plack was inspired
by WSGI from Python world and Rack from Ruby world.

There is no web server in Perl core, although probably HTTP::Server::Simple
and HTTP::Engine comes close.  Well, there is HTTP::Server::Brick inspired
by WEBrick...

Using PSGI/Plack (via wrapper around CGI) allows easily to serve
gitweb's static files (stylesheet, images, etc.), gives persistent
environment (although this probably doesn't matter much for
git-instaweb), and allows for easy switching between different
PSGI-capable (e.g. via PSGI handlers) web servers, including the default
standalone HTTP::Server::PSGI (aka Standalone), HTTP::Server::Simple,
preforking Starlet or Starman, currently via PLACK_SERVER environment
variable.

> > Webrick, which is in similar situation, uses httpd.conf config file in 
> > YAML.  Unfortunately there is no config / serialization reader in Perl
> > core, so if we have to go this route either the config file would have
> > to be in Perl, or gitweb.psgi wrapper would have to include some simple
> > config file parsing.
> 
> I don't think we need parsing in the gitweb.psgi wrapper, we'll just
> consider gitweb.psgi the config file.  

Well, if it is all right, I would keep it as it is now (rebased on top
of Pavan's work related to GSoC 2010).  If we would want to keep config
separate from wrapper (e.g. by installing wrappers in $(gitwebdir)
together with gitweb.cgi, but keeping config files in ~/.gitweb or
.git/gitweb), we can split it later.

> This is also the case for Rack .ru files, which can be made executable
> and have a shebang pointing to "rackup".

Well, generated gitweb.psgi wrapper could have e.g.

  #!/usr/bin/env plackup

or

  #!$PLACKUP

(after putting full path to 'plackup' in $PLACKUP) as a she-bang line
('plackup' is PSGI/Plack equivalent inspired by 'rackup')... if not for
the fact that (as I wrote earlier) different web servers supported by
'plackup' utility have different ways of configuring them.  The common
API is 'plackup' command line options.

However in most operating systems everything after the interpreter in
the she-bang line is passed as *single* option, so for example
generating first line of gitweb.psgi wrapper as

  #!/usr/bin/evn plackup --port=1234 --host=127.0.0.1

wouldn't work.  That is why I used Plack::Runner instead, the module
behind 'plackup'.

As a nice side effect now you don't need to have 'plackup' in $PATH; you
only need to have Plack::Runner in $PERL5LIB (or equivalent), but you
need to have other required modules there anyway.

> [1] - I'm not familiar with Plack/PSGI at all, but I've been dabbling
>       quite a bit in Rack over the past year or two.
> 
> [2] - of course since WEBrick is in Ruby core and WEBrick supports CGI
>       scripts out-of-the-box (unlike Rack), adding Rack support to
>       instaweb would be a waste of time.

-- 
Jakub Narebski
Poland