Documentation/public-inbox-config.pod | 8 ++++++++ lib/PublicInbox/Config.pm | 3 ++- lib/PublicInbox/WWW.pm | 20 +++++++++++++++++++- diff --git a/Documentation/public-inbox-config.pod b/Documentation/public-inbox-config.pod index 5ee93e2e736cc5883951893ac1106966564389df..9647e4a46cef6924f5127a48532d5f7f6c3d1b0e 100644 --- a/Documentation/public-inbox-config.pod +++ b/Documentation/public-inbox-config.pod @@ -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 executable. The L +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) diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm index 4b24672003a1d98132c1c80c322bc49824204ad1..ec9a469c3516183da8459336751571fdfd6ef12e 100644 --- a/lib/PublicInbox/Config.pm +++ b/lib/PublicInbox/Config.pm @@ -30,6 +30,7 @@ $self->{-by_newsgroup} ||= {}; $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 @@ my ($self, $nick) = @_; 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" diff --git a/lib/PublicInbox/WWW.pm b/lib/PublicInbox/WWW.pm index 7ed4f654c69085977fb17a3a0764919624e21418..6e14e8c1d87ab9886c3d404e3ac310ab1f3317de 100644 --- a/lib/PublicInbox/WWW.pm +++ b/lib/PublicInbox/WWW.pm @@ -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 @@ PublicInbox::NewsWWW)) { eval "require $_;"; } if (ref($self)) { + $self->cgit; $self->stylesheets_prepare($_) for ('', '../', '../../'); } } @@ -188,7 +190,9 @@ # sometimes linkifiers (not ours!) screw up automatic link # 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 @@ -464,6 +468,20 @@ my ($self) = @_; $self->{news_www} ||= do { require PublicInbox::NewsWWW; PublicInbox::NewsWWW->new($self->{pi_config}); + } +} + +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() }); + } } }