]> Sergey Matveev's repositories - public-inbox.git/commitdiff
www: wire up cgit as a 404 handler if cgitrc is configured
authorEric Wong <e@80x24.org>
Mon, 11 Mar 2019 05:32:07 +0000 (05:32 +0000)
committerEric Wong <e@80x24.org>
Thu, 4 Apr 2019 09:13:58 +0000 (09:13 +0000)
Requests intended for cgit are unlikely to conflict with
requests to inboxes.  So we can safely hand those requests
off to cgit.cgi.

Documentation/public-inbox-config.pod
lib/PublicInbox/Config.pm
lib/PublicInbox/WWW.pm

index 5ee93e2e736cc5883951893ac1106966564389df..9647e4a46cef6924f5127a48532d5f7f6c3d1b0e 100644 (file)
@@ -209,6 +209,14 @@ code repositories known to cgit.
 
 Macro expansion (e.g. C<$HTTP_HOST>) is not yet supported.
 
+=item publicinbox.cgitbin
+
+A path to the C<cgit.cgi> executable.  The L<PublicInbox::WWW>
+interface can spawn cgit as a fallback if the publicinbox.cgitrc
+directive is configured.
+
+Default: /usr/lib/cgit/cgit.cgi
+
 =back
 
 =head2 NAMED LIMITER (PSGI)
index 4b24672003a1d98132c1c80c322bc49824204ad1..ec9a469c3516183da8459336751571fdfd6ef12e 100644 (file)
@@ -30,6 +30,7 @@ sub new {
        $self->{-no_obfuscate} ||= {};
        $self->{-limiters} ||= {};
        $self->{-code_repos} ||= {}; # nick => PublicInbox::Git object
+       $self->{-cgitrc_unparsed} = $self->{'publicinbox.cgitrc'};
 
        if (my $no = delete $self->{'publicinbox.noobfuscate'}) {
                $no = _array($no);
@@ -244,7 +245,7 @@ sub _fill_code_repo {
        my $pfx = "coderepo.$nick";
 
        # TODO: support gitweb and other repository viewers?
-       if (defined(my $cgitrc = delete $self->{'publicinbox.cgitrc'})) {
+       if (defined(my $cgitrc = delete $self->{-cgitrc_unparsed})) {
                parse_cgitrc($self, $cgitrc, 0);
        }
        my $dir = $self->{"$pfx.dir"}; # aka "GIT_DIR"
index 7ed4f654c69085977fb17a3a0764919624e21418..6e14e8c1d87ab9886c3d404e3ac310ab1f3317de 100644 (file)
@@ -15,6 +15,7 @@ use 5.008;
 use strict;
 use warnings;
 use bytes (); # only for bytes::length
+use Plack::Util;
 use PublicInbox::Config;
 use PublicInbox::Hval;
 use URI::Escape qw(uri_unescape);
@@ -154,6 +155,7 @@ sub preload {
                eval "require $_;";
        }
        if (ref($self)) {
+               $self->cgit;
                $self->stylesheets_prepare($_) for ('', '../', '../../');
        }
 }
@@ -188,7 +190,9 @@ sub invalid_inbox ($$) {
        # generation and link things intended for nntp:// to https?://,
        # so try to infer links and redirect them to the appropriate
        # list URL.
-       $www->news_www->call($ctx->{env});
+       my $env = $ctx->{env};
+       my $res = $www->news_www->call($env);
+       $res->[0] == 404 ? $www->cgit->call($env) : $res;
 }
 
 # returns undef if valid, array ref response if invalid
@@ -467,6 +471,20 @@ sub news_www {
        }
 }
 
+sub cgit {
+       my ($self) = @_;
+       $self->{cgit} ||= do {
+               my $pi_config = $self->{pi_config};
+
+               if (defined($pi_config->{'publicinbox.cgitrc'})) {
+                       require PublicInbox::Cgit;
+                       PublicInbox::Cgit->new($pi_config);
+               } else {
+                       Plack::Util::inline_object(call => sub { r404() });
+               }
+       }
+}
+
 sub get_attach {
        my ($ctx, $idx, $fn) = @_;
        require PublicInbox::WwwAttach;