X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=public-inbox.cgi;h=3bc6eca3c574fbe31e67a07141c10a0269c7b2c8;hb=d444d9aebc6e401333968ec697c48fb23214a1ea;hp=9314712431a54da4c8a345c741ff9c8e13bd59b9;hpb=b79559bb07595e5e29f45d5791bfb53cb6f6a06b;p=public-inbox.git diff --git a/public-inbox.cgi b/public-inbox.cgi index 93147124..3bc6eca3 100755 --- a/public-inbox.cgi +++ b/public-inbox.cgi @@ -15,12 +15,15 @@ use warnings; use PublicInbox::Config; use URI::Escape qw(uri_escape_utf8 uri_unescape); our $LISTNAME_RE = qr!\A/([\w\.\-]+)!; +our $NO_SCRIPT_NAME; # for prettier redirects with mod_perl2 our $pi_config; BEGIN { $pi_config = PublicInbox::Config->new; # TODO: detect and reload config as needed + $NO_SCRIPT_NAME = 1 if $ENV{NO_SCRIPT_NAME}; if ($ENV{MOD_PERL}) { require CGI; + no warnings; $CGI::NOSTICKY = 1; CGI->compile; } @@ -35,6 +38,7 @@ if ($ENV{PI_PLACKUP}) { # so nuke it since CGI.pm functions without it. require CGI; delete $ENV{REQUEST_URI}; + $ENV{SCRIPT_NAME} = '' if $NO_SCRIPT_NAME; my $req = CGI->new; my $ret = main($req, $req->request_method); binmode STDOUT; @@ -142,13 +146,24 @@ sub get_index { # just returns a string ref for the blob in the current ctx sub mid2blob { my ($ctx) = @_; - local $ENV{GIT_DIR} = $ctx->{git_dir}; require Digest::SHA; my $hex = Digest::SHA::sha1_hex($ctx->{mid}); $hex =~ /\A([a-f0-9]{2})([a-f0-9]{38})\z/i or die "BUG: not a SHA-1 hex: $hex"; - my $blob = `git cat-file blob HEAD:$1/$2 2>/dev/null`; - $? == 0 ? \$blob : undef; + + my @cmd = ('git', "--git-dir=$ctx->{git_dir}", + qw(cat-file blob), "HEAD:$1/$2"); + my $cmd = join(' ', @cmd); + my $pid = open my $fh, '-|'; + defined $pid or die "fork failed: $!\n"; + if ($pid == 0) { + open STDERR, '>', '/dev/null'; # ignore errors + exec @cmd or die "exec failed: $!\n"; + } else { + my $blob = eval { local $/; <$fh> }; + close $fh; + $? == 0 ? \$blob : undef; + } } # /$LISTNAME/m/$MESSAGE_ID.txt -> raw original @@ -218,7 +233,6 @@ sub psgi_app { require POSIX; require XML::Atom::SimpleFeed; require Plack::Request; - eval { require Git }; # optional sub { my $req = Plack::Request->new(@_); main($req, $req->method);