]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/WWW.pm
inbox: altid_map becomes a method
[public-inbox.git] / lib / PublicInbox / WWW.pm
index 3ce7cc2a7b6ddb2ef74616898e60accd3f92b0ae..56d2c42a41cd8eafd37444e68495644f28a80388 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2014-2019 all contributors <meta@public-inbox.org>
+# Copyright (C) 2014-2020 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
@@ -19,7 +19,6 @@ use PublicInbox::Config;
 use PublicInbox::Hval;
 use URI::Escape qw(uri_unescape);
 use PublicInbox::MID qw(mid_escape);
-require PublicInbox::Git;
 use PublicInbox::GitHTTPBackend;
 use PublicInbox::UserContent;
 use PublicInbox::WwwStatic qw(r path_info_raw);
@@ -66,6 +65,8 @@ sub call {
                        my ($epoch, $path) = ($2, $3);
                        return invalid_inbox($ctx, $1) ||
                                serve_git($ctx, $epoch, $path);
+               } elsif ($path_info =~ m!$INBOX_RE/(\w+)\.sql\.gz\z!o) {
+                       return get_altid_dump($ctx, $1, $2);
                } elsif ($path_info =~ m!$INBOX_RE/!o) {
                        return invalid_inbox($ctx, $1) || mbox_results($ctx);
                }
@@ -85,6 +86,8 @@ sub call {
                invalid_inbox($ctx, $1) || get_atom($ctx);
        } elsif ($path_info =~ m!$INBOX_RE/new\.html\z!o) {
                invalid_inbox($ctx, $1) || get_new($ctx);
+       } elsif ($path_info =~ m!$INBOX_RE/description\z!o) {
+               get_description($ctx, $1);
        } elsif ($path_info =~ m!$INBOX_RE/(?:(?:git/)?([0-9]+)(?:\.git)?/)?
                                ($PublicInbox::GitHTTPBackend::ANY)\z!ox) {
                my ($epoch, $path) = ($2, $3);
@@ -131,31 +134,48 @@ sub call {
        }
 }
 
-# for CoW-friendliness, MOOOOO!
+# for CoW-friendliness, MOOOOO!  Even for single-process setups,
+# we want to get all immortal allocations done early to avoid heap
+# fragmentation since common allocators favor a large contiguous heap.
 sub preload {
        my ($self) = @_;
+       require PublicInbox::ExtMsg;
        require PublicInbox::Feed;
        require PublicInbox::View;
        require PublicInbox::SearchThread;
        require PublicInbox::MIME;
-       require Digest::SHA;
-       require POSIX;
+       require PublicInbox::Mbox;
+       require PublicInbox::ViewVCS;
+       require PublicInbox::WwwText;
+       require PublicInbox::WwwAttach;
        eval {
                require PublicInbox::Search;
                PublicInbox::Search::load_xapian();
        };
-       foreach (qw(PublicInbox::SearchView
-                       PublicInbox::Mbox IO::Compress::Gzip
-                       PublicInbox::NewsWWW)) {
-               eval "require $_;";
+       for (qw(SearchView MboxGz WwwAltId)) {
+               eval "require PublicInbox::$_;";
        }
        if (ref($self)) {
+               my $pi_config = $self->{pi_config};
+               if (defined($pi_config->{'publicinbox.cgitrc'})) {
+                       $pi_config->limiter('-cgit');
+               }
                $self->cgit;
                $self->stylesheets_prepare($_) for ('', '../', '../../');
                $self->www_listing;
+               $self->news_www;
+               $pi_config->each_inbox(\&preload_inbox);
        }
 }
 
+sub preload_inbox {
+       my $ibx = shift;
+       $ibx->altid_map;
+       $ibx->cloneurl;
+       $ibx->description;
+       $ibx->base_url;
+}
+
 # private functions below
 
 sub r404 {
@@ -284,6 +304,14 @@ sub get_vcs_object ($$$;$) {
        PublicInbox::ViewVCS::show($ctx, $oid, $filename);
 }
 
+sub get_altid_dump {
+       my ($ctx, $inbox, $altid_pfx) =@_;
+       my $r404 = invalid_inbox($ctx, $inbox);
+       return $r404 if $r404;
+       eval { require PublicInbox::WwwAltId } or return need($ctx, 'sqlite3');
+       PublicInbox::WwwAltId::sqldump($ctx, $altid_pfx);
+}
+
 sub need {
        my ($ctx, $extra) = @_;
        my $msg = <<EOF;
@@ -621,4 +649,13 @@ sub get_css ($$$) {
        [ 200, $h, [ $css ] ];
 }
 
+sub get_description {
+       my ($ctx, $inbox) = @_;
+       invalid_inbox($ctx, $inbox) || do {
+               my $d = $ctx->{-inbox}->description . "\n";
+               [ 200, [ 'Content-Length', bytes::length($d),
+                       'Content-Type', 'text/plain' ], [ $d ] ];
+       };
+}
+
 1;