X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FInbox.pm;h=df140cacbec177191839a7ffd310b132e11c566e;hb=796e7215a167f36d0b950631c3b1e44fa47fec07;hp=1b9b56ff1a7220e12350b726520bfcf91efa59e2;hpb=b5e960f50289434025f5904c8c1311e4c8a02b82;p=public-inbox.git
diff --git a/lib/PublicInbox/Inbox.pm b/lib/PublicInbox/Inbox.pm
index 1b9b56ff..df140cac 100644
--- a/lib/PublicInbox/Inbox.pm
+++ b/lib/PublicInbox/Inbox.pm
@@ -1,4 +1,4 @@
-# Copyright (C) 2016-2020 all contributors
+# Copyright (C) 2016-2021 all contributors
# License: AGPL-3.0+
#
# Represents a public-inbox (which may have multiple mailing addresses)
@@ -8,6 +8,7 @@ use PublicInbox::Git;
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.
@@ -168,8 +169,8 @@ sub max_git_epoch {
}
sub mm {
- my ($self) = @_;
- $self->{mm} ||= eval {
+ my ($self, $req) = @_;
+ $self->{mm} //= eval {
require PublicInbox::Msgmap;
my $dir = $self->{inboxdir};
if ($self->version >= 2) {
@@ -177,7 +178,7 @@ sub mm {
} else {
PublicInbox::Msgmap->new($dir);
}
- };
+ } // ($req ? croak("E: $@") : undef);
}
sub search {
@@ -195,27 +196,24 @@ 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) = @_;
- my $rv = '';
- if (open(my $fh, '<', $path)) {
- local $/;
- $rv = <$fh>;
- }
- $rv;
+ open(my $fh, '<', $path) or return '';
+ local $/;
+ <$fh> // '';
}
sub cat_desc ($) {
@@ -244,7 +242,7 @@ sub cloneurl {
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!;
@@ -424,4 +422,16 @@ sub uidvalidity { $_[0]->{uidvalidity} //= eval { $_[0]->mm->created_at } }
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;