Searching across different inboxes is expensive without
SQLite (or Xapian) installed, so avoid doing expensive tree
lookups in git. Since SQLite is required for Xapian
support anyways, we won't need to check Xapian, either.
Sites without SQLite installed will simply 404 if somebody
requests a message which isn't in the current inbox.
my $cur = $ctx->{-inbox};
my $mid = $ctx->{mid};
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;
$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_first_doc_id('Q' . $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
push @found, $other;
} else {
# no point in trying the fork fallback if we
return exact($ctx, \@found, $mid) if @found;
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);
-
- if ($type && $type eq 'blob') {
- push @found, $other;
- }
- }
- }
- return exact($ctx, \@found, $mid) if @found;
-
# fall back to partial MID matching
my $n_partial = 0;
my @partial;
# fall back to partial MID matching
my $n_partial = 0;
my @partial;
-sub path_check {
- my ($self, $path) = @_;
- git($self)->check('HEAD:'.$path);
-}
-
sub mid2num($$) {
my ($self, $mid) = @_;
my $mm = mm($self) or return;
sub mid2num($$) {
my ($self, $mid) = @_;
my $mm = mm($self) or return;