Skip to content

Commit

Permalink
gitweb: selectable configurations that change with each request
Browse files Browse the repository at this point in the history
Allow selecting whether configuration file should be (re)parsed on each
request (the default, for backward compatibility with configurations that
change per session, see commit 7f425db (gitweb: allow configurations that
change with each request, 2010-07-30)), or whether should it be parsed only
once (for performance speedup for persistent environments, though currently
only FastCGI is able to make use of it, when flexibility is not important).

You can also have configuration file parsed only once, but have parts of
configuration (re)evaluated once per each request.

This is done by introducing $per_request_config variable: if set to code
reference, this code would be run once per request, while config file would
be parsed only once.  For example gitolite's contrib/gitweb/gitweb.conf
fragment mentioned in 7f425db could be rewritten as

  our $per_request_config = sub {
  	$ENV{GL_USER} = ($cgi && $cgi->remote_user) || "gitweb";
  };

to make use of this feature.

If $per_request_config is not a code reference, it is taken to be boolean
variable, to choose between running config file for each request
(flexibility), and running config file only once (performance in
persistent environments).

The default value for $per_request_config is 1 (true), which means that
old configuration that require to change per session (like gitolite's)
will keep working.

While at it, make it so evaluate_git_version() is run only once.

Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jakub Narebski authored and Junio C Hamano committed Nov 30, 2010
1 parent 7d43de9 commit da4b243
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 2 deletions.
7 changes: 7 additions & 0 deletions gitweb/README
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,13 @@ not include variables usually directly set during build):
http://www.andre-simon.de due to assumptions about parameters and output).
Useful if highlight is not installed on your webserver's PATH.
[Default: highlight]
* $per_request_config
If set to code reference, it would be run once per each request. You can
set parts of configuration that change per session, e.g. by setting it to
sub { $ENV{GL_USER} = $cgi->remote_user || "gitweb"; }
Otherwise it is treated as boolean value: if true gitweb would process
config file once per request, if false it would process config file only
once. The default is true.

Projects list file format
~~~~~~~~~~~~~~~~~~~~~~~~~
Expand Down
24 changes: 22 additions & 2 deletions gitweb/gitweb.perl
Original file line number Diff line number Diff line change
Expand Up @@ -601,6 +601,14 @@ sub filter_snapshot_fmts {
!$known_snapshot_formats{$_}{'disabled'}} @fmts;
}

# If it is set to code reference, it is code that it is to be run once per
# request, allowing updating configurations that change with each request,
# while running other code in config file only once.
#
# Otherwise, if it is false then gitweb would process config file only once;
# if it is true then gitweb config would be run for each request.
our $per_request_config = 1;

our ($GITWEB_CONFIG, $GITWEB_CONFIG_SYSTEM);
sub evaluate_gitweb_config {
our $GITWEB_CONFIG = $ENV{'GITWEB_CONFIG'} || "++GITWEB_CONFIG++";
Expand Down Expand Up @@ -1070,12 +1078,22 @@ sub reset_timer {
our $number_of_git_cmds = 0;
}

our $first_request = 1;
sub run_request {
reset_timer();

evaluate_uri();
evaluate_gitweb_config();
evaluate_git_version();
if ($first_request) {
evaluate_gitweb_config();
evaluate_git_version();
}
if ($per_request_config) {
if (ref($per_request_config) eq 'CODE') {
$per_request_config->();
} elsif (!$first_request) {
evaluate_gitweb_config();
}
}
check_loadavg();

# $projectroot and $projects_list might be set in gitweb config file
Expand Down Expand Up @@ -1129,6 +1147,7 @@ sub evaluate_argv {
sub run {
evaluate_argv();

$first_request = 1;
$pre_listen_hook->()
if $pre_listen_hook;

Expand All @@ -1141,6 +1160,7 @@ sub run {

$post_dispatch_hook->()
if $post_dispatch_hook;
$first_request = 0;

last REQUEST if ($is_last_request->());
}
Expand Down

0 comments on commit da4b243

Please sign in to comment.