]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/ExtMsg.pm
extmsg: rework partial MID matching to favor current inbox
[public-inbox.git] / lib / PublicInbox / ExtMsg.pm
index 39ee05f48e00957c4aed81283519a94ab5ee68a1..c71510f548191b966cfb4835256764f4ceeae7f3 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,7 +16,7 @@ use PublicInbox::WwwStream;
 our @EXT_URL = (
        # leading "//" denotes protocol-relative (http:// or https://)
        '//marc.info/?i=%s',
-       '//mid.mail-archive.com/%s',
+       '//www.mail-archive.com/search?l=mid&q=%s',
        'http://mid.gmane.org/%s',
        'https://lists.debian.org/msgid-search/%s',
        '//docs.FreeBSD.org/cgi/mid.cgi?db=mid&id=%s',
@@ -46,7 +46,7 @@ sub ext_msg {
                }
 
                # try to find the URL with Xapian to avoid forking
-               my $doc_id = eval { $s->find_unique_doc_id('mid', $mid) };
+               my $doc_id = eval { $s->find_first_doc_id('Q' . $mid) };
                if ($@) {
                        # xapian not configured properly for this repo
                        push @nox, $other;
@@ -84,17 +84,33 @@ sub ext_msg {
        my $n_partial = 0;
        my @partial;
 
-       eval { require PublicInbox::Msgmap };
-       my $have_mm = $@ ? 0 : 1;
-       if ($have_mm) {
+       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 ];
+                       }
+               }
+       }
+
+       # 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 +121,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 +136,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 +174,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';