Merge branch 'cc/shared-index-permfix'

The split index code did not honor core.sharedrepository setting
correctly.

* cc/shared-index-permfix:
  t1700: make sure split-index respects core.sharedrepository
  t1301: move modebits() to test-lib-functions.sh
  read-cache: use shared perms when writing shared index
This commit is contained in:
Junio C Hamano 2017-07-05 13:32:57 -07:00
commit 8e90578ffb
4 changed files with 50 additions and 11 deletions

View File

@ -2431,6 +2431,14 @@ static int write_shared_index(struct index_state *istate,
delete_tempfile(&temporary_sharedindex); delete_tempfile(&temporary_sharedindex);
return ret; return ret;
} }
ret = adjust_shared_perm(get_tempfile_path(&temporary_sharedindex));
if (ret) {
int save_errno = errno;
error("cannot fix permission bits on %s", get_tempfile_path(&temporary_sharedindex));
delete_tempfile(&temporary_sharedindex);
errno = save_errno;
return ret;
}
ret = rename_tempfile(&temporary_sharedindex, ret = rename_tempfile(&temporary_sharedindex,
git_path("sharedindex.%s", sha1_to_hex(si->base->sha1))); git_path("sharedindex.%s", sha1_to_hex(si->base->sha1)));
if (!ret) { if (!ret) {

View File

@ -19,10 +19,6 @@ test_expect_success 'shared = 0400 (faulty permission u-w)' '
) )
' '
modebits () {
ls -l "$1" | sed -e 's|^\(..........\).*|\1|'
}
for u in 002 022 for u in 002 022
do do
test_expect_success POSIXPERM "shared=1 does not clear bits preset by umask $u" ' test_expect_success POSIXPERM "shared=1 does not clear bits preset by umask $u" '
@ -88,7 +84,7 @@ do
rm -f .git/info/refs && rm -f .git/info/refs &&
git update-server-info && git update-server-info &&
actual="$(modebits .git/info/refs)" && actual="$(test_modebits .git/info/refs)" &&
verbose test "x$actual" = "x-$y" verbose test "x$actual" = "x-$y"
' '
@ -98,7 +94,7 @@ do
rm -f .git/info/refs && rm -f .git/info/refs &&
git update-server-info && git update-server-info &&
actual="$(modebits .git/info/refs)" && actual="$(test_modebits .git/info/refs)" &&
verbose test "x$actual" = "x-$x" verbose test "x$actual" = "x-$x"
' '
@ -111,7 +107,7 @@ test_expect_success POSIXPERM 'info/refs respects umask in unshared repo' '
umask 002 && umask 002 &&
git update-server-info && git update-server-info &&
echo "-rw-rw-r--" >expect && echo "-rw-rw-r--" >expect &&
modebits .git/info/refs >actual && test_modebits .git/info/refs >actual &&
test_cmp expect actual test_cmp expect actual
' '
@ -177,7 +173,7 @@ test_expect_success POSIXPERM 'remote init does not use config from cwd' '
umask 0022 && umask 0022 &&
git init --bare child.git && git init --bare child.git &&
echo "-rw-r--r--" >expect && echo "-rw-r--r--" >expect &&
modebits child.git/config >actual && test_modebits child.git/config >actual &&
test_cmp expect actual test_cmp expect actual
' '
@ -187,7 +183,7 @@ test_expect_success POSIXPERM 're-init respects core.sharedrepository (local)' '
echo whatever >templates/foo && echo whatever >templates/foo &&
git init --template=templates && git init --template=templates &&
echo "-rw-rw-rw-" >expect && echo "-rw-rw-rw-" >expect &&
modebits .git/foo >actual && test_modebits .git/foo >actual &&
test_cmp expect actual test_cmp expect actual
' '
@ -198,7 +194,7 @@ test_expect_success POSIXPERM 're-init respects core.sharedrepository (remote)'
test_path_is_missing child.git/foo && test_path_is_missing child.git/foo &&
git init --bare --template=../templates child.git && git init --bare --template=../templates child.git &&
echo "-rw-rw-rw-" >expect && echo "-rw-rw-rw-" >expect &&
modebits child.git/foo >actual && test_modebits child.git/foo >actual &&
test_cmp expect actual test_cmp expect actual
' '
@ -209,7 +205,7 @@ test_expect_success POSIXPERM 'template can set core.sharedrepository' '
cp .git/config templates/config && cp .git/config templates/config &&
git init --bare --template=../templates child.git && git init --bare --template=../templates child.git &&
echo "-rw-rw-rw-" >expect && echo "-rw-rw-rw-" >expect &&
modebits child.git/HEAD >actual && test_modebits child.git/HEAD >actual &&
test_cmp expect actual test_cmp expect actual
' '

View File

@ -370,4 +370,34 @@ test_expect_success 'check splitIndex.sharedIndexExpire set to "never" and "now"
test $(ls .git/sharedindex.* | wc -l) -le 2 test $(ls .git/sharedindex.* | wc -l) -le 2
' '
while read -r mode modebits
do
test_expect_success POSIXPERM "split index respects core.sharedrepository $mode" '
# Remove existing shared index files
git config core.splitIndex false &&
git update-index --force-remove one &&
rm -f .git/sharedindex.* &&
# Create one new shared index file
git config core.sharedrepository "$mode" &&
git config core.splitIndex true &&
: >one &&
git update-index --add one &&
echo "$modebits" >expect &&
test_modebits .git/index >actual &&
test_cmp expect actual &&
shared=$(ls .git/sharedindex.*) &&
case "$shared" in
*" "*)
# we have more than one???
false ;;
*)
test_modebits "$shared" >actual &&
test_cmp expect actual ;;
esac
'
done <<\EOF
0666 -rw-rw-rw-
0642 -rw-r---w-
EOF
test_done test_done

View File

@ -216,6 +216,11 @@ test_chmod () {
git update-index --add "--chmod=$@" git update-index --add "--chmod=$@"
} }
# Get the modebits from a file.
test_modebits () {
ls -l "$1" | sed -e 's|^\(..........\).*|\1|'
}
# Unset a configuration variable, but don't fail if it doesn't exist. # Unset a configuration variable, but don't fail if it doesn't exist.
test_unconfig () { test_unconfig () {
config_dir= config_dir=