git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Running gitweb under mod_perl
@ 2006-08-24 12:43 Jakub Narebski
  2006-08-24 12:46 ` Johannes Schindelin
                   ` (2 more replies)
  0 siblings, 3 replies; 12+ messages in thread
From: Jakub Narebski @ 2006-08-24 12:43 UTC (permalink / raw)
  To: git

Could you tell me what should I do to run gitweb under mod_perl,
and not as CGI script? What should I put in Apache configuration
(Apache 2.0.54 if this matters, mod_perl 2.0.1)

-- 
Jakub Narebski
Warsaw, Poland
ShadeHawk on #git

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: Running gitweb under mod_perl
  2006-08-24 12:43 Running gitweb under mod_perl Jakub Narebski
@ 2006-08-24 12:46 ` Johannes Schindelin
  2006-08-24 14:05 ` Dennis Stosberg
  2006-08-24 17:49 ` Jakub Narebski
  2 siblings, 0 replies; 12+ messages in thread
From: Johannes Schindelin @ 2006-08-24 12:46 UTC (permalink / raw)
  To: Jakub Narebski; +Cc: git

Hi,

On Thu, 24 Aug 2006, Jakub Narebski wrote:

> Could you tell me what should I do to run gitweb under mod_perl,
> and not as CGI script? What should I put in Apache configuration
> (Apache 2.0.54 if this matters, mod_perl 2.0.1)

I have not checked closely, but it seems that git-instaweb supports 
mod_perl. Maybe you can find out what you have to do by inspecting 
git-instaweb?

Hth,
Dscho

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: Running gitweb under mod_perl
  2006-08-24 12:43 Running gitweb under mod_perl Jakub Narebski
  2006-08-24 12:46 ` Johannes Schindelin
@ 2006-08-24 14:05 ` Dennis Stosberg
  2006-08-24 15:12   ` [PATCH] gitweb: Use --git-dir parameter instead of setting $ENV{'GIT_DIR'} Dennis Stosberg
  2006-09-05 20:32   ` Running gitweb under mod_perl Jakub Narebski
  2006-08-24 17:49 ` Jakub Narebski
  2 siblings, 2 replies; 12+ messages in thread
From: Dennis Stosberg @ 2006-08-24 14:05 UTC (permalink / raw)
  To: Jakub Narebski; +Cc: git

Jakub Narebski wrote:

> Could you tell me what should I do to run gitweb under mod_perl,
> and not as CGI script? 

About two months ago I sent a set of three patches that made gitweb
run with Apache::Registry:

  http://marc.theaimsgroup.com/?l=git&m=115089541911624

The first two patches have found their way into git, so the only
thing left to do is to change the way the path to the git repository
is passed to the git commands.

I haven't updated that patch since then and with all the refactoring
gitweb has seen it surely won't apply anymore, but if there's
interest I can rebase it to current "next".

> What should I put in Apache configuration (Apache 2.0.54 if this
> matters, mod_perl 2.0.1) 

>From my configuration:

  <Directory /home/dennis/public_html/perl>
    Options -Indexes +ExecCGI
    AllowOverride None
    PerlSendHeader On
    SetHandler perl-script
    PerlHandler ModPerl::Registry
  </Directory>

Regards,
Dennis

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH] gitweb: Use --git-dir parameter instead of setting $ENV{'GIT_DIR'}
  2006-08-24 14:05 ` Dennis Stosberg
@ 2006-08-24 15:12   ` Dennis Stosberg
  2006-08-28 15:49     ` [PATCH (amend)] " Jakub Narebski
  2006-09-05 20:32   ` Running gitweb under mod_perl Jakub Narebski
  1 sibling, 1 reply; 12+ messages in thread
From: Dennis Stosberg @ 2006-08-24 15:12 UTC (permalink / raw)
  To: Jakub Narebski; +Cc: git

This makes it possible to run gitweb under mod_perl's Apache::Registry.

Signed-off-by: Dennis Stosberg <dennis@stosberg.net>
---
Gitweb has changed a lot since I last looked into it two months ago,
so this patch is a little different from the former one.  Only very
superficially tested, but seems to work well.

 gitweb/gitweb.perl |   73 +++++++++++++++++++++++++++++-----------------------
 1 files changed, 41 insertions(+), 32 deletions(-)

diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index ae13e3e..73b3663 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -65,6 +65,9 @@ require $GITWEB_CONFIG if -e $GITWEB_CON
 # version of the core git binary
 our $git_version = qx($GIT --version) =~ m/git version (.*)$/ ? $1 : "unknown";
 
