Subject: Re: Static gitweb content when using pathinfo

From: Jakub Narebski <[email-masked]>
Date: Tue, 17 Apr 2012 14:30:52 +0200

On Mon, 16 Apr 2012, José María Escartín Esteban wrote:
> On 14/04/12 19:19, Jakub Narebski wrote:
>> On Thu, 5 Apr 2012, Jakub Narebski wrote:
>>> On Thu, 5 Apr 2012, José María Escartín Esteban wrote:

>>> There might be problem if you configured your web server to serve gitweb
>>> using it as a handler for subdirectory, so the script name does not need
>>> to appear in URL, e.g.
>>>
>>>   http://localhost/cgi-bin/gitweb
>>>
>>> which would require the following base element
>>>
>>>   <base href="http://localhost/cgi-bin/gitweb/" />
>>
>> [...]
>>
> 
> Yes, that was precisely the problem.

Note that you won't have problem with `http://localhost` as base url
(without any directory), or in more realistic case using virtual host
rather than virtual directory.  The problem is that without '/' the
path part of $base_url is stripped of last element.

Just for completeness.

[...]
> This addition to the man page would of course have been useful, since it took me
> a while to detect that the problem was a missing slash in the base url.
> However, it would not have solved completely my problem, and for me the best has
> been to add the line of code you proposed in the previous email.

So how about the proposed updated addition at the end of this email?

> I am running a Debian testing (wheezy) server, so the distro gitweb files are:
> 
> 	/etc/apache2/conf.d/gitweb
> 	/etc/gitweb.conf
> 	/usr/share/gitweb/gitweb.cgi
> 	/usr/share/gitweb/index.cgi -> /usr/share/gitweb/gitweb.cgi
> 	/usr/share/gitweb/static/*
> 
> I am using two sets of git repositories, and each of the sets works through a
> particular gitolite user:
> 
> 	user     home
> 	----------------------
> 	git      /srv/project
> 	mygit    /srv/mygit
> 
> I wanted that different groups of people were able to browse the 'project' repos
> (in fact it is a mirror from the main project server) from
> 	http://server.example.com/project/ ,
> and the 'mygit' repos from
> 	http://server.example.com/mygit/ .
> And I wanted to keep urls as short and easy as possible, and to avoid
> proliferation of configs as much as possible.

I think that is this "two sets" that created configuration with a problem.
 
> The setup I came up with was to link
> 
> 	/srv/www/project -> /usr/share/gitweb
> 	/srv/www/mygit -> /usr/share/gitweb
> 
> and to use the following configuration files:
> 
> ######### /etc/apache2/conf.d/gitweb ##################
> <Directory /srv/www/project>
>         SetEnv  GITWEB_PROJECTROOT      /srv/git/
>         SetEnv  GITWEB_CONFIG           /etc/gitweb.conf
[...]
> #######################################################
> 
> ######### /etc/gitweb.conf ############################
> $projectroot = $ENV{'GITWEB_PROJECTROOT'}."repositories";
> $git_temp = "/tmp";
> $projects_list = $ENV{'GITWEB_PROJECTROOT'}."projects.list";
> @diff_opts = ();
> $feature{'pathinfo'}{'default'} = [1];
> $feature{'highlight'}{'default'} = [1];
> $projects_list_description_width = 50;
> #######################################################

A question: why not have

          SetEnv  GITWEB_PROJECTROOT      /srv/git

and use

  $projectroot = "$ENV{'GITWEB_PROJECTROOT'}/repositories";
  $projects_list = "$ENV{'GITWEB_PROJECTROOT'}/projects.list";

BTW. what is this $git_temp?  Is it modified gitweb, because core one
doesn't need to use temporary directory for anything nowadays?

A tip: you can use GITWEB_CONFIG_COMMON for the common part of
configuration and separate GITWEB_CONFIG for per-instance configuration.
Though I am not sure if it would help in your case.  It requires
modern gitweb. though.

> Probably there are better ways to implement this, but at least this seems to
> work, once I have added
> 
> 	$base_url .= '/' unless ($base_url =~ m!/$!);
> 
> to /etc/gitweb.conf .

-- >8 ---------- >8 --
Subject: [PATCH] gitweb.conf(5): When to set $base_url

Add a paragraph to description of $base_url variable in gitweb.conf(5)
manpage explaining when and why one might need to set it, and how.

Based-on-report-by: José María Escartín Esteban <[email-masked]>
Signed-off-by: Jakub Narębski <[email-masked]>
---
 Documentation/gitweb.conf.txt |   24 ++++++++++++++++++++++++
 Documentation/gitweb.txt      |    4 ++++
 2 files changed, 28 insertions(+), 0 deletions(-)

diff --git a/Documentation/gitweb.conf.txt b/Documentation/gitweb.conf.txt
index 7aba497..4716a0f 100644
--- a/Documentation/gitweb.conf.txt
+++ b/Documentation/gitweb.conf.txt
@@ -559,6 +559,30 @@ $base_url::
 	PATH_INFO.  Usually gitweb sets its value correctly,
 	and there is no need to set this variable, e.g. to $my_uri or "/".
 	See `$per_request_config` if you need to override it anyway.
++
+You would need to set this variable when using path_info-based URLs
+while using gitweb as a directory handler (which means that full path
+to browse repositories looks like `http://git.example.com/gitweb`
+rather than looking like `http://git.example.com/gitweb/gitweb.cgi`).
+You can find yourself in this situation (gitweb as directory handler)
+when configuring gitweb to use FastCGI interface as shown in
+"Webserver configuration" section on linkgit:gitweb[1] manpage.
++
+If static files are served from 'static' subdirectory of directory
+the gitweb script is handler for, with default URLs of static files
+(e.g. `$logo` is `static/git-logo.png`), then you would need to ensure
+that `$base_url` ends with slash to denote that it is directory, to
+work correctly:
++
+----------------------------------------------------------------------
+$base_url .= '/' unless ($base_url =~ m!/$!);
+----------------------------------------------------------------------
++
+For example if gitweb URL is `http://git.example.com/gitweb`, and
+static files are available in `http://git.example.com/gitweb/static/`
+then `$base_url` must end up to be `http://git.example.com/gitweb/`
+(with trailing slash) for e.g. `static/git-logo.png` relative link
+to refer to `http://git.example.com/gitweb/static/git-logo.png`.

 CONFIGURING GITWEB FEATURES
diff --git a/Documentation/gitweb.txt b/Documentation/gitweb.txt
index b394ecc..c3db66a 100644
--- a/Documentation/gitweb.txt
+++ b/Documentation/gitweb.txt
@@ -473,6 +473,10 @@ With that configuration the full path to browse repositories would be:
 
   http://server/gitweb
 
+Note that for this configuration `$base_url` must be set as described
+in linkgit:gitweb.conf[5] for gitweb to correctly serve static files
+with path_info links.
+
 As PSGI using plackup
 ~~~~~~~~~~~~~~~~~~~~~
 Gitweb can run as PSGI app (via emulation with *CGI::Emulate::PSGI*(3pm)).
-- 
1.7.9