This lets us pretend an ExtSearch object is an Inbox object
in most of the existing WWW code.
$self->{-by_name}->{$name} // _fill($self, "publicinbox.$name");
}
$self->{-by_name}->{$name} // _fill($self, "publicinbox.$name");
}
+sub lookup_ei {
+ my ($self, $name) = @_;
+ $self->{-ei_by_name}->{$name} //= _fill_ei($self, "eindex.$name");
+}
+
sub each_inbox {
my ($self, $cb, @arg) = @_;
# may auto-vivify if config file is non-existent:
sub each_inbox {
my ($self, $cb, @arg) = @_;
# may auto-vivify if config file is non-existent:
+sub _fill_ei ($$) {
+ my ($self, $pfx) = @_;
+ require PublicInbox::ExtSearch;
+ my $d = $self->{"$pfx.topdir"};
+ defined($d) && -d $d ? PublicInbox::ExtSearch->new($d) : undef;
+}
+
sub urlmatch {
my ($self, $key, $url) = @_;
state $urlmatch_broken; # requires git 1.8.5
sub urlmatch {
my ($self, $key, $url) = @_;
state $urlmatch_broken; # requires git 1.8.5
# Read-only external (detached) index for cross inbox search.
# This is a read-only counterpart to PublicInbox::ExtSearchIdx
# Read-only external (detached) index for cross inbox search.
# This is a read-only counterpart to PublicInbox::ExtSearchIdx
+# and behaves like PublicInbox::Inbox AND PublicInbox::Search
package PublicInbox::ExtSearch;
use strict;
use v5.10.1;
package PublicInbox::ExtSearch;
use strict;
use v5.10.1;
+sub search { $_[0] } # self
+
# overrides PublicInbox::Search::_xdb
sub _xdb {
my ($self) = @_;
# overrides PublicInbox::Search::_xdb
sub _xdb {
my ($self) = @_;
$self->{git} //= PublicInbox::Git->new("$self->{topdir}/ALL.git");
}
$self->{git} //= PublicInbox::Git->new("$self->{topdir}/ALL.git");
}
+sub mm { undef }
+
+sub altid_map { {} }
+
+sub description {
+ my ($self) = @_;
+ ($self->{description} //=
+ PublicInbox::Inbox::cat_desc("$self->{topdir}/description")) //
+ '$EINDEX_DIR/description missing';
+}
+
+sub cloneurl { [] } # TODO
+
+sub base_url { 'https://example.com/TODO/' }
+sub nntp_url { [] }
+
no warnings 'once';
*smsg_eml = \&PublicInbox::Inbox::smsg_eml;
no warnings 'once';
*smsg_eml = \&PublicInbox::Inbox::smsg_eml;
+*smsg_by_mid = \&PublicInbox::Inbox::smsg_by_mid;
+*msg_by_mid = \&PublicInbox::Inbox::msg_by_mid;
+*modified = \&PublicInbox::Inbox::modified;
+*recent = \&PublicInbox::Inbox::recent;
+
+*max_git_epoch = *nntp_usable = *msg_by_path = \&mm; # undef
+sub cat_desc ($) {
+ my $desc = try_cat($_[0]);
+ local $/ = "\n";
+ chomp $desc;
+ utf8::decode($desc);
+ $desc =~ s/\s+/ /smg;
+ $desc eq '' ? undef : $desc;
+}
+
sub description {
my ($self) = @_;
sub description {
my ($self) = @_;
- ($self->{description} //= do {
- my $desc = try_cat("$self->{inboxdir}/description");
- local $/ = "\n";
- chomp $desc;
- utf8::decode($desc);
- $desc =~ s/\s+/ /smg;
- $desc eq '' ? undef : $desc;
- }) // '($INBOX_DIR/description missing)';
+ ($self->{description} //= cat_desc("$self->{inboxdir}/description")) //
+ '($INBOX_DIR/description missing)';
-sub mid2num($$) {
- my ($self, $mid) = @_;
- my $mm = mm($self) or return;
- $mm->num_for($mid);
-}
-
sub smsg_by_mid ($$) {
my ($self, $mid) = @_;
sub smsg_by_mid ($$) {
my ($self, $mid) = @_;
- my $over = over($self) or return;
- # favor the Message-ID we used for the NNTP article number:
- defined(my $num = mid2num($self, $mid)) or return;
- my $smsg = $over->get_art($num) or return;
- PublicInbox::Smsg::psgi_cull($smsg);
+ my $over = $self->over or return;
+ my $smsg;
+ if (my $mm = $self->mm) {
+ # favor the Message-ID we used for the NNTP article number:
+ defined(my $num = $mm->num_for($mid)) or return;
+ $smsg = $over->get_art($num);
+ } else {
+ my ($id, $prev);
+ $smsg = $over->next_by_mid($mid, \$id, \$prev);
+ }
+ $smsg ? PublicInbox::Smsg::psgi_cull($smsg) : undef;
}
sub msg_by_mid ($$) {
my ($self, $mid) = @_;
}
sub msg_by_mid ($$) {
my ($self, $mid) = @_;
-
- over($self) or
- return msg_by_path($self, mid2path($mid));
-
my $smsg = smsg_by_mid($self, $mid);
my $smsg = smsg_by_mid($self, $mid);
- $smsg ? msg_by_smsg($self, $smsg) : undef;
+ $smsg ? msg_by_smsg($self, $smsg) : msg_by_path($self, mid2path($mid));
}
sub recent {
my ($self, $opts, $after, $before) = @_;
}
sub recent {
my ($self, $opts, $after, $before) = @_;
- over($self)->recent($opts, $after, $before);
+ $self->over->recent($opts, $after, $before);
}
sub modified {
my ($self) = @_;
}
sub modified {
my ($self) = @_;
- if (my $over = over($self)) {
+ if (my $over = $self->over) {
my $msgs = $over->recent({limit => 1});
if (my $smsg = $msgs->[0]) {
return $smsg->{ts};
my $msgs = $over->recent({limit => 1});
if (my $smsg = $msgs->[0]) {
return $smsg->{ts};
# returns undef if valid, array ref response if invalid
sub invalid_inbox ($$) {
my ($ctx, $inbox) = @_;
# returns undef if valid, array ref response if invalid
sub invalid_inbox ($$) {
my ($ctx, $inbox) = @_;
- my $ibx = $ctx->{www}->{pi_config}->lookup_name($inbox);
+ my $ibx = $ctx->{www}->{pi_config}->lookup_name($inbox) //
+ $ctx->{www}->{pi_config}->lookup_ei($inbox);
if (defined $ibx) {
$ctx->{-inbox} = $ibx;
return;
if (defined $ibx) {
$ctx->{-inbox} = $ibx;
return;