X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FExtMsg.pm;h=cf9b6d58ba8d3b9836300a28cf96cf2000c1fa8f;hb=8968889e3ebfa09dd2c80fe8b917b83ac13ff356;hp=0cba49dd21df33032f72968c693069297a6555ef;hpb=dc7d90db1a7388bb3821add4ec208bfbfa25fdcf;p=public-inbox.git diff --git a/lib/PublicInbox/ExtMsg.pm b/lib/PublicInbox/ExtMsg.pm index 0cba49dd..cf9b6d58 100644 --- a/lib/PublicInbox/ExtMsg.pm +++ b/lib/PublicInbox/ExtMsg.pm @@ -1,5 +1,10 @@ # Copyright (C) 2015 all contributors # License: AGPLv3 or later (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 +# we should ensure users can find more easily find them on other +# sites. package PublicInbox::ExtMsg; use strict; use warnings; @@ -11,8 +16,9 @@ use PublicInbox::MID qw/mid2path/; our @EXT_URL = ( 'http://mid.gmane.org/%s', 'https://lists.debian.org/msgid-search/%s', - 'http://mid.mail-archive.com/%s', - 'http://marc.info/?i=%s', + # leading "//" denotes protocol-relative (http:// or https://) + '//mid.mail-archive.com/%s', + '//marc.info/?i=%s', ); sub ext_msg { @@ -67,21 +73,10 @@ sub ext_msg { my $path = "HEAD:" . mid2path($mid); foreach my $n (@nox) { - my @cmd = ('git', "--git-dir=$n->{git_dir}", 'cat-file', - '-t', $path); - my $pid = open my $fh, '-|'; - defined $pid or die "fork failed: $!\n"; - - if ($pid == 0) { - open STDERR, '>', '/dev/null'; # ignore errors - exec @cmd or die "exec failed: $!\n"; - } else { - my $type = eval { local $/; <$fh> }; - close $fh; - if ($? == 0 && $type eq "blob\n") { - return r302($n->{url}, $mid); - } - } + # TODO: reuse existing PublicInbox::Git objects to save forks + my $git = PublicInbox::Git->new($n->{git_dir}); + my (undef, $type, undef) = $git->check($path); + return r302($n->{url}, $mid) if ($type && $type eq 'blob'); } # fall back to partial MID matching @@ -90,24 +85,31 @@ sub ext_msg { eval { require PublicInbox::Msgmap }; my $have_mm = $@ ? 0 : 1; + my $cgi = $ctx->{cgi}; + my $base_url = $cgi->base->as_string; if ($have_mm) { - my $cgi = $ctx->{cgi}; - my $url = ref($cgi) eq 'CGI' ? $cgi->url(-base) . '/' - : $cgi->base->as_string; - $url .= $listname; + my $tmp_mid = $mid; + my $url; +again: + $url = $base_url . $listname; unshift @pfx, { git_dir => $ctx->{git_dir}, url => $url }; foreach my $pfx (@pfx) { my $git_dir = delete $pfx->{git_dir} or next; my $mm = eval { PublicInbox::Msgmap->new($git_dir) }; $mm or next; - if (my $res = $mm->mid_prefixes($mid)) { + if (my $res = $mm->mid_prefixes($tmp_mid)) { $n_partial += scalar(@$res); $pfx->{res} = $res; push @partial, $pfx; } } + # fixup common errors: + if (!$n_partial && $tmp_mid =~ s,/[tTf],,) { + goto again; + } } + my $code = 404; my $h = PublicInbox::Hval->new_msgid($mid, 1); my $href = $h->as_href; @@ -123,7 +125,7 @@ sub ext_msg { foreach my $pfx (@partial) { my $u = $pfx->{url}; foreach my $m (@{$pfx->{res}}) { - my $p = PublicInbox::Hval->new($m); + my $p = PublicInbox::Hval->new_msgid($m); my $r = $p->as_href; my $t = $p->as_html; $s .= qq{$u/$t/\n}; @@ -135,7 +137,9 @@ sub ext_msg { if (@EXT_URL && index($mid, '@') >= 0) { $code = 300; $s .= "\nPerhaps try an external site:\n\n"; + my $scheme = $cgi->scheme; foreach my $u (@EXT_URL) { + $u = "$scheme:$u" if $u =~ m!\A//!; my $r = sprintf($u, $href); my $t = sprintf($u, $html); $s .= qq{$t\n};