From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id EFE6020383 for ; Tue, 12 Mar 2019 04:00:46 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 10/13] www: wire up cgit as a 404 handler if cgitrc is configured Date: Tue, 12 Mar 2019 04:00:43 +0000 Message-Id: <20190312040046.4619-11-e@80x24.org> In-Reply-To: <20190312040046.4619-1-e@80x24.org> References: <20190312040046.4619-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: 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 | 8 ++++++++ lib/PublicInbox/Config.pm | 3 ++- lib/PublicInbox/WWW.pm | 20 +++++++++++++++++++- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/Documentation/public-inbox-config.pod b/Documentation/public-inbox-config.pod index 5ee93e2..9647e4a 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 490b4c4..15664c6 100644 --- a/lib/PublicInbox/Config.pm +++ b/lib/PublicInbox/Config.pm @@ -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); @@ -243,7 +244,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" diff --git a/lib/PublicInbox/WWW.pm b/lib/PublicInbox/WWW.pm index 7ed4f65..6e14e8c 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 @@ 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; -- EW