use PublicInbox::MID qw(mid2path);
use PublicInbox::Eml;
use List::Util qw(max);
+use Carp qw(croak);
# Long-running "git-cat-file --batch" processes won't notice
# unlinked packs, so we need to restart those processes occasionally.
}
sub mm {
- my ($self) = @_;
- $self->{mm} ||= eval {
+ my ($self, $req) = @_;
+ $self->{mm} //= eval {
require PublicInbox::Msgmap;
my $dir = $self->{inboxdir};
if ($self->version >= 2) {
} else {
PublicInbox::Msgmap->new($dir);
}
- };
+ } // ($req ? croak("E: $@") : undef);
}
sub search {
sub isrch { $_[0]->{isrch} // search($_[0]) }
sub over {
- $_[0]->{over} //= eval {
- my $srch = $_[0]->{search} //= eval {
- _cleanup_later($_[0]);
+ my ($self, $req) = @_;
+ $self->{over} //= eval {
+ my $srch = $self->{search} //= do {
+ _cleanup_later($self);
require PublicInbox::Search;
- PublicInbox::Search->new($_[0]);
+ PublicInbox::Search->new($self);
};
my $over = PublicInbox::Over->new("$srch->{xpfx}/over.sqlite3");
$over->dbh; # may fail
$over;
- };
+ } // ($req ? croak("E: $@") : undef);
}
-
sub try_cat {
my ($path) = @_;
open(my $fh, '<', $path) or return '';
sub base_url {
my ($self, $env) = @_; # env - PSGI env
- if ($env) {
+ if ($env && $env->{'psgi.url_scheme'}) {
my $url = PublicInbox::Git::host_prefix_url($env, '');
# for mount in Plack::Builder
$url .= '/' if $url !~ m!/\z!;
}
# called from a non-PSGI environment (e.g. NNTP/POP3):
$self->{-base_url} ||= do {
- my $url = $self->{url}->[0] or return undef;
+ my $url = $self->{url} // return undef;
+ $url = $url->[0] // return undef;
# expand protocol-relative URLs to HTTPS if we're
# not inside a web server
$url = "https:$url" if $url =~ m!\A//!;
sub eidx_key { $_[0]->{newsgroup} // $_[0]->{inboxdir} }
+sub mailboxid { # rfc 8474, 8620, 8621
+ my ($self, $imap_slice) = @_;
+ my $pfx = defined($imap_slice) ? $self->{newsgroup} : $self->{name};
+ utf8::encode($pfx); # to octets
+ # RFC 8620, 1.2 recommends not starting with dash or digits
+ # "A good solution to these issues is to prefix every id with a single
+ # alphabetical character."
+ 'M'.join('', map { sprintf('%02x', ord) } split(//, $pfx)) .
+ (defined($imap_slice) ? sprintf('-%x', $imap_slice) : '') .
+ sprintf('-%x', uidvalidity($self) // 0)
+}
+
1;