From 5b39ed2b6b3d5d8c24240f1b1df8bfd751b0e6bc Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 5 Oct 2022 22:29:41 +0000 Subject: [PATCH] www: support publicinbox.cgit knob For backwards-compatibility, this defaults to `first'. When set to `fallback', PublicInbox::WwwCoderepo is favored and cgit is only used as a fallback. Eventually, `rewrite' will also be supported to rewrite cgit URLs to WwwCoderepo ones. Of course, WwwCoderepo is still missing search and other key features, but that's being worked on... --- Documentation/public-inbox-config.pod | 26 +++++++++++++++++++++++ lib/PublicInbox/Cgit.pm | 1 + lib/PublicInbox/WWW.pm | 30 +++++++++++++++------------ 3 files changed, 44 insertions(+), 13 deletions(-) diff --git a/Documentation/public-inbox-config.pod b/Documentation/public-inbox-config.pod index d8504e61..e926a27b 100644 --- a/Documentation/public-inbox-config.pod +++ b/Documentation/public-inbox-config.pod @@ -293,6 +293,32 @@ C, but may be overridden. Default: basename of C, /var/www/htdocs/cgit/ or /usr/share/cgit/ +=item publicinbox.cgit + +Controls whether or not and how C is used for serving coderepos. +New in public-inbox 2.0.0 (PENDING). + +=over 8 + +=item * first + +Try using C as the first choice, this is the default. + +=item * fallback + +Fall back to using C only if our native, inbox-aware +git code repository viewer doesn't recognized the URL. + +=item * rewrite + +Rewrite C URLs for our native, inbox-aware code repository viewer. +This implies C for URLs the native viewer does not recognize. + +=back + +Default: C (C will be used iff C +is set and the C binary exists). + =item publicinbox.mailEditor See L diff --git a/lib/PublicInbox/Cgit.pm b/lib/PublicInbox/Cgit.pm index 298663c7..336098ca 100644 --- a/lib/PublicInbox/Cgit.pm +++ b/lib/PublicInbox/Cgit.pm @@ -53,6 +53,7 @@ sub locate_cgit ($) { sub new { my ($class, $pi_cfg) = @_; my ($cgit_bin, $cgit_data) = locate_cgit($pi_cfg); + $cgit_bin // return; # fall back in WWW->cgit my $self = bless { cmd => [ $cgit_bin ], cgit_data => $cgit_data, diff --git a/lib/PublicInbox/WWW.pm b/lib/PublicInbox/WWW.pm index 470510ae..f861b192 100644 --- a/lib/PublicInbox/WWW.pm +++ b/lib/PublicInbox/WWW.pm @@ -194,12 +194,19 @@ sub r404 { sub news_cgit_fallback ($) { my ($ctx) = @_; - my $www = $ctx->{www}; - my $env = $ctx->{env}; - my $res = $www->news_www->call($env); - $res = $www->cgit->call($env, $ctx) if $res->[0] == 404; + my $res = $ctx->{www}->news_www->call($ctx->{env}); + + $res->[0] == 404 and ($ctx->{www}->{cgit_fallback} //= do { + my $c = $ctx->{www}->{pi_cfg}->{'publicinbox.cgit'} // 'first'; + $c ne 'first' # `fallback' and `rewrite' => true + } // 0) and $res = $ctx->{www}->coderepo->srv($ctx); + ref($res) eq 'ARRAY' && $res->[0] == 404 and - $res = $www->coderepo->srv($ctx); + $res = $ctx->{www}->cgit->call($ctx->{env}, $ctx); + + ref($res) eq 'ARRAY' && $res->[0] == 404 && + !$ctx->{www}->{cgit_fallback} and + $res = $ctx->{www}->coderepo->srv($ctx); $res; } @@ -484,17 +491,14 @@ sub news_www { sub cgit { my ($self) = @_; - $self->{cgit} //= do { - my $pi_cfg = $self->{pi_cfg}; - - if (defined($pi_cfg->{'publicinbox.cgitrc'})) { + $self->{cgit} //= + (defined($self->{pi_cfg}->{'publicinbox.cgitrc'}) ? do { require PublicInbox::Cgit; - PublicInbox::Cgit->new($pi_cfg); - } else { + PublicInbox::Cgit->new($self->{pi_cfg}); + } : undef) // do { require Plack::Util; Plack::Util::inline_object(call => sub { r404() }); - } - } + }; } sub coderepo { -- 2.44.0