]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/WWW.pm
config: lazy-load coderepos, support extindex
[public-inbox.git] / lib / PublicInbox / WWW.pm
index 85abf327de884140aac246c5407229b135817433..456692a3a7391f0bf7f330d1bcb2190f5b2b43e2 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2014-2020 all contributors <meta@public-inbox.org>
+# Copyright (C) 2014-2021 all contributors <meta@public-inbox.org>
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 #
 # Main web interface for mailing list archives
@@ -29,12 +29,11 @@ our $INBOX_RE = qr!\A/([\w\-][\w\.\-]*)!;
 our $MID_RE = qr!([^/]+)!;
 our $END_RE = qr!(T/|t/|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,40}!;
+our $OID_RE = qr![a-f0-9]{7,}!;
 
 sub new {
-       my ($class, $pi_config) = @_;
-       $pi_config ||= PublicInbox::Config->new;
-       bless { pi_config => $pi_config }, $class;
+       my ($class, $pi_cfg) = @_;
+       bless { pi_cfg => $pi_cfg // PublicInbox::Config->new }, $class;
 }
 
 # backwards compatibility, do not use
@@ -169,14 +168,14 @@ sub preload {
                eval "require PublicInbox::$_;";
        }
        if (ref($self)) {
-               my $pi_config = $self->{pi_config};
-               if (defined($pi_config->{'publicinbox.cgitrc'})) {
-                       $pi_config->limiter('-cgit');
+               my $pi_cfg = $self->{pi_cfg};
+               if (defined($pi_cfg->{'publicinbox.cgitrc'})) {
+                       $pi_cfg->limiter('-cgit');
                }
                $self->cgit;
                $self->stylesheets_prepare($_) for ('', '../', '../../');
                $self->news_www;
-               $pi_config->each_inbox(\&preload_inbox);
+               $pi_cfg->each_inbox(\&preload_inbox);
        }
 }
 
@@ -210,9 +209,10 @@ sub news_cgit_fallback ($) {
 # returns undef if valid, array ref response if invalid
 sub invalid_inbox ($$) {
        my ($ctx, $inbox) = @_;
-       my $ibx = $ctx->{www}->{pi_config}->lookup_name($inbox);
+       my $ibx = $ctx->{www}->{pi_cfg}->lookup_name($inbox) //
+                       $ctx->{www}->{pi_cfg}->lookup_ei($inbox);
        if (defined $ibx) {
-               $ctx->{-inbox} = $ibx;
+               $ctx->{ibx} = $ibx;
                return;
        }
 
@@ -230,11 +230,11 @@ sub invalid_inbox_mid {
        return $ret if $ret;
 
        my $mid = $ctx->{mid} = uri_unescape($mid_ue);
-       my $ibx = $ctx->{-inbox};
+       my $ibx = $ctx->{ibx};
        if ($mid =~ m!\A([a-f0-9]{2})([a-f0-9]{38})\z!) {
                my ($x2, $x38) = ($1, $2);
                # this is horrifically wasteful for legacy URLs:
-               my $str = $ctx->{-inbox}->msg_by_path("$x2/$x38") or return;
+               my $str = $ctx->{ibx}->msg_by_path("$x2/$x38") or return;
                my $s = PublicInbox::Eml->new($str);
                $mid = PublicInbox::MID::mid_clean($s->header_raw('Message-ID'));
                return r301($ctx, $inbox, mid_escape($mid));
@@ -285,7 +285,7 @@ sub get_mid_html {
 # /$INBOX/$MESSAGE_ID/t/
 sub get_thread {
        my ($ctx, $flat) = @_;
-       $ctx->{-inbox}->over or return need($ctx, 'Overview');
+       $ctx->{ibx}->over or return need($ctx, 'Overview');
        $ctx->{flat} = $flat;
        require PublicInbox::View;
        PublicInbox::View::thread_html($ctx);
@@ -309,7 +309,7 @@ sub get_text {
 sub get_vcs_object ($$$;$) {
        my ($ctx, $inbox, $oid, $filename) = @_;
        my $r404 = invalid_inbox($ctx, $inbox);
-       return $r404 if $r404;
+       return $r404 if $r404 || !$ctx->{www}->{pi_cfg}->repo_objs($ctx->{ibx});
        require PublicInbox::ViewVCS;
        PublicInbox::ViewVCS::show($ctx, $oid, $filename);
 }
@@ -338,7 +338,7 @@ EOF
 # especially on older systems.  Stick to zlib since that's what git uses.
 sub get_thread_mbox {
        my ($ctx, $sfx) = @_;
-       my $over = $ctx->{-inbox}->over or return need($ctx, 'Overview');
+       my $over = $ctx->{ibx}->over or return need($ctx, 'Overview');
        require PublicInbox::Mbox;
        PublicInbox::Mbox::thread_mbox($ctx, $over, $sfx);
 }
@@ -347,7 +347,7 @@ sub get_thread_mbox {
 # /$INBOX/$MESSAGE_ID/t.atom             -> thread as Atom feed
 sub get_thread_atom {
        my ($ctx) = @_;
-       $ctx->{-inbox}->over or return need($ctx, 'Overview');
+       $ctx->{ibx}->over or return need($ctx, 'Overview');
        require PublicInbox::Feed;
        PublicInbox::Feed::generate_thread_atom($ctx);
 }
@@ -412,11 +412,11 @@ sub legacy_redirects {
 
 sub r301 {
        my ($ctx, $inbox, $mid_ue, $suffix) = @_;
-       my $ibx = $ctx->{-inbox};
+       my $ibx = $ctx->{ibx};
        unless ($ibx) {
                my $r404 = invalid_inbox($ctx, $inbox);
                return $r404 if $r404;
-               $ibx = $ctx->{-inbox};
+               $ibx = $ctx->{ibx};
        }
        my $url = $ibx->base_url($ctx->{env});
        my $qs = $ctx->{env}->{QUERY_STRING};
@@ -453,7 +453,7 @@ sub msg_page {
 sub serve_git {
        my ($ctx, $epoch, $path) = @_;
        my $env = $ctx->{env};
-       my $ibx = $ctx->{-inbox};
+       my $ibx = $ctx->{ibx};
        my $git = defined $epoch ? $ibx->git_epoch($epoch) : $ibx->git;
        $git ? PublicInbox::GitHTTPBackend::serve($env, $git, $path) : r404();
 }
@@ -461,7 +461,7 @@ sub serve_git {
 sub mbox_results {
        my ($ctx) = @_;
        if ($ctx->{env}->{QUERY_STRING} =~ /(?:\A|[&;])q=/) {
-               $ctx->{-inbox}->search or return need($ctx, 'search');
+               $ctx->{ibx}->isrch or return need($ctx, 'search');
                require PublicInbox::SearchView;
                return PublicInbox::SearchView::mbox_results($ctx);
        }
@@ -480,18 +480,18 @@ sub news_www {
        my ($self) = @_;
        $self->{news_www} ||= do {
                require PublicInbox::NewsWWW;
-               PublicInbox::NewsWWW->new($self->{pi_config});
+               PublicInbox::NewsWWW->new($self->{pi_cfg});
        }
 }
 
 sub cgit {
        my ($self) = @_;
        $self->{cgit} ||= do {
-               my $pi_config = $self->{pi_config};
+               my $pi_cfg = $self->{pi_cfg};
 
-               if (defined($pi_config->{'publicinbox.cgitrc'})) {
+               if (defined($pi_cfg->{'publicinbox.cgitrc'})) {
                        require PublicInbox::Cgit;
-                       PublicInbox::Cgit->new($pi_config);
+                       PublicInbox::Cgit->new($pi_cfg);
                } else {
                        require Plack::Util;
                        Plack::Util::inline_object(call => sub { r404() });
@@ -505,7 +505,7 @@ sub get_inbox_manifest ($$$) {
        my $r404 = invalid_inbox($ctx, $inbox);
        return $r404 if $r404;
        require PublicInbox::ManifestJsGz;
-       PublicInbox::ManifestJsGz->response($ctx);
+       PublicInbox::ManifestJsGz::per_inbox($ctx);
 }
 
 sub get_attach {
@@ -537,7 +537,7 @@ sub stylesheets_prepare ($$) {
        } || sub { $_[0] };
 
        my $css_map = {};
-       my $stylesheets = $self->{pi_config}->{css} || [];
+       my $stylesheets = $self->{pi_cfg}->{css} || [];
        my $links = [];
        my $inline_ok = 1;
 
@@ -641,7 +641,7 @@ sub get_css ($$$) {
        my $css = $css_map->{$key};
        if (!defined($css) && $key eq 'userContent') {
                my $env = $ctx->{env};
-               $css = PublicInbox::UserContent::sample($ctx->{-inbox}, $env);
+               $css = PublicInbox::UserContent::sample($ctx->{ibx}, $env);
        }
        defined $css or return r404();
        my $h = [ 'Content-Length', bytes::length($css),
@@ -653,7 +653,7 @@ sub get_css ($$$) {
 sub get_description {
        my ($ctx, $inbox) = @_;
        invalid_inbox($ctx, $inbox) || do {
-               my $d = $ctx->{-inbox}->description . "\n";
+               my $d = $ctx->{ibx}->description . "\n";
                [ 200, [ 'Content-Length', bytes::length($d),
                        'Content-Type', 'text/plain' ], [ $d ] ];
        };