about summary refs log tree commit homepage
path: root/lib/PublicInbox/WwwStream.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-08-26 12:33:34 +0000
committerEric Wong <e@80x24.org>2021-08-28 10:37:00 +0000
commit4363e6037fa7d597294186f60373e9de8e1b3d74 (patch)
treed927eaa05619cccfa1c64eb4896de3f953d08138 /lib/PublicInbox/WwwStream.pm
parent37aa51cd82d34aa2638db24a3dd5aa72339183df (diff)
downloadpublic-inbox-4363e6037fa7d597294186f60373e9de8e1b3d74.tar.gz
There's no way to clone an extindex, since there's no git
storage associated with them.  So attempt to link to the
HTML listing of public-inboxes, instead.
Diffstat (limited to 'lib/PublicInbox/WwwStream.pm')
-rw-r--r--lib/PublicInbox/WwwStream.pm111
1 files changed, 62 insertions, 49 deletions
diff --git a/lib/PublicInbox/WwwStream.pm b/lib/PublicInbox/WwwStream.pm
index 57c23690..d8142824 100644
--- a/lib/PublicInbox/WwwStream.pm
+++ b/lib/PublicInbox/WwwStream.pm
@@ -120,52 +120,50 @@ sub code_footer ($) {
 
 sub _html_end {
         my ($ctx) = @_;
-        my $urls = <<EOF;
-<a
-id=mirror>This inbox may be cloned and mirrored by anyone:</a>
-EOF
-
         my $ibx = $ctx->{ibx};
         my $desc = ascii_html($ibx->description);
-
-        my @urls;
+        my $s = "<a\nid=mirror>";
         my $http = $ctx->{base_url};
-        my $max = $ibx->max_git_epoch;
         my $dir = (split(m!/!, $http))[-1];
         my %seen = ($http => 1);
-        # TODO: some of these URLs may be too long and we may need to
-        # do something like code_footer() above, but these are local
-        # admin-defined
-        if (defined($max)) { # v2
-                for my $i (0..$max) {
-                        # old epochs my be deleted:
-                        -d "$ibx->{inboxdir}/git/$i.git" or next;
-                        my $url = "$http/$i";
-                        $seen{$url} = 1;
-                        push @urls, "$url $dir/git/$i.git";
+        if ($ibx->can('cloneurl')) { # PublicInbox::Inbox
+                $s .= "This inbox may be cloned and mirrored by anyone:</a>\n";
+                my @urls;
+                my $max = $ibx->max_git_epoch;
+                # TODO: some of these URLs may be too long and we may need to
+                # do something like code_footer() above, but these are local
+                # admin-defined
+                if (defined($max)) { # v2
+                        for my $i (0..$max) {
+                                # old epochs my be deleted:
+                                -d "$ibx->{inboxdir}/git/$i.git" or next;
+                                my $url = "$http/$i";
+                                $seen{$url} = 1;
+                                push @urls, "$url $dir/git/$i.git";
+                        }
+                        my $nr = scalar(@urls);
+                        if ($nr > 1) {
+                                $s .= "\n\t";
+                                $s .= "# this inbox consists of $nr epochs:";
+                                $urls[0] .= "\t# oldest";
+                                $urls[-1] .= "\t# newest";
+                        }
+                } else { # v1
+                        push @urls, $http;
                 }
-                my $nr = scalar(@urls);
-                if ($nr > 1) {
-                        $urls .= "\n\t# this inbox consists of $nr epochs:";
-                        $urls[0] .= "\t# oldest";
-                        $urls[-1] .= "\t# newest";
+                # FIXME: epoch splits can be different in other repositories,
+                # use the "cloneurl" file as-is for now:
+                for my $u (@{$ibx->cloneurl}) {
+                        next if $seen{$u}++;
+                        push @urls, ($u =~ /\Ahttps?:/ ?
+                                        qq(<a\nhref="$u">$u</a>) : $u);
                 }
-        } else { # v1
-                push @urls, $http;
-        }
-
-        # FIXME: epoch splits can be different in other repositories,
-        # use the "cloneurl" file as-is for now:
-        foreach my $u (@{$ibx->cloneurl}) {
-                next if $seen{$u}++;
-                push @urls, $u =~ /\Ahttps?:/ ? qq(<a\nhref="$u">$u</a>) : $u;
-        }
-
-        $urls .= "\n" . join('', map { "\tgit clone --mirror $_\n" } @urls);
-        if (my $addrs = $ibx->{address}) {
-                $addrs = join(' ', @$addrs) if ref($addrs) eq 'ARRAY';
-                my $v = defined $max ? '-V2' : '-V1';
-                $urls .= <<EOF;
+                $s .= "\n";
+                $s .= join('', map { "\tgit clone --mirror $_\n" } @urls);
+                if (my $addrs = $ibx->{address}) {
+                        $addrs = join(' ', @$addrs) if ref($addrs) eq 'ARRAY';
+                        my $v = defined $max ? '-V2' : '-V1';
+                        $s .= <<EOF;
 
         # If you have public-inbox 1.1+ installed, you may
         # initialize and index your mirror using the following commands:
@@ -173,26 +171,41 @@ EOF
                 $addrs
         public-inbox-index $dir
 EOF
+                }
+        } else { # PublicInbox::ExtSearch
+                $s .= <<EOM;
+This is an extindex which is an amalgamation of several public-inboxes</a>
+EOM
+                my $v = $ctx->{www}->{pi_cfg}->{lc('publicInbox.wwwListing')};
+                if (($v // '') =~ /\A(?:all|match=domain)\z/) {
+                        my $upfx = ($ctx->{-upfx} // ''). '../';
+                        $s .= <<EOM;
+A list of them is available in the <a\nhref="$upfx">listing</a>
+EOM
+                }
         }
+
         my $cfg_link = ($ctx->{-upfx} // '').'_/text/config/raw';
-        $urls .= <<EOF;
+        $s .= <<EOF;
 
 Example <a
 href="$cfg_link">config snippet</a> for mirrors.
 EOF
-        my @nntp = map { qq(<a\nhref="$_">$_</a>) } @{$ibx->nntp_url};
-        if (@nntp) {
-                $urls .= @nntp == 1 ? 'Newsgroup' : 'Newsgroups are';
-                $urls .= ' available over NNTP:';
-                $urls .= "\n\t" . join("\n\t", @nntp) . "\n";
+        if ($ibx->can('nntp_url')) {
+                my @nntp = map { qq(<a\nhref="$_">$_</a>) } @{$ibx->nntp_url};
+                if (@nntp) {
+                        $s .= @nntp == 1 ? 'Newsgroup' : 'Newsgroups are';
+                        $s .= ' available over NNTP:';
+                        $s .= "\n\t" . join("\n\t", @nntp) . "\n";
+                }
         }
-        if ($urls =~ m!\b[^:]+://\w+\.onion/!) {
-                $urls .= " note: .onion URLs require Tor: ";
-                $urls .= qq[<a\nhref="$TOR_URL">$TOR_URL</a>];
+        if ($s =~ m!\b[^:]+://\w+\.onion/!) {
+                $s .= " note: .onion URLs require Tor: ";
+                $s .= qq[<a\nhref="$TOR_URL">$TOR_URL</a>];
         }
         '<hr><pre>'.join("\n\n",
                 $desc,
-                $urls,
+                $s,
                 coderepos($ctx),
                 code_footer($ctx->{env})
         ).'</pre></body></html>';