+# path to the current git repository
+our $git_dir;
+
 $projects_list ||= $projectroot;
 if (! -d $git_temp) {
 	mkdir($git_temp, 0700) || die_error(undef, "Couldn't mkdir $git_temp");
@@ -99,7 +102,7 @@ if (defined $project && $project) {
 	if (!(-e "$projectroot/$project/HEAD")) {
 		die_error(undef, "No such project");
 	}
-	$ENV{'GIT_DIR'} = "$projectroot/$project";
+	$git_dir = "$projectroot/$project";
 } else {
 	git_project_list();
 	exit;
@@ -375,21 +378,26 @@ sub git_get_referencing {
 ## ----------------------------------------------------------------------
 ## git utility subroutines, invoking git commands
 
+# returns path to the core git executable and the --git-dir parameter
+sub git_cmd {
+    return $GIT, '--git-dir='.$git_dir;
+}
+
 # get HEAD ref of given project as hash
 sub git_read_head {
 	my $project = shift;
-	my $oENV = $ENV{'GIT_DIR'};
+	my $o_git_dir = $git_dir;
 	my $retval = undef;
-	$ENV{'GIT_DIR'} = "$projectroot/$project";
-	if (open my $fd, "-|", $GIT, "rev-parse", "--verify", "HEAD") {
+	$git_dir = "$projectroot/$project";
+	if (open my $fd, "-|", git_cmd(), "rev-parse", "--verify", "HEAD") {
 		my $head = <$fd>;
 		close $fd;
 		if (defined $head && $head =~ /^([0-9a-fA-F]{40})$/) {
 			$retval = $1;
 		}
 	}
-	if (defined $oENV) {
-		$ENV{'GIT_DIR'} = $oENV;
+	if (defined $o_git_dir) {
+		$git_dir = $o_git_dir;
 	}
 	return $retval;
 }
@@ -398,7 +406,7 @@ # get type of given object
 sub git_get_type {
 	my $hash = shift;
 
-	open my $fd, "-|", $GIT, "cat-file", '-t', $hash or return;
+	open my $fd, "-|", git_cmd(), "cat-file", '-t', $hash or return;
 	my $type = <$fd>;
 	close $fd or return;
 	chomp $type;
@@ -412,7 +420,8 @@ sub git_get_project_config {
 	$key =~ s/^gitweb\.//;
 	return if ($key =~ m/\W/);
 
-	my $val = qx($GIT repo-config --get gitweb.$key);
+	my $git_command = join(' ', git_cmd());
+	my $val = qx($git_command repo-config --get gitweb.$key);
 	return ($val);
 }
 
@@ -431,7 +440,7 @@ sub git_get_hash_by_path {
 
 	my $tree = $base;
 
-	open my $fd, "-|", $GIT, "ls-tree", $base, "--", $path
+	open my $fd, "-|", git_cmd(), "ls-tree", $base, "--", $path
 		or die_error(undef, "Open git-ls-tree failed");
 	my $line = <$fd>;
 	close $fd or return undef;
@@ -566,7 +575,7 @@ sub git_read_tag {
 	my %tag;
 	my @comment;
 
-	open my $fd, "-|", $GIT, "cat-file", "tag", $tag_id or return;
+	open my $fd, "-|", git_cmd(), "cat-file", "tag", $tag_id or return;
 	$tag{'id'} = $tag_id;
 	while (my $line = <$fd>) {
 		chomp $line;
@@ -607,7 +616,7 @@ sub git_read_commit {
 		@commit_lines = @$commit_text;
 	} else {
 		$/ = "\0";
-		open my $fd, "-|", $GIT, "rev-list", "--header", "--parents", "--max-count=1", $commit_id or return;
+		open my $fd, "-|", git_cmd(), "rev-list", "--header", "--parents", "--max-count=1", $commit_id or return;
 		@commit_lines = split '\n', <$fd>;
 		close $fd or return;
 		$/ = "\n";
@@ -1219,7 +1228,7 @@ sub git_diff_print {
 	if (defined $from) {
 		$from_tmp = "$git_temp/gitweb_" . $$ . "_from";
 		open my $fd2, "> $from_tmp";
-		open my $fd, "-|", $GIT, "cat-file", "blob", $from;
+		open my $fd, "-|", git_cmd(), "cat-file", "blob", $from;
 		my @file = <$fd>;
 		print $fd2 @file;
 		close $fd2;
@@ -1230,7 +1239,7 @@ sub git_diff_print {
 	if (defined $to) {
 		$to_tmp = "$git_temp/gitweb_" . $$ . "_to";
 		open my $fd2, "> $to_tmp";
-		open my $fd, "-|", $GIT, "cat-file", "blob", $to;
+		open my $fd, "-|", git_cmd(), "cat-file", "blob", $to;
 		my @file = <$fd>;
 		print $fd2 @file;
 		close $fd2;
@@ -1292,7 +1301,7 @@ sub git_project_list {
 		if (!defined $head) {
 			next;
 		}
-		$ENV{'GIT_DIR'} = "$projectroot/$pr->{'path'}";
+		$git_dir = "$projectroot/$pr->{'path'}";
 		my %co = git_read_commit($head);
 		if (!%co) {
 			next;
@@ -1418,7 +1427,7 @@ sub git_summary {
 	      "<tr><td>last change</td><td>$cd{'rfc2822'}</td></tr>\n" .
 	      "</table>\n";
 
-	open my $fd, "-|", $GIT, "rev-list", "--max-count=17", git_read_head($project)
+	open my $fd, "-|", git_cmd(), "rev-list", "--max-count=17", git_read_head($project)
 		or die_error(undef, "Open git-rev-list failed");
 	my @revlist = map { chomp; $_ } <$fd>;
 	close $fd;
@@ -1489,7 +1498,7 @@ sub git_blame2 {
 	if ($ftype !~ "blob") {
 		die_error("400 Bad Request", "Object is not a blob");
 	}
-	open ($fd, "-|", $GIT, "blame", '-l', $file_name, $hash_base)
+	open ($fd, "-|", git_cmd(), "blame", '-l', $file_name, $hash_base)
 		or die_error(undef, "Open git-blame failed");
 	git_header_html();
 	my $formats_nav =
@@ -1543,7 +1552,7 @@ sub git_blame {
 		$hash = git_get_hash_by_path($hash_base, $file_name, "blob")
 			or die_error(undef, "Error lookup file");
 	}
-	open ($fd, "-|", $GIT, "annotate", '-l', '-t', '-r', $file_name, $hash_base)
+	open ($fd, "-|", git_cmd(), "annotate", '-l', '-t', '-r', $file_name, $hash_base)
 		or die_error(undef, "Open git-annotate failed");
 	git_header_html();
 	my $formats_nav =
@@ -1654,7 +1663,7 @@ sub git_blob_plain {
 		}
 	}
 	my $type = shift;
-	open my $fd, "-|", $GIT, "cat-file", "blob", $hash
+	open my $fd, "-|", git_cmd(), "cat-file", "blob", $hash
 		or die_error(undef, "Couldn't cat $file_name, $hash");
 
 	$type ||= git_blob_plain_mimetype($fd, $file_name);
@@ -1687,7 +1696,7 @@ sub git_blob {
 		}
 	}
 	my $have_blame = git_get_project_config_bool ('blame');
-	open my $fd, "-|", $GIT, "cat-file", "blob", $hash
+	open my $fd, "-|", git_cmd(), "cat-file", "blob", $hash
 		or die_error(undef, "Couldn't cat $file_name, $hash");
 	my $mimetype = git_blob_plain_mimetype($fd, $file_name);
 	if ($mimetype !~ m/^text\//) {
@@ -1740,7 +1749,7 @@ sub git_tree {
 		}
 	}
 	$/ = "\0";
-	open my $fd, "-|", $GIT, "ls-tree", '-z', $hash
+	open my $fd, "-|", git_cmd(), "ls-tree", '-z', $hash
 		or die_error(undef, "Open git-ls-tree failed");
 	my @entries = map { chomp; $_ } <$fd>;
 	close $fd or die_error(undef, "Reading tree failed");
@@ -1821,7 +1830,7 @@ sub git_log {
 	my $refs = read_info_ref();
 
 	my $limit = sprintf("--max-count=%i", (100 * ($page+1)));
-	open my $fd, "-|", $GIT, "rev-list", $limit, $hash
+	open my $fd, "-|", git_cmd(), "rev-list", $limit, $hash
 		or die_error(undef, "Open git-rev-list failed");
 	my @revlist = map { chomp; $_ } <$fd>;
 	close $fd;
@@ -1892,7 +1901,7 @@ sub git_commit {
 	if (!defined $parent) {
 		$parent = "--root";
 	}
-	open my $fd, "-|", $GIT, "diff-tree", '-r', '-M', $parent, $hash
+	open my $fd, "-|", git_cmd(), "diff-tree", '-r', '-M', $parent, $hash
 		or die_error(undef, "Open git-diff-tree failed");
 	my @difftree = map { chomp; $_ } <$fd>;
 	close $fd or die_error(undef, "Reading git-diff-tree failed");
@@ -2116,7 +2125,7 @@ sub git_commitdiff {
 	if (!defined $hash_parent) {
 		$hash_parent = $co{'parent'} || '--root';
 	}
-	open my $fd, "-|", $GIT, "diff-tree", '-r', $hash_parent, $hash
+	open my $fd, "-|", git_cmd(), "diff-tree", '-r', $hash_parent, $hash
 		or die_error(undef, "Open git-diff-tree failed");
 	my @difftree = map { chomp; $_ } <$fd>;
 	close $fd or die_error(undef, "Reading git-diff-tree failed");
@@ -2207,7 +2216,7 @@ sub git_commitdiff_plain {
 	if (!defined $hash_parent) {
 		$hash_parent = $co{'parent'} || '--root';
 	}
-	open my $fd, "-|", $GIT, "diff-tree", '-r', $hash_parent, $hash
+	open my $fd, "-|", git_cmd(), "diff-tree", '-r', $hash_parent, $hash
 		or die_error(undef, "Open git-diff-tree failed");
 	my @difftree = map { chomp; $_ } <$fd>;
 	close $fd or die_error(undef, "Reading diff-tree failed");
@@ -2215,7 +2224,7 @@ sub git_commitdiff_plain {
 	# try to figure out the next tag after this commit
 	my $tagname;
 	my $refs = read_info_ref("tags");
-	open $fd, "-|", $GIT, "rev-list", "HEAD";
+	open $fd, "-|", git_cmd(), "rev-list", "HEAD";
 	my @commits = map { chomp; $_ } <$fd>;
 	close $fd;
 	foreach my $commit (@commits) {
@@ -2284,7 +2293,7 @@ sub git_history {
 	git_print_page_path($file_name, $ftype);
 
 	open my $fd, "-|",
-		$GIT, "rev-list", "--full-history", $hash_base, "--", $file_name;
+		git_cmd(), "rev-list", "--full-history", $hash_base, "--", $file_name;
 	print "<table cellspacing=\"0\">\n";
 	my $alternate = 0;
 	while (my $line = <$fd>) {
@@ -2358,7 +2367,7 @@ sub git_search {
 	my $alternate = 0;
 	if ($commit_search) {
 		$/ = "\0";
-		open my $fd, "-|", $GIT, "rev-list", "--header", "--parents", $hash or next;
+		open my $fd, "-|", git_cmd(), "rev-list", "--header", "--parents", $hash or next;
 		while (my $commit_text = <$fd>) {
 			if (!grep m/$searchtext/i, $commit_text) {
 				next;
@@ -2408,7 +2417,7 @@ sub git_search {
 
 	if ($pickaxe_search) {
 		$/ = "\n";
-		open my $fd, "-|", "$GIT rev-list $hash | $GIT diff-tree -r --stdin -S\'$searchtext\'";
+		open my $fd, "-|", git_cmd()." rev-list $hash | ".git_cmd()." diff-tree -r --stdin -S\'$searchtext\'";
 		undef %co;
 		my @files;
 		while (my $line = <$fd>) {
@@ -2471,7 +2480,7 @@ sub git_shortlog {
 	my $refs = read_info_ref();
 
 	my $limit = sprintf("--max-count=%i", (100 * ($page+1)));
-	open my $fd, "-|", $GIT, "rev-list", $limit, $hash
+	open my $fd, "-|", git_cmd(), "rev-list", $limit, $hash
 		or die_error(undef, "Open git-rev-list failed");
 	my @revlist = map { chomp; $_ } <$fd>;
 	close $fd;
@@ -2499,7 +2508,7 @@ ## feeds (RSS, OPML)
 
 sub git_rss {
 	# http://www.notestips.com/80256B3A007F2692/1/NAMO5P9UPQ
-	open my $fd, "-|", $GIT, "rev-list", "--max-count=150", git_read_head($project)
+	open my $fd, "-|", git_cmd(), "rev-list", "--max-count=150", git_read_head($project)
 		or die_error(undef, "Open git-rev-list failed");
 	my @revlist = map { chomp; $_ } <$fd>;
 	close $fd or die_error(undef, "Reading git-rev-list failed");
@@ -2520,7 +2529,7 @@ sub git_rss {
 			last;
 		}
 		my %cd = date_str($co{'committer_epoch'});
-		open $fd, "-|", $GIT, "diff-tree", '-r', $co{'parent'}, $co{'id'} or next;
+		open $fd, "-|", git_cmd(), "diff-tree", '-r', $co{'parent'}, $co{'id'} or next;
 		my @difftree = map { chomp; $_ } <$fd>;
 		close $fd or next;
 		print "<item>\n" .
@@ -2573,7 +2582,7 @@ sub git_opml {
 		if (!defined $head) {
 			next;
 		}
-		$ENV{'GIT_DIR'} = "$projectroot/$proj{'path'}";
+		$git_dir = "$projectroot/$proj{'path'}";
 		my %co = git_read_commit($head);
 		if (!%co) {
 			next;
-- 
1.4.2

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: Running gitweb under mod_perl
  2006-08-24 12:43 Running gitweb under mod_perl Jakub Narebski
  2006-08-24 12:46 ` Johannes Schindelin
  2006-08-24 14:05 ` Dennis Stosberg
@ 2006-08-24 17:49 ` Jakub Narebski
  2006-08-24 19:32   ` Dennis Stosberg
  2 siblings, 1 reply; 12+ messages in thread
From: Jakub Narebski @ 2006-08-24 17:49 UTC (permalink / raw)
  To: git

By the way, does the "static" variables works under mod_perl? i.e.

{
  my $private_var = "something"

  sub some_sub {
    ...
  }

  sub other_sub {
    ...
  }
}

-- 
Jakub Narebski
Warsaw, Poland
ShadeHawk on #git

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: Running gitweb under mod_perl
  2006-08-24 17:49 ` Jakub Narebski
@ 2006-08-24 19:32   ` Dennis Stosberg
  2006-08-24 20:59     ` Jakub Narebski
  0 siblings, 1 reply; 12+ messages in thread
From: Dennis Stosberg @ 2006-08-24 19:32 UTC (permalink / raw)
  To: Jakub Narebski; +Cc: git

Jakub Narebski wrote:

> By the way, does the "static" variables works under mod_perl? i.e.
> 
> {
>   my $private_var = "something"
> 
>   sub some_sub {
>     ...
>   }
> 
>   sub other_sub {
>     ...
>   }
> }

Depends on what you expect.  The variable will remain shared between
those subs over successive executions, but it will not be reinitialised
to "something" -- at least not visibly to the subs:

On the first invocation, $private_var is initialised and the two
subroutines are created.  Internally, they refer to the _instance_ of
$private_var.  The next time the script is run by mod_perl, $private_var
gets initialised again, but the subs are persistent and still refer to
the old instance.  _Their_ copy of the variable will still be shared
between them, but it will not be reset to "something".

So it should work, but I would avoid such a construction if possible.

Apache::Registry wraps the whole script in another function, which
is called on each request, so your piece of code really looks somewhat
like this:

#!/usr/bin/perl
sub handler {
    # do something
    {
        my $a = 'A';
	sub sub_a { $a .= 'B' }
	sub sub_b { print $a."\n" }
    }
    sub_a();
    sub_b();
}
for(1..10) { handler() }

Regards,
Dennis

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: Running gitweb under mod_perl
  2006-08-24 19:32   ` Dennis Stosberg
@ 2006-08-24 20:59     ` Jakub Narebski
  2006-08-25  1:13       ` Randal L. Schwartz
  0 siblings, 1 reply; 12+ messages in thread
From: Jakub Narebski @ 2006-08-24 20:59 UTC (permalink / raw)
  To: git

Dennis Stosberg wrote:

> Jakub Narebski wrote:
> 
>> By the way, does the "static" variables works under mod_perl? i.e.
>> 
>> {
>>   my $private_var = "something"
>> 
>>   sub some_sub {
>>     ...
>>   }
>> 
>>   sub other_sub {
>>     ...
>>   }
>> }
> 
> Depends on what you expect.  The variable will remain shared between
> those subs over successive executions, but it will not be reinitialised
> to "something" -- at least not visibly to the subs:

Well, I wanted to share read-only variable, initialized once and not
changed at all. It could be global variable, but it is used only by
those two functions.

> On the first invocation, $private_var is initialised and the two
> subroutines are created.  Internally, they refer to the _instance_ of
> $private_var.  The next time the script is run by mod_perl, $private_var
> gets initialised again, but the subs are persistent and still refer to
> the old instance.  _Their_ copy of the variable will still be shared
> between them, but it will not be reset to "something".

I don't need to reinitialize $private_var -- it is not changed. 

> Apache::Registry wraps the whole script in another function, which
> is called on each request, so your piece of code really looks somewhat
> like this:
> 
> #!/usr/bin/perl
> sub handler {
>     # do something
>     {
>         my $a = 'A';
>         sub sub_a { $a .= 'B' }
>         sub sub_b { print $a."\n" }
>     }
>     sub_a();
>     sub_b();
> }
> for(1..10) { handler() }

Thanks for an explanation.

Is there any way to check at _runtime_ if script is run under mod_perl,
or would it be simplier (after script reorganization) for install time
selection of using CGI, FastCGI, or Apache2::something...?
-- 
Jakub Narebski
Warsaw, Poland
ShadeHawk on #git

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: Running gitweb under mod_perl
  2006-08-24 20:59     ` Jakub Narebski
@ 2006-08-25  1:13       ` Randal L. Schwartz
  0 siblings, 0 replies; 12+ messages in thread
From: Randal L. Schwartz @ 2006-08-25  1:13 UTC (permalink / raw)
  To: Jakub Narebski; +Cc: git

>>>>> "Jakub" == Jakub Narebski <jnareb@gmail.com> writes:

Jakub> Is there any way to check at _runtime_ if script is run under mod_perl,
Jakub> or would it be simplier (after script reorganization) for install time
Jakub> selection of using CGI, FastCGI, or Apache2::something...?

Yeah, look at the first few dozen lines of CGI.pm - it has to do different
things based on whether it's being run under mod_perl.

-- 
Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
<merlyn@stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>
Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH (amend)] gitweb: Use --git-dir parameter instead of setting $ENV{'GIT_DIR'}
  2006-08-24 15:12   ` [PATCH] gitweb: Use --git-dir parameter instead of setting $ENV{'GIT_DIR'} Dennis Stosberg
@ 2006-08-28 15:49     ` Jakub Narebski
  2006-08-29  7:18       ` Dennis Stosberg
  2006-08-29  7:19       ` [PATCH] use do() instead of require() to include configuration Dennis Stosberg
  0 siblings, 2 replies; 12+ messages in thread
From: Jakub Narebski @ 2006-08-28 15:49 UTC (permalink / raw)
  To: git; +Cc: Dennis Stosberg, Jakub Narebski

From: Dennis Stosberg <dennis@stosberg.net>

This makes it possible to run gitweb under mod_perl's Apache::Registry.

Signed-off-by: Dennis Stosberg <dennis@stosberg.net>
Signed-off-by: Jakub Narebski <jnareb@gmail.com>
---
Updated to the 'next' version (v1.4.2-gc6063de).

It needs fairly new git version, with --git-dir=<path> parameter
to git wrapper, i.e. post v1.4.2-rc2-g6acbcb9 version.

Dennis, could you check that it works for you in 'next'
version of gitweb? The patch you sent is pre-rename even...

 gitweb/gitweb.perl |   90 +++++++++++++++++++++++++++++++---------------------
 1 files changed, 54 insertions(+), 36 deletions(-)

diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index ef09cf5..f421825 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -157,6 +157,9 @@ require $GITWEB_CONFIG if -e $GITWEB_CON
 # version of the core git binary
 our $git_version = qx($GIT --version) =~ m/git version (.*)$/ ? $1 : "unknown";
 
+# path to the current git repository
+our $git_dir;
+
 $projects_list ||= $projectroot;
 
 # ======================================================================
@@ -184,7 +187,7 @@ if (defined $project) {
 	if (!(-e "$projectroot/$project/HEAD")) {
 		die_error(undef, "No such project");
 	}
-	$ENV{'GIT_DIR'} = "$projectroot/$project";
+	$git_dir = "$projectroot/$project";
 }
 
 our $file_name = $cgi->param('f');
@@ -572,21 +575,31 @@ sub format_diff_line {
 ## ----------------------------------------------------------------------
 ## git utility subroutines, invoking git commands
 
+# returns path to the core git executable and the --git-dir parameter as list
+sub git_cmd {
+	return $GIT, '--git-dir='.$git_dir;
+}
+
+# returns path to the core git executable and the --git-dir parameter as string
+sub git_cmd_str {
+	return join(' ', git_cmd());
+}
+
 # get HEAD ref of given project as hash
 sub git_get_head_hash {
 	my $project = shift;
-	my $oENV = $ENV{'GIT_DIR'};
+	my $o_git_dir = $git_dir;
 	my $retval = undef;
-	$ENV{'GIT_DIR'} = "$projectroot/$project";
-	if (open my $fd, "-|", $GIT, "rev-parse", "--verify", "HEAD") {
+	$git_dir = "$projectroot/$project";
+	if (open my $fd, "-|", git_cmd(), "rev-parse", "--verify", "HEAD") {
 		my $head = <$fd>;
 		close $fd;
 		if (defined $head && $head =~ /^([0-9a-fA-F]{40})$/) {
 			$retval = $1;
 		}
 	}
-	if (defined $oENV) {
-		$ENV{'GIT_DIR'} = $oENV;
+	if (defined $o_git_dir) {
+		$git_dir = $o_git_dir;
 	}
 	return $retval;
 }
@@ -595,7 +608,7 @@ # get type of given object
 sub git_get_type {
 	my $hash = shift;
 
-	open my $fd, "-|", $GIT, "cat-file", '-t', $hash or return;
+	open my $fd, "-|", git_cmd(), "cat-file", '-t', $hash or return;
 	my $type = <$fd>;
 	close $fd or return;
 	chomp $type;
@@ -609,7 +622,7 @@ sub git_get_project_config {
 	$key =~ s/^gitweb\.//;
 	return if ($key =~ m/\W/);
 
-	my @x = ($GIT, 'repo-config');
+	my @x = (git_cmd(), 'repo-config');
 	if (defined $type) { push @x, $type; }
 	push @x, "--get";
 	push @x, "gitweb.$key";
@@ -625,7 +638,7 @@ sub git_get_hash_by_path {
 
 	my $tree = $base;
 
-	open my $fd, "-|", $GIT, "ls-tree", $base, "--", $path
+	open my $fd, "-|", git_cmd(), "ls-tree", $base, "--", $path
 		or die_error(undef, "Open git-ls-tree failed");
 	my $line = <$fd>;
 	close $fd or return undef;
@@ -756,7 +769,7 @@ sub git_get_references {
 		open $fd, "$projectroot/$project/info/refs"
 			or return;
 	} else {
-		open $fd, "-|", $GIT, "ls-remote", "."
+		open $fd, "-|", git_cmd(), "ls-remote", "."
 			or return;
 	}
 
@@ -777,7 +790,7 @@ sub git_get_references {
 sub git_get_rev_name_tags {
 	my $hash = shift || return undef;
 
-	open my $fd, "-|", $GIT, "name-rev", "--tags", $hash
+	open my $fd, "-|", git_cmd(), "name-rev", "--tags", $hash
 		or return;
 	my $name_rev = <$fd>;
 	close $fd;
@@ -825,7 +838,7 @@ sub parse_tag {
 	my %tag;
 	my @comment;
 
-	open my $fd, "-|", $GIT, "cat-file", "tag", $tag_id or return;
+	open my $fd, "-|", git_cmd(), "cat-file", "tag", $tag_id or return;
 	$tag{'id'} = $tag_id;
 	while (my $line = <$fd>) {
 		chomp $line;
@@ -866,7 +879,7 @@ sub parse_commit {
 		@commit_lines = @$commit_text;
 	} else {
 		$/ = "\0";
-		open my $fd, "-|", $GIT, "rev-list", "--header", "--parents", "--max-count=1", $commit_id
+		open my $fd, "-|", git_cmd(), "rev-list", "--header", "--parents", "--max-count=1", $commit_id
 			or return;
 		@commit_lines = split '\n', <$fd>;
 		close $fd or return;
@@ -1971,7 +1984,7 @@ sub git_project_list {
 		if (!defined $head) {
 			next;
 		}
-		$ENV{'GIT_DIR'} = "$projectroot/$pr->{'path'}";
+		$git_dir = "$projectroot/$pr->{'path'}";
 		my %co = parse_commit($head);
 		if (!%co) {
 			next;
@@ -2090,7 +2103,8 @@ sub git_summary {
 	}
 	print "</table>\n";
 
-	open my $fd, "-|", $GIT, "rev-list", "--max-count=17", git_get_head_hash($project)
+	open my $fd, "-|", git_cmd(), "rev-list", "--max-count=17",
+		git_get_head_hash($project)
 		or die_error(undef, "Open git-rev-list failed");
 	my @revlist = map { chomp; $_ } <$fd>;
 	close $fd;
@@ -2168,7 +2182,7 @@ sub git_blame2 {
 	if ($ftype !~ "blob") {
 		die_error("400 Bad Request", "Object is not a blob");
 	}
-	open ($fd, "-|", $GIT, "blame", '-l', $file_name, $hash_base)
+	open ($fd, "-|", git_cmd(), "blame", '-l', $file_name, $hash_base)
 		or die_error(undef, "Open git-blame failed");
 	git_header_html();
 	my $formats_nav =
@@ -2233,7 +2247,7 @@ sub git_blame {
 		$hash = git_get_hash_by_path($hash_base, $file_name, "blob")
 			or die_error(undef, "Error lookup file");
 	}
-	open ($fd, "-|", $GIT, "annotate", '-l', '-t', '-r', $file_name, $hash_base)
+	open ($fd, "-|", git_cmd(), "annotate", '-l', '-t', '-r', $file_name, $hash_base)
 		or die_error(undef, "Open git-annotate failed");
 	git_header_html();
 	my $formats_nav =
@@ -2354,7 +2368,7 @@ sub git_blob_plain {
 		}
 	}
 	my $type = shift;
-	open my $fd, "-|", $GIT, "cat-file", "blob", $hash
+	open my $fd, "-|", git_cmd(), "cat-file", "blob", $hash
 		or die_error(undef, "Couldn't cat $file_name, $hash");
 
 	$type ||= blob_mimetype($fd, $file_name);
@@ -2396,7 +2410,7 @@ sub git_blob {
 		}
 	}
 	my $have_blame = gitweb_check_feature('blame');
-	open my $fd, "-|", $GIT, "cat-file", "blob", $hash
+	open my $fd, "-|", git_cmd(), "cat-file", "blob", $hash
 		or die_error(undef, "Couldn't cat $file_name, $hash");
 	my $mimetype = blob_mimetype($fd, $file_name);
 	if ($mimetype !~ m/^text\//) {
@@ -2461,7 +2475,7 @@ sub git_tree {
 		}
 	}
 	$/ = "\0";
-	open my $fd, "-|", $GIT, "ls-tree", '-z', $hash
+	open my $fd, "-|", git_cmd(), "ls-tree", '-z', $hash
 		or die_error(undef, "Open git-ls-tree failed");
 	my @entries = map { chomp; $_ } <$fd>;
 	close $fd or die_error(undef, "Reading tree failed");
@@ -2564,7 +2578,8 @@ sub git_snapshot {
 	                   -content_disposition => "inline; filename=\"$filename\"",
 	                   -status => '200 OK');
 
-	open my $fd, "-|", "$GIT tar-tree $hash \'$project\' | $command" or
+	my $git_command = git_cmd_str();
+	open my $fd, "-|", "$git_command tar-tree $hash \'$project\' | $command" or
 		die_error(undef, "Execute git-tar-tree failed.");
 	binmode STDOUT, ':raw';
 	print <$fd>;
@@ -2584,7 +2599,7 @@ sub git_log {
 	my $refs = git_get_references();
 
 	my $limit = sprintf("--max-count=%i", (100 * ($page+1)));
-	open my $fd, "-|", $GIT, "rev-list", $limit, $hash
+	open my $fd, "-|", git_cmd(), "rev-list", $limit, $hash
 		or die_error(undef, "Open git-rev-list failed");
 	my @revlist = map { chomp; $_ } <$fd>;
 	close $fd;
@@ -2639,7 +2654,7 @@ sub git_commit {
 	if (!defined $parent) {
 		$parent = "--root";
 	}
-	open my $fd, "-|", $GIT, "diff-tree", '-r', @diff_opts, $parent, $hash
+	open my $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts, $parent, $hash
 		or die_error(undef, "Open git-diff-tree failed");
 	my @difftree = map { chomp; $_ } <$fd>;
 	close $fd or die_error(undef, "Reading git-diff-tree failed");
@@ -2746,7 +2761,7 @@ sub git_blobdiff {
 	if (defined $hash_base && defined $hash_parent_base) {
 		if (defined $file_name) {
 			# read raw output
-			open $fd, "-|", $GIT, "diff-tree", '-r', @diff_opts, $hash_parent_base, $hash_base,
+			open $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts, $hash_parent_base, $hash_base,
 				"--", $file_name
 				or die_error(undef, "Open git-diff-tree failed");
 			@difftree = map { chomp; $_ } <$fd>;
@@ -2760,7 +2775,7 @@ sub git_blobdiff {
 			# try to find filename from $hash
 
 			# read filtered raw output
-			open $fd, "-|", $GIT, "diff-tree", '-r', @diff_opts, $hash_parent_base, $hash_base
+			open $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts, $hash_parent_base, $hash_base
 				or die_error(undef, "Open git-diff-tree failed");
 			@difftree =
 				# ':100644 100644 03b21826... 3b93d5e7... M	ls-files.c'
@@ -2794,7 +2809,7 @@ sub git_blobdiff {
 		}
 
 		# open patch output
-		open $fd, "-|", $GIT, "diff-tree", '-r', @diff_opts,
+		open $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts,
 			'-p', $hash_parent_base, $hash_base,
 			"--", $file_name
 			or die_error(undef, "Open git-diff-tree failed");
@@ -2830,7 +2845,7 @@ sub git_blobdiff {
 		}
 
 		# open patch output
-		open $fd, "-|", $GIT, "diff", '-p', @diff_opts, $hash_parent, $hash
+		open $fd, "-|", git_cmd(), "diff", '-p', @diff_opts, $hash_parent, $hash
 			or die_error(undef, "Open git-diff failed");
 	} else  {
 		die_error('404 Not Found', "Missing one of the blob diff parameters")
@@ -2915,7 +2930,7 @@ sub git_commitdiff {
 	my $fd;
 	my @difftree;
 	if ($format eq 'html') {
-		open $fd, "-|", $GIT, "diff-tree", '-r', @diff_opts,
+		open $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts,
 			"--patch-with-raw", "--full-index", $hash_parent, $hash
 			or die_error(undef, "Open git-diff-tree failed");
 
@@ -2926,7 +2941,7 @@ sub git_commitdiff {
 		}
 
 	} elsif ($format eq 'plain') {
-		open $fd, "-|", $GIT, "diff-tree", '-r', @diff_opts,
+		open $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts,
 			'-p', $hash_parent, $hash
 			or die_error(undef, "Open git-diff-tree failed");
 
@@ -3027,7 +3042,8 @@ sub git_history {
 	git_print_page_path($file_name, $ftype, $hash_base);
 
 	open my $fd, "-|",
-		$GIT, "rev-list", "--full-history", $hash_base, "--", $file_name;
+		git_cmd(), "rev-list", "--full-history", $hash_base, "--", $file_name;
+
 	git_history_body($fd, $refs, $hash_base, $ftype);
 
 	close $fd;
@@ -3067,7 +3083,7 @@ sub git_search {
 	my $alternate = 0;
 	if ($commit_search) {
 		$/ = "\0";
-		open my $fd, "-|", $GIT, "rev-list", "--header", "--parents", $hash or next;
+		open my $fd, "-|", git_cmd(), "rev-list", "--header", "--parents", $hash or next;
 		while (my $commit_text = <$fd>) {
 			if (!grep m/$searchtext/i, $commit_text) {
 				next;
@@ -3119,7 +3135,9 @@ sub git_search {
 
 	if ($pickaxe_search) {
 		$/ = "\n";
-		open my $fd, "-|", "$GIT rev-list $hash | $GIT diff-tree -r --stdin -S\'$searchtext\'";
+		my $git_command = git_cmd_str();
+		open my $fd, "-|", "$git_command rev-list $hash | " .
+			"$git_command diff-tree -r --stdin -S\'$searchtext\'";
 		undef %co;
 		my @files;
 		while (my $line = <$fd>) {
@@ -3186,7 +3204,7 @@ sub git_shortlog {
 	my $refs = git_get_references();
 
 	my $limit = sprintf("--max-count=%i", (100 * ($page+1)));
-	open my $fd, "-|", $GIT, "rev-list", $limit, $hash
+	open my $fd, "-|", git_cmd(), "rev-list", $limit, $hash
 		or die_error(undef, "Open git-rev-list failed");
 	my @revlist = map { chomp; $_ } <$fd>;
 	close $fd;
@@ -3214,7 +3232,7 @@ ## feeds (RSS, OPML)
 
 sub git_rss {
 	# http://www.notestips.com/80256B3A007F2692/1/NAMO5P9UPQ
-	open my $fd, "-|", $GIT, "rev-list", "--max-count=150", git_get_head_hash($project)
+	open my $fd, "-|", git_cmd(), "rev-list", "--max-count=150", git_get_head_hash($project)
 		or die_error(undef, "Open git-rev-list failed");
 	my @revlist = map { chomp; $_ } <$fd>;
 	close $fd or die_error(undef, "Reading git-rev-list failed");
@@ -3237,7 +3255,7 @@ XML
 			last;
 		}
 		my %cd = parse_date($co{'committer_epoch'});
-		open $fd, "-|", $GIT, "diff-tree", '-r', @diff_opts,
+		open $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts,
 			$co{'parent'}, $co{'id'}
 			or next;
 		my @difftree = map { chomp; $_ } <$fd>;
@@ -3295,7 +3313,7 @@ XML
 		if (!defined $head) {
 			next;
 		}
-		$ENV{'GIT_DIR'} = "$projectroot/$proj{'path'}";
+		$git_dir = "$projectroot/$proj{'path'}";
 		my %co = parse_commit($head);
 		if (!%co) {
 			next;
-- 
1.4.1.1

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH (amend)] gitweb: Use --git-dir parameter instead of setting $ENV{'GIT_DIR'}
  2006-08-28 15:49     ` [PATCH (amend)] " Jakub Narebski
@ 2006-08-29  7:18       ` Dennis Stosberg
  2006-08-29  7:19       ` [PATCH] use do() instead of require() to include configuration Dennis Stosberg
  1 sibling, 0 replies; 12+ messages in thread
From: Dennis Stosberg @ 2006-08-29  7:18 UTC (permalink / raw)
  To: Jakub Narebski; +Cc: git

Jakub Narebski wrote:

> Dennis, could you check that it works for you in 'next'
> version of gitweb? The patch you sent is pre-rename even...

Yes, it works for me.

Signed-off-by: Dennis Stosberg <dennis@stosberg.net>

There is another trivial failure with mod_perl: The configuration file
will only be read on the first invocation of the script.  I didn't
notice it until today, because I never used a configuration file before.

Regards,
Dennis

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH] use do() instead of require() to include configuration
  2006-08-28 15:49     ` [PATCH (amend)] " Jakub Narebski
  2006-08-29  7:18       ` Dennis Stosberg
@ 2006-08-29  7:19       ` Dennis Stosberg
  1 sibling, 0 replies; 12+ messages in thread
From: Dennis Stosberg @ 2006-08-29  7:19 UTC (permalink / raw)
  To: Jakub Narebski; +Cc: git

When run under mod_perl, require() will read and execute the configuration
file on the first invocation only.  On every subsequent invocation, all
configuration variables will be reset to their default values.  do() reads
and executes the configuration file unconditionally.

Signed-off-by: Dennis Stosberg <dennis@stosberg.net>
---
 gitweb/gitweb.perl |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index 352236b..39ebcf4 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -152,7 +152,7 @@ # - one might want to include '-B' optio
 our @diff_opts = ('-M'); # taken from git_commit
 
 our $GITWEB_CONFIG = $ENV{'GITWEB_CONFIG'} || "++GITWEB_CONFIG++";
-require $GITWEB_CONFIG if -e $GITWEB_CONFIG;
+do $GITWEB_CONFIG if -e $GITWEB_CONFIG;
 
 # version of the core git binary
 our $git_version = qx($GIT --version) =~ m/git version (.*)$/ ? $1 : "unknown";
-- 
1.4.2

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: Running gitweb under mod_perl
  2006-08-24 14:05 ` Dennis Stosberg
  2006-08-24 15:12   ` [PATCH] gitweb: Use --git-dir parameter instead of setting $ENV{'GIT_DIR'} Dennis Stosberg
@ 2006-09-05 20:32   ` Jakub Narebski
  1 sibling, 0 replies; 12+ messages in thread
From: Jakub Narebski @ 2006-09-05 20:32 UTC (permalink / raw)
  To: git

Dennis Stosberg wrote:

> Jakub Narebski wrote:
> 
>> What should I put in Apache configuration (Apache 2.0.54 if this
>> matters, mod_perl 2.0.1) 
> 
> From my configuration:
> 
>   <Directory /home/dennis/public_html/perl>
>     Options -Indexes +ExecCGI
>     AllowOverride None
>     PerlSendHeader On
>     SetHandler perl-script
>     PerlHandler ModPerl::Registry
>   </Directory>

I use mod_perl 2.0 version

   Alias /perl /var/www/perl
   <Directory /var/www/perl>
       SetHandler perl-script
       PerlResponseHandler ModPerl::Registry
       PerlOptions +ParseHeaders
       Options +ExecCGI
   </Directory>

What is strange that ApacheBench is showing that mod_perl is _slower_ than
CGI version: 3003.305 [ms] (mean) CGI vs 3500.589 [ms] (mean) mod_perl
for summary page for git.git repository (my copy that is).

I wonder if I misconfigured something...
-- 
Jakub Narebski
Warsaw, Poland
ShadeHawk on #git

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2006-09-05 20:32 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-08-24 12:43 Running gitweb under mod_perl Jakub Narebski
2006-08-24 12:46 ` Johannes Schindelin
2006-08-24 14:05 ` Dennis Stosberg
2006-08-24 15:12   ` [PATCH] gitweb: Use --git-dir parameter instead of setting $ENV{'GIT_DIR'} Dennis Stosberg
2006-08-28 15:49     ` [PATCH (amend)] " Jakub Narebski
2006-08-29  7:18       ` Dennis Stosberg
2006-08-29  7:19       ` [PATCH] use do() instead of require() to include configuration Dennis Stosberg
2006-09-05 20:32   ` Running gitweb under mod_perl Jakub Narebski
2006-08-24 17:49 ` Jakub Narebski
2006-08-24 19:32   ` Dennis Stosberg
2006-08-24 20:59     ` Jakub Narebski
2006-08-25  1:13       ` Randal L. Schwartz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).