about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--lib/PublicInbox/SearchIdx.pm40
-rwxr-xr-xpublic-inbox-mda2
2 files changed, 28 insertions, 14 deletions
diff --git a/lib/PublicInbox/SearchIdx.pm b/lib/PublicInbox/SearchIdx.pm
index 5664c385..2c2f8193 100644
--- a/lib/PublicInbox/SearchIdx.pm
+++ b/lib/PublicInbox/SearchIdx.pm
@@ -21,19 +21,18 @@ sub new {
         my $dir = $class->xdir($git_dir);
         require Search::Xapian::WritableDatabase;
         my $flag = Search::Xapian::DB_OPEN;
-        if ($writable == 1) {
-                require File::Path;
-                File::Path::mkpath($dir);
-                $flag = Search::Xapian::DB_CREATE_OR_OPEN;
-        }
         my $self = bless { git_dir => $git_dir }, $class;
-        my $umask = _umask_for($self->_git_config_perm);
-        my $old_umask = umask $umask;
-        my $db = eval { Search::Xapian::WritableDatabase->new($dir, $flag) };
-        my $err = $@;
-        umask $old_umask;
-        die $err if $err;
-        $self->{xdb} = $db;
+        my $perm = $self->_git_config_perm;
+        my $umask = _umask_for($perm);
+        $self->{umask} = $umask;
+        $self->{xdb} = $self->with_umask(sub {
+                if ($writable == 1) {
+                        require File::Path;
+                        File::Path::mkpath($dir);
+                        $flag = Search::Xapian::DB_CREATE_OR_OPEN;
+                }
+                Search::Xapian::WritableDatabase->new($dir, $flag);
+        });
         $self;
 }
 
@@ -288,9 +287,14 @@ sub do_cat_mail {
         $@ ? undef : $mime;
 }
 
-# indexes all unindexed messages
 sub index_sync {
         my ($self, $head) = @_;
+        $self->with_umask(sub { $self->_index_sync($head) });
+}
+
+# indexes all unindexed messages
+sub _index_sync {
+        my ($self, $head) = @_;
         require PublicInbox::GitCatFile;
         my $db = $self->{xdb};
         my $hex = '[a-f0-9]';
@@ -423,4 +427,14 @@ sub _umask_for {
         (~$rv & 0777);
 }
 
+sub with_umask {
+        my ($self, $cb) = @_;
+        my $old = umask $self->{umask};
+        my $rv = eval { $cb->() };
+        my $err = $@;
+        umask $old;
+        die $err if $@;
+        $rv;
+}
+
 1;
diff --git a/public-inbox-mda b/public-inbox-mda
index 8e98d6eb..c4822b61 100755
--- a/public-inbox-mda
+++ b/public-inbox-mda
@@ -88,7 +88,7 @@ sub do_spamc {
 sub search_index_sync {
         my ($git_dir) = @_;
         eval {
-                require PublicInbox::Search;
+                require PublicInbox::SearchIdx;
                 PublicInbox::SearchIdx->new($git_dir, 2)->index_sync;
         };
 }