]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/ExtMsg.pm
Merge remote-tracking branch 'origin/master' into v2
[public-inbox.git] / lib / PublicInbox / ExtMsg.pm
index 39ee05f48e00957c4aed81283519a94ab5ee68a1..04cb40623de30f8105e5af1cb8c6254f2128607c 100644 (file)
@@ -1,5 +1,5 @@
-# Copyright (C) 2015 all contributors <meta@public-inbox.org>
-# License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt)
+# Copyright (C) 2015-2018 all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 #
 # Used by the web interface to link to messages outside of the our
 # public-inboxes.  Mail threads may cross projects/threads; so
@@ -16,8 +16,8 @@ use PublicInbox::WwwStream;
 our @EXT_URL = (
        # leading "//" denotes protocol-relative (http:// or https://)
        '//marc.info/?i=%s',
-       '//mid.mail-archive.com/%s',
-       'http://mid.gmane.org/%s',
+       '//www.mail-archive.com/search?l=mid&q=%s',
+       'nntp://news.gmane.org/%s',
        'https://lists.debian.org/msgid-search/%s',
        '//docs.FreeBSD.org/cgi/mid.cgi?db=mid&id=%s',
        'https://www.w3.org/mid/%s',
@@ -31,30 +31,19 @@ sub ext_msg {
        my $cur = $ctx->{-inbox};
        my $mid = $ctx->{mid};
 
-       eval { require PublicInbox::Search };
-       my $have_xap = $@ ? 0 : 1;
-       my (@nox, @ibx, @found);
+       eval { require PublicInbox::Msgmap };
+       my $have_mm = $@ ? 0 : 1;
+       my (@ibx, @found);
 
        $ctx->{www}->{pi_config}->each_inbox(sub {
                my ($other) = @_;
                return if $other->{name} eq $cur->{name} || !$other->base_url;
 
-               my $s = $other->search;
-               if (!$s) {
-                       push @nox, $other;
-                       return;
-               }
-
-               # try to find the URL with Xapian to avoid forking
-               my $doc_id = eval { $s->find_unique_doc_id('mid', $mid) };
-               if ($@) {
-                       # xapian not configured properly for this repo
-                       push @nox, $other;
-                       return;
-               }
+               my $mm = $other->mm or return;
 
-               # maybe we found it!
-               if (defined $doc_id) {
+               # try to find the URL with Msgmap to avoid forking
+               my $num = $mm->num_for($mid);
+               if (defined $num) {
                        push @found, $other;
                } else {
                        # no point in trying the fork fallback if we
@@ -66,35 +55,37 @@ sub ext_msg {
 
        return exact($ctx, \@found, $mid) if @found;
 
-       # Xapian not installed or configured for some repos,
-       # do a full MID check (this is expensive...):
-       if (@nox) {
-               my $path = mid2path($mid);
-               foreach my $other (@nox) {
-                       my (undef, $type, undef) = $other->path_check($path);
+       # fall back to partial MID matching
+       my $n_partial = 0;
+       my @partial;
 
-                       if ($type && $type eq 'blob') {
-                               push @found, $other;
+       if (my $mm = $cur->mm) {
+               my $tmp_mid = $mid;
+               my $res = $mm->mid_prefixes($tmp_mid, 100);
+               if ($res && scalar(@$res)) {
+                       $n_partial += scalar(@$res);
+                       push @partial, [ $cur, $res ];
+               # fixup common errors:
+               } elsif ($tmp_mid =~ s,/[tTf],,) {
+                       $res = $mm->mid_prefixes($tmp_mid, 100);
+                       if ($res && scalar(@$res)) {
+                               $n_partial += scalar(@$res);
+                               push @partial, [ $cur, $res ];
                        }
                }
        }
-       return exact($ctx, \@found, $mid) if @found;
 
-       # fall back to partial MID matching
-       my $n_partial = 0;
-       my @partial;
-
-       eval { require PublicInbox::Msgmap };
-       my $have_mm = $@ ? 0 : 1;
-       if ($have_mm) {
+       # can't find a partial match in current inbox, try the others:
+       if (!$n_partial && length($mid) >= 16) {
                my $tmp_mid = $mid;
 again:
-               unshift @ibx, $cur;
                foreach my $ibx (@ibx) {
                        my $mm = $ibx->mm or next;
-                       if (my $res = $mm->mid_prefixes($tmp_mid)) {
+                       my $res = $mm->mid_prefixes($tmp_mid, 100);
+                       if ($res && scalar(@$res)) {
                                $n_partial += scalar(@$res);
                                push @partial, [ $ibx, $res ];
+                               last if $n_partial >= 100;
                        }
                }
                # fixup common errors:
@@ -105,7 +96,7 @@ again:
 
        my $code = 404;
        my $h = PublicInbox::Hval->new_msgid($mid);
-       my $href = $h->as_href;
+       my $href = $h->{href};
        my $html = $h->as_html;
        my $title = "&lt;$html&gt; not found";
        my $s = "<pre>Message-ID &lt;$html&gt;\nnot found\n";
@@ -120,7 +111,7 @@ again:
                        my $u = $ibx->base_url($env) or next;
                        foreach my $m (@$res) {
                                my $p = PublicInbox::Hval->new_msgid($m);
-                               my $r = $p->as_href;
+                               my $r = $p->{href};
                                my $t = $p->as_html;
                                $s .= qq{<a\nhref="$u$r/">$u$t/</a>\n};
                        }
@@ -158,7 +149,7 @@ sub ext_urls {
 sub exact {
        my ($ctx, $found, $mid) = @_;
        my $h = PublicInbox::Hval->new_msgid($mid);
-       my $href = $h->as_href;
+       my $href = $h->{href};
        my $html = $h->as_html;
        my $title = "&lt;$html&gt; found in ";
        my $end = @$found == 1 ? 'another inbox' : 'other inboxes';