From 5b39ed2b6b3d5d8c24240f1b1df8bfd751b0e6bc Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 5 Oct 2022 22:29:41 +0000 Subject: 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... --- lib/PublicInbox/Cgit.pm | 1 + lib/PublicInbox/WWW.pm | 30 +++++++++++++++++------------- 2 files changed, 18 insertions(+), 13 deletions(-) (limited to 'lib/PublicInbox') 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 { -- cgit v1.2.3-24-ge0c7