]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/InboxWritable.pm
inboxwritable: mime_from_path: reduce `$/' scope and returns
[public-inbox.git] / lib / PublicInbox / InboxWritable.pm
index 3558403bca655dec35a9aba29bcf427a3c578fc8..e8ecd3fba37023f51669a8abeb32e57491b41e8c 100644 (file)
@@ -8,6 +8,7 @@ use warnings;
 use base qw(PublicInbox::Inbox);
 use PublicInbox::Import;
 use PublicInbox::Filter::Base qw(REJECT);
+use Errno qw(ENOENT);
 
 use constant {
        PERM_UMASK => 0,
@@ -37,12 +38,33 @@ sub assert_usable_dir {
        die "no inboxdir defined for $self->{name}\n";
 }
 
+sub _init_v1 {
+       my ($self, $skip_artnum) = @_;
+       if (defined($self->{indexlevel}) || defined($skip_artnum)) {
+               require PublicInbox::SearchIdx;
+               require PublicInbox::Msgmap;
+               my $sidx = PublicInbox::SearchIdx->new($self, 1); # just create
+               $sidx->begin_txn_lazy;
+               if (defined $skip_artnum) {
+                       my $mm = PublicInbox::Msgmap->new($self->{inboxdir}, 1);
+                       $mm->{dbh}->begin_work;
+                       $mm->skip_artnum($skip_artnum);
+                       $mm->{dbh}->commit;
+               }
+               $sidx->commit_txn_lazy;
+       } else {
+               open my $fh, '>>', "$self->{inboxdir}/ssoma.lock" or
+                       die "$self->{inboxdir}/ssoma.lock: $!\n";
+       }
+}
+
 sub init_inbox {
        my ($self, $shards, $skip_epoch, $skip_artnum) = @_;
-       # TODO: honor skip_artnum
        if ($self->version == 1) {
                my $dir = assert_usable_dir($self);
                PublicInbox::Import::init_bare($dir);
+               $self->umask_prepare;
+               $self->with_umask(\&_init_v1, $self, $skip_artnum);
        } else {
                my $v2w = importer($self);
                $v2w->init_inbox($shards, $skip_epoch, $skip_artnum);
@@ -57,7 +79,7 @@ sub importer {
                die "v2 not supported: $@\n" if $@;
                my $opt = $self->{-creat_opt};
                my $v2w = PublicInbox::V2Writable->new($self, $opt);
-               $v2w->{parallel} = $parallel;
+               $v2w->{parallel} = $parallel if defined $parallel;
                $v2w;
        } elsif ($v == 1) {
                my @arg = (undef, undef, undef, $self);
@@ -114,16 +136,11 @@ sub is_maildir_path ($) {
 sub mime_from_path ($) {
        my ($path) = @_;
        if (open my $fh, '<', $path) {
-               local $/;
-               my $str = <$fh>;
-               $str or return;
-               return PublicInbox::Eml->new(\$str);
-       } elsif ($!{ENOENT}) {
-               # common with Maildir
-               return;
-       } else {
-               warn "failed to open $path: $!\n";
-               return;
+               my $str = do { local $/; <$fh> } or return;
+               PublicInbox::Eml->new(\$str);
+       } else { # ENOENT is common with Maildir
+               warn "failed to open $path: $!\n" if $! != ENOENT;
+               undef;
        }
 }
 
@@ -240,9 +257,9 @@ sub _umask_for {
 }
 
 sub with_umask {
-       my ($self, $cb) = @_;
+       my ($self, $cb, @arg) = @_;
        my $old = umask $self->{umask};
-       my $rv = eval { $cb->() };
+       my $rv = eval { $cb->(@arg) };
        my $err = $@;
        umask $old;
        die $err if $err;