use PublicInbox::MID qw(mid2path);
use Devel::Peek qw(SvREFCNT);
use PublicInbox::MIME;
+use POSIX qw(strftime);
my $cleanup_timer;
eval {
require PublicInbox::EvCleanup;
$cleanup_timer = undef; # OK if we get here
};
+my $cleanup_broken = $@;
my $CLEANUP = {}; # string(inbox) -> inbox
sub cleanup_task () {
$cleanup_timer = undef;
+ my $next = {};
for my $ibx (values %$CLEANUP) {
- foreach my $f (qw(git mm search)) {
+ my $again;
+ foreach my $f (qw(mm search)) {
delete $ibx->{$f} if SvREFCNT($ibx->{$f}) == 1;
}
+ my $expire = time - 60;
+ if (my $git = $ibx->{git}) {
+ $again = $git->cleanup($expire);
+ }
+ if (my $gits = $ibx->{-repo_objs}) {
+ foreach my $git (@$gits) {
+ $again = 1 if $git->cleanup($expire);
+ }
+ }
+ $again ||= !!($ibx->{mm} || $ibx->{search});
+ $next->{"$ibx"} = $ibx if $again;
}
- $CLEANUP = {};
+ $CLEANUP = $next;
}
sub _cleanup_later ($) {
my ($self) = @_;
+ return if $cleanup_broken;
return unless PublicInbox::EvCleanup::enabled();
$cleanup_timer ||= PublicInbox::EvCleanup::later(*cleanup_task);
$CLEANUP->{"$self"} = $self;
sub mm {
my ($self) = @_;
$self->{mm} ||= eval {
+ require PublicInbox::Msgmap;
_cleanup_later($self);
my $dir = $self->{mainrepo};
if (($self->{version} || 1) >= 2) {
sub base_url {
my ($self, $env) = @_;
- if ($env) { # PSGI env
- my $scheme = $env->{'psgi.url_scheme'};
+ my $scheme;
+ if ($env && ($scheme = $env->{'psgi.url_scheme'})) { # PSGI env
my $host_port = $env->{HTTP_HOST} ||
"$env->{SERVER_NAME}:$env->{SERVER_PORT}";
my $url = "$scheme://$host_port". ($env->{SCRIPT_NAME} || '/');
sub msg_by_smsg ($$;$) {
my ($self, $smsg, $ref) = @_;
- return unless defined $smsg; # ghost
-
- # backwards compat to fallback to msg_by_mid
- # TODO: remove if we bump SCHEMA_VERSION in Search.pm:
- defined(my $blob = $smsg->{blob}) or
- return msg_by_path($self, mid2path($smsg->mid), $ref);
+ # ghosts may have undef smsg (from SearchThread.node) or
+ # no {blob} field
+ return unless defined $smsg;
+ defined(my $blob = $smsg->{blob}) or return;
my $str = git($self)->cat_file($blob, $ref);
$$str =~ s/\A[\r\n]*From [^\r\n]*\r?\n//s if $str;
}
}
-sub path_check {
- my ($self, $path) = @_;
- git($self)->check('HEAD:'.$path);
+sub mid2num($$) {
+ my ($self, $mid) = @_;
+ my $mm = mm($self) or return;
+ $mm->num_for($mid);
+}
+
+sub smsg_by_mid ($$) {
+ my ($self, $mid) = @_;
+ my $srch = search($self) or return;
+ # favor the Message-ID we used for the NNTP article number:
+ defined(my $num = mid2num($self, $mid)) or return;
+ my $smsg = $srch->lookup_article($num) or return;
+ PublicInbox::SearchMsg::psgi_cull($smsg);
}
sub msg_by_mid ($$;$) {
my ($self, $mid, $ref) = @_;
my $srch = search($self) or
- return msg_by_path($self, mid2path($mid), $ref);
- my $smsg;
- $srch->retry_reopen(sub {
- $smsg = $srch->lookup_skeleton($mid) and $smsg->load_expand;
- });
+ return msg_by_path($self, mid2path($mid), $ref);
+ my $smsg = smsg_by_mid($self, $mid);
$smsg ? msg_by_smsg($self, $smsg, $ref) : undef;
}
+sub recent {
+ my ($self, $opts, $after, $before) = @_;
+ search($self)->{over_ro}->recent($opts, $after, $before);
+}
+
1;