# TODO: consider a routing tree now that we have more endpoints:
our $INBOX_RE = qr!\A/([\w\-][\w\.\-\+]*)!;
our $MID_RE = qr!([^/]+)!;
-our $END_RE = qr!(T/|t/|t\.mbox(?:\.gz)?|t\.atom|raw|)!;
+our $END_RE = qr!(T/|t/|d/|t\.mbox(?:\.gz)?|t\.atom|raw|)!;
our $ATTACH_RE = qr!([0-9][0-9\.]*)-($PublicInbox::Hval::FN)!;
our $OID_RE = qr![a-f0-9]{7,}!;
sub news_cgit_fallback ($) {
my ($ctx) = @_;
- my $www = $ctx->{www};
- my $env = $ctx->{env};
- my $res = $www->news_www->call($env);
- $res->[0] == 404 ? $www->cgit->call($env) : $res;
+ 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 = $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;
}
# returns undef if valid, array ref response if invalid
sub get_vcs_object ($$$;$) {
my ($ctx, $inbox, $oid, $filename) = @_;
my $r404 = invalid_inbox($ctx, $inbox);
- return $r404 if $r404 || !$ctx->{www}->{pi_cfg}->repo_objs($ctx->{ibx});
+ return $r404 if $r404;
+ return r(404) if !$ctx->{www}->{pi_cfg}->repo_objs($ctx->{ibx});
require PublicInbox::ViewVCS;
PublicInbox::ViewVCS::show($ctx, $oid, $filename);
}
sub need {
my ($ctx, $extra) = @_;
require PublicInbox::WwwStream;
- PublicInbox::WwwStream::html_oneshot($ctx, 501, \<<EOF);
+ PublicInbox::WwwStream::html_oneshot($ctx, 501, <<EOF);
<pre>$extra is not available for this public-inbox
<a\nhref="../">Return to index</a></pre>
EOF
# legacy, but no redirect for compatibility:
'f/' eq $e and return get_mid_html($ctx);
+ if ($e eq 'd/') {
+ require PublicInbox::View;
+ return PublicInbox::View::diff_msg($ctx);
+ }
r404($ctx);
}
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 {
+ my ($self) = @_;
+ $self->{coderepo} //= do {
+ require PublicInbox::WwwCoderepo;
+ PublicInbox::WwwCoderepo->new($self->{pi_cfg});
}
}