about summary refs log tree commit homepage
path: root/lib/PublicInbox/InboxWritable.pm
diff options
context:
space:
mode:
authorEric Wong <e@yhbt.net>2020-07-17 06:31:51 +0000
committerEric Wong <e@yhbt.net>2020-07-17 20:56:51 +0000
commit1e63e0409004f1edb352f53729e2d4aed4825a22 (patch)
tree1c3db8856122e13122be01e15538220f6f04f18d /lib/PublicInbox/InboxWritable.pm
parentc6d0a81e6ca7a5da9f9ff193f0992705aa9f9682 (diff)
downloadpublic-inbox-1e63e0409004f1edb352f53729e2d4aed4825a22.tar.gz
While it makes the code flow slightly less well in some places,
it saves us runtime allocations and indentation.
Diffstat (limited to 'lib/PublicInbox/InboxWritable.pm')
-rw-r--r--lib/PublicInbox/InboxWritable.pm42
1 files changed, 24 insertions, 18 deletions
diff --git a/lib/PublicInbox/InboxWritable.pm b/lib/PublicInbox/InboxWritable.pm
index 875dcce2..1f3f6672 100644
--- a/lib/PublicInbox/InboxWritable.pm
+++ b/lib/PublicInbox/InboxWritable.pm
@@ -37,27 +37,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) = @_;
         if ($self->version == 1) {
                 my $dir = assert_usable_dir($self);
                 PublicInbox::Import::init_bare($dir);
-                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;
-                        $self->with_umask(sub {
-                                my $mm = PublicInbox::Msgmap->new($dir, 1);
-                                $mm->{dbh}->begin_work;
-                                $mm->skip_artnum($skip_artnum);
-                                $mm->{dbh}->commit;
-                        }) if defined($skip_artnum);
-                        $sidx->commit_txn_lazy;
-                } else {
-                        open my $fh, '>>', "$dir/ssoma.lock" or
-                                die "$dir/ssoma.lock: $!\n";
-                }
+                $self->umask_prepare;
+                $self->with_umask(\&_init_v1, $self, $skip_artnum);
         } else {
                 my $v2w = importer($self);
                 $v2w->init_inbox($shards, $skip_epoch, $skip_artnum);
@@ -255,9 +261,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;