X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FExtMsg.pm;h=be29974900792f2023b7b7b97b5144b61ee6538c;hb=refs%2Fheads%2Fmaster;hp=2a0a3e46befc7dfc6688a95954da957cb0f7a815;hpb=8e0aef5068aa71e58d4a049491229f41e6bf19fb;p=public-inbox.git diff --git a/lib/PublicInbox/ExtMsg.pm b/lib/PublicInbox/ExtMsg.pm index 2a0a3e46..be299749 100644 --- a/lib/PublicInbox/ExtMsg.pm +++ b/lib/PublicInbox/ExtMsg.pm @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2020 all contributors +# Copyright (C) all contributors # License: AGPL-3.0+ # # Used by the web interface to link to messages outside of the our @@ -11,7 +11,7 @@ use warnings; use PublicInbox::Hval qw(ascii_html prurl mid_href); use PublicInbox::WwwStream qw(html_oneshot); use PublicInbox::Smsg; -our $MIN_PARTIAL_LEN = 16; +our $MIN_PARTIAL_LEN = 14; # for 'XXXXXXXXXX.fsf' msgids gnus generates # TODO: user-configurable our @EXT_URL = map { ascii_html($_) } ( @@ -32,8 +32,8 @@ sub PARTIAL_MAX () { 100 } sub search_partial ($$) { my ($ibx, $mid) = @_; return if length($mid) < $MIN_PARTIAL_LEN; - my $srch = $ibx->search or return; - my $opt = { limit => PARTIAL_MAX, mset => 2 }; + my $srch = $ibx->isrch or return; + my $opt = { limit => PARTIAL_MAX, relevance => -1 }; my @try = ("m:$mid*"); my $chop = $mid; if ($chop =~ s/(\W+)(\w*)\z//) { @@ -76,7 +76,7 @@ sub search_partial ($$) { sub ext_msg_i { my ($other, $ctx) = @_; - return if $other->{name} eq $ctx->{-inbox}->{name} || !$other->base_url; + return if $other->{name} eq $ctx->{ibx}->{name} || !$other->base_url; my $mm = $other->mm or return; @@ -105,9 +105,10 @@ sub ext_msg_step { sub ext_msg_ALL ($) { my ($ctx) = @_; - my $ALL = $ctx->{www}->{pi_config}->ALL or return; - my $by_eidx_key = $ctx->{www}->{pi_config}->{-by_eidx_key}; - my $cur_key = $ctx->{-inbox}->eidx_key; + my $ALL = $ctx->{www}->{pi_cfg}->ALL or return; + my $by_eidx_key = $ctx->{www}->{pi_cfg}->{-by_eidx_key}; + my $cur_key = eval { $ctx->{ibx}->eidx_key } // + return partial_response($ctx); # $cur->{ibx} == $ALL my %seen = ($cur_key => 1); my ($id, $prev); while (my $x = $ALL->over->next_by_mid($ctx->{mid}, \$id, \$prev)) { @@ -116,14 +117,14 @@ sub ext_msg_ALL ($) { $k =~ s/:[0-9]+:$x->{blob}\z// or next; next if $k eq $cur_key; my $ibx = $by_eidx_key->{$k} // next; - my $url = $ibx->base_url or next; + $ibx->base_url or next; push(@{$ctx->{found}}, $ibx) unless $seen{$k}++; } } return exact($ctx) if $ctx->{found}; # fall back to partial MID matching - for my $ibxish ($ctx->{-inbox}, $ALL) { + for my $ibxish ($ctx->{ibx}, $ALL) { my $mids = search_partial($ibxish, $ctx->{mid}) or next; push @{$ctx->{partial}}, [ $ibxish, $mids ]; last if ($ctx->{n_partial} += scalar(@$mids)) >= PARTIAL_MAX; @@ -139,17 +140,17 @@ sub ext_msg { if ($ctx->{env}->{'pi-httpd.async'}) { require PublicInbox::ConfigIter; my $iter = PublicInbox::ConfigIter->new( - $ctx->{www}->{pi_config}, + $ctx->{www}->{pi_cfg}, \&ext_msg_step, $ctx); $iter->event_step; } else { - $ctx->{www}->{pi_config}->each_inbox(\&ext_msg_i, $ctx); + $ctx->{www}->{pi_cfg}->each_inbox(\&ext_msg_i, $ctx); finalize_exact($ctx); } }; } -# called via PublicInbox::DS->EventLoop +# called via PublicInbox::DS::event_loop sub event_step { my ($ctx, $sync) = @_; # can't find a partial match in current inbox, try the others: @@ -169,7 +170,7 @@ sub finalize_exact { # fall back to partial MID matching my $mid = $ctx->{mid}; - my $cur = $ctx->{-inbox}; + my $cur = $ctx->{ibx}; my $mids = search_partial($cur, $mid); if ($mids) { $ctx->{n_partial} = scalar(@$mids); @@ -187,6 +188,12 @@ sub finalize_exact { finalize_partial($ctx); } +sub _url_pfx ($$) { + my ($ctx, $u) = @_; + (index($u, '://') < 0 && index($u, '/') != 0) ? + "$ctx->{-upfx}../$u" : $u; +} + sub partial_response ($) { my ($ctx) = @_; my $mid = $ctx->{mid}; @@ -195,16 +202,17 @@ sub partial_response ($) { my $html = ascii_html($mid); my $title = "<$html> not found"; my $s = "
Message-ID <$html>\nnot found\n";
+	$ctx->{-upfx} //= '../';
 	if (my $n_partial = $ctx->{n_partial}) {
 		$code = 300;
 		my $es = $n_partial == 1 ? '' : 'es';
 		$n_partial .= '+' if ($n_partial == PARTIAL_MAX);
 		$s .= "\n$n_partial partial match$es found:\n\n";
-		my $cur_name = $ctx->{-inbox}->{name};
+		my $cur_name = $ctx->{ibx}->{name};
 		foreach my $pair (@{$ctx->{partial}}) {
 			my ($ibx, $res) = @$pair;
-			my $env = $ctx->{env} if $ibx->{name} eq $cur_name;
-			my $u = $ibx->base_url($env) or next;
+			my $e = $ibx->{name} eq $cur_name ? $ctx->{env} : undef;
+			my $u = _url_pfx($ctx, $ibx->base_url($e) // next);
 			foreach my $m (@$res) {
 				my $href = mid_href($m);
 				my $html = ascii_html($m);
@@ -219,13 +227,13 @@ sub partial_response ($) {
 	}
 	$ctx->{-html_tip} = $s .= '
'; $ctx->{-title_html} = $title; - $ctx->{-upfx} = '../'; html_oneshot($ctx, $code); } sub finalize_partial ($) { $_[0]->{-wcb}->(partial_response($_[0])) } sub ext_urls { + return ""; my ($ctx, $mid, $href, $html) = @_; # Fall back to external repos if configured @@ -252,13 +260,13 @@ sub exact { my $title = "<$html> found in "; my $end = @$found == 1 ? 'another inbox' : 'other inboxes'; $ctx->{-title_html} = $title . $end; - $ctx->{-upfx} = '../'; + $ctx->{-upfx} //= '../'; my $ext_urls = ext_urls($ctx, $mid, $href, $html); my $code = (@$found == 1 && $ext_urls eq '') ? 200 : 300; $ctx->{-html_tip} = join('', "
Message-ID: <$html>\nfound in $end:\n\n",
 				(map {
-					my $u = $_->base_url;
+					my $u = _url_pfx($ctx, $_->base_url);
 					qq($u$html/\n)
 				} @$found),
 			$ext_urls, '
');