From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.2 required=3.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 4D7B71F43D for ; Tue, 21 Mar 2023 23:07:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=80x24.org; s=selector1; t=1679440069; bh=mlADHGlmqlYZ0Kdu0HuKdg3bjAOhcg7i2e6LUnkaidw=; h=From:To:Subject:Date:In-Reply-To:References:From; b=Sxy+dQbmAwBue1TeBVFEbsRr1e7zhkCXvsWyUwXm2cIEYAdJJtwdPhttEMtm8S/Nh 4vlkZNtjBRBC3bnvMnRkaVFF5rukAjqBXYGLbcDwMn5zHHaXy4ME8Rzg/tlnnvILtj sEAr9W5TTMGLtSqj/fQpBgK46lypK6okcsG4eSvU= From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 27/28] cindex: respect existing permissions Date: Tue, 21 Mar 2023 23:07:42 +0000 Message-Id: <20230321230743.3020032-27-e@80x24.org> In-Reply-To: <20230321230743.3020032-1-e@80x24.org> References: <20230321230701.3019936-1-e@80x24.org> <20230321230743.3020032-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: For internal ($GIT_DIR/public-inbox-cindex) Xapian DBs, we can rely on core.sharedRepository. For external ones, we'll just rely on existing permissions if the directory already exists. --- lib/PublicInbox/CodeSearchIdx.pm | 29 ++++++++++++++++++++++++++++- t/cindex.t | 22 +++++++++++++++++++--- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/lib/PublicInbox/CodeSearchIdx.pm b/lib/PublicInbox/CodeSearchIdx.pm index 21c43973..704baa9c 100644 --- a/lib/PublicInbox/CodeSearchIdx.pm +++ b/lib/PublicInbox/CodeSearchIdx.pm @@ -710,8 +710,35 @@ sub init_tmp_git_dir ($) { $TMP_GIT->{-tmp} = $tmp; } +sub prep_umask ($) { + my ($self) = @_; + my $um; + my $cur = umask; + if ($self->{-internal}) { # respect core.sharedRepository + @{$self->{git_dirs}} == 1 or die 'BUG: only for GIT_DIR'; + # yuck, FIXME move umask handling out of inbox-specific stuff + require PublicInbox::InboxWritable; + my $git = PublicInbox::Git->new($self->{git_dirs}->[0]); + chomp($um = $git->qx('config', 'core.sharedRepository') // ''); + $um = PublicInbox::InboxWritable::_git_config_perm(undef, $um); + $um = PublicInbox::InboxWritable::_umask_for($um); + umask == $um or progress($self, 'umask from git: ', + sprintf('0%03o', $um)); + } elsif (-d $self->{cidx_dir}) { # respect existing perms + my @st = stat(_); + $um = (~$st[2] & 0777); + umask == $um or progress($self, 'using umask from ', + $self->{cidx_dir}, ': ', + sprintf('0%03o', $um)); + } + defined($um) ? + PublicInbox::OnDestroy->new(\&CORE::umask, umask($um)) : + undef; +} + sub cidx_run { # main entry point my ($self) = @_; + my $restore_umask = prep_umask($self); local $self->{todo} = []; local $DEFER = $self->{todo}; local $SIGSET = PublicInbox::DS::block_signals(); @@ -800,7 +827,7 @@ sub shard_done_wait { # awaitpid cb via ipc_worker_reap ++$self->{shard_err} if defined($self->{shard_err}); } -sub with_umask { # TODO +sub with_umask { # TODO get rid of this treewide and rely on OnDestroy my ($self, $cb, @arg) = @_; $cb->(@arg); } diff --git a/t/cindex.t b/t/cindex.t index eb66b2e6..9da0ba69 100644 --- a/t/cindex.t +++ b/t/cindex.t @@ -12,9 +12,10 @@ my $pwd = getcwd(); # I reworked CodeSearchIdx->shard_worker to handle empty trees # in the initial commit generated by cvs2svn for xapian.git -create_coderepo 'empty-tree-root', tmpdir => "$tmp/wt0", sub { +create_coderepo 'empty-tree-root-0600', tmpdir => "$tmp/wt0", sub { xsys_e([qw(/bin/sh -c), <<'EOM']); git init -q && +git config core.sharedRepository 0600 tree=$(git mktree