mirror of
https://github.com/git/git.git
synced 2024-12-12 11:24:02 +08:00
8145a8fd02
The TODO comment suggested to heed core.bare from template config file if no command line override given. And the prev_bare_repository variable seems to have been placed for this sole purpose as it is not used anywhere else. However, it was clarified by Junio [1] that such values (including core.bare) are ignored intentionally and does not make sense to propagate them from template config to repository config. Also, the directories for the worktree and repository are already created, and therefore the bare/non-bare decision has already been made, by the point we reach the codepath where the TODO comment is placed. Therefore, prev_bare_repository does not have a usecase with/without supporting core.bare from template. And the removal of prev_bare_repository is safe as proved by the later part of the comment: "Unfortunately, the line above is equivalent to is_bare_repository_cfg = !work_tree; which ignores the config entirely even if no `--[no-]bare` command line option was present. To see why, note that before this function, there was this call: prev_bare_repository = is_bare_repository() expanding the right hand side: = is_bare_repository_cfg && !get_git_work_tree() = is_bare_repository_cfg && !work_tree note that the last simplification above is valid because nothing calls repo_init() or set_git_work_tree() between any of the relevant calls in the code, and thus the !get_git_work_tree() calls will return the same result each time. So, what we are interested in computing is the right hand side of the line of code just above this comment: prev_bare_repository || !work_tree = is_bare_repository_cfg && !work_tree || !work_tree = !work_tree because "A && !B || !B == !B" for all boolean values of A & B." Therefore, remove the TODO comment and remove prev_bare_repository variable. Also, update relevant testcases and remove one redundant testcase. [1]: https://lore.kernel.org/git/xmqqjzonpy9l.fsf@gitster.g/ Helped-by: Elijah Newren <newren@gmail.com> Helped-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Ghanshyam Thakkar <shyamthakkar001@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
215 lines
5.1 KiB
Bash
Executable File
215 lines
5.1 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# Copyright (c) 2007 Johannes Schindelin
|
|
#
|
|
|
|
test_description='Test shared repository initialization'
|
|
|
|
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
|
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
|
|
|
TEST_CREATE_REPO_NO_TEMPLATE=1
|
|
TEST_PASSES_SANITIZE_LEAK=true
|
|
. ./test-lib.sh
|
|
|
|
# Remove a default ACL from the test dir if possible.
|
|
setfacl -k . 2>/dev/null
|
|
|
|
# User must have read permissions to the repo -> failure on --shared=0400
|
|
test_expect_success 'shared = 0400 (faulty permission u-w)' '
|
|
test_when_finished "rm -rf sub" &&
|
|
mkdir sub && (
|
|
cd sub &&
|
|
test_must_fail git init --shared=0400
|
|
)
|
|
'
|
|
|
|
for u in 002 022
|
|
do
|
|
test_expect_success POSIXPERM "shared=1 does not clear bits preset by umask $u" '
|
|
test_when_finished "rm -rf sub" &&
|
|
mkdir sub && (
|
|
cd sub &&
|
|
umask $u &&
|
|
git init --shared=1 &&
|
|
test 1 = "$(git config core.sharedrepository)"
|
|
) &&
|
|
actual=$(ls -l sub/.git/HEAD) &&
|
|
case "$actual" in
|
|
-rw-rw-r--*)
|
|
: happy
|
|
;;
|
|
*)
|
|
echo Oops, .git/HEAD is not 0664 but $actual
|
|
false
|
|
;;
|
|
esac
|
|
'
|
|
done
|
|
|
|
test_expect_success 'shared=all' '
|
|
git init --template= --shared=all &&
|
|
test 2 = $(git config core.sharedrepository)
|
|
'
|
|
|
|
test_expect_success 'template cannot set core.bare' '
|
|
test_when_finished "rm -rf subdir" &&
|
|
test_when_finished "rm -rf templates" &&
|
|
test_config core.bare true &&
|
|
umask 0022 &&
|
|
mkdir -p templates/ &&
|
|
cp .git/config templates/config &&
|
|
git init --template=templates subdir &&
|
|
test_path_is_missing subdir/HEAD
|
|
'
|
|
|
|
test_expect_success POSIXPERM 'update-server-info honors core.sharedRepository' '
|
|
: > a1 &&
|
|
git add a1 &&
|
|
test_tick &&
|
|
git commit -m a1 &&
|
|
mkdir .git/info &&
|
|
umask 0277 &&
|
|
git update-server-info &&
|
|
actual="$(ls -l .git/info/refs)" &&
|
|
case "$actual" in
|
|
-r--r--r--*)
|
|
: happy
|
|
;;
|
|
*)
|
|
echo Oops, .git/info/refs is not 0444
|
|
false
|
|
;;
|
|
esac
|
|
'
|
|
|
|
for u in 0660:rw-rw---- \
|
|
0640:rw-r----- \
|
|
0600:rw------- \
|
|
0666:rw-rw-rw- \
|
|
0664:rw-rw-r--
|
|
do
|
|
x=$(expr "$u" : ".*:\([rw-]*\)") &&
|
|
y=$(echo "$x" | sed -e "s/w/-/g") &&
|
|
u=$(expr "$u" : "\([0-7]*\)") &&
|
|
git config core.sharedrepository "$u" &&
|
|
umask 0277 &&
|
|
|
|
test_expect_success POSIXPERM "shared = $u ($y) ro" '
|
|
|
|
rm -f .git/info/refs &&
|
|
git update-server-info &&
|
|
actual="$(test_modebits .git/info/refs)" &&
|
|
test "x$actual" = "x-$y"
|
|
|
|
'
|
|
|
|
umask 077 &&
|
|
test_expect_success POSIXPERM "shared = $u ($x) rw" '
|
|
|
|
rm -f .git/info/refs &&
|
|
git update-server-info &&
|
|
actual="$(test_modebits .git/info/refs)" &&
|
|
test "x$actual" = "x-$x"
|
|
|
|
'
|
|
|
|
done
|
|
|
|
test_expect_success POSIXPERM 'info/refs respects umask in unshared repo' '
|
|
rm -f .git/info/refs &&
|
|
test_unconfig core.sharedrepository &&
|
|
umask 002 &&
|
|
git update-server-info &&
|
|
echo "-rw-rw-r--" >expect &&
|
|
test_modebits .git/info/refs >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success POSIXPERM 'forced modes' '
|
|
test_when_finished "rm -rf new" &&
|
|
mkdir -p templates/hooks &&
|
|
echo update-server-info >templates/hooks/post-update &&
|
|
chmod +x templates/hooks/post-update &&
|
|
echo : >random-file &&
|
|
mkdir new &&
|
|
(
|
|
cd new &&
|
|
umask 002 &&
|
|
git init --shared=0660 --template=../templates &&
|
|
test_path_is_file .git/hooks/post-update &&
|
|
>frotz &&
|
|
git add frotz &&
|
|
git commit -a -m initial &&
|
|
git repack
|
|
) &&
|
|
# List repository files meant to be protected; note that
|
|
# COMMIT_EDITMSG does not matter---0mode is not about a
|
|
# repository with a work tree.
|
|
find new/.git -type f -name COMMIT_EDITMSG -prune -o -print |
|
|
xargs ls -ld >actual &&
|
|
|
|
# Everything must be unaccessible to others
|
|
test -z "$(sed -e "/^.......---/d" actual)" &&
|
|
|
|
# All directories must have either 2770 or 770
|
|
test -z "$(sed -n -e "/^drwxrw[sx]---/d" -e "/^d/p" actual)" &&
|
|
|
|
# post-update hook must be 0770
|
|
test -z "$(sed -n -e "/post-update/{
|
|
/^-rwxrwx---/d
|
|
p
|
|
}" actual)" &&
|
|
|
|
# All files inside objects must be accessible by us
|
|
test -z "$(sed -n -e "/objects\//{
|
|
/^d/d
|
|
/^-r.-r.----/d
|
|
p
|
|
}" actual)"
|
|
'
|
|
|
|
test_expect_success POSIXPERM 'remote init does not use config from cwd' '
|
|
test_when_finished "rm -rf child.git" &&
|
|
git config core.sharedrepository 0666 &&
|
|
umask 0022 &&
|
|
git init --bare child.git &&
|
|
echo "-rw-r--r--" >expect &&
|
|
test_modebits child.git/config >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success POSIXPERM 're-init respects core.sharedrepository (local)' '
|
|
git config core.sharedrepository 0666 &&
|
|
umask 0022 &&
|
|
echo whatever >templates/foo &&
|
|
git init --template=templates &&
|
|
echo "-rw-rw-rw-" >expect &&
|
|
test_modebits .git/foo >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success POSIXPERM 're-init respects core.sharedrepository (remote)' '
|
|
test_when_finished "rm -rf child.git" &&
|
|
umask 0022 &&
|
|
git init --bare --shared=0666 child.git &&
|
|
test_path_is_missing child.git/foo &&
|
|
git init --bare --template=templates child.git &&
|
|
echo "-rw-rw-rw-" >expect &&
|
|
test_modebits child.git/foo >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success POSIXPERM 'template can set core.sharedrepository' '
|
|
test_when_finished "rm -rf child.git" &&
|
|
umask 0022 &&
|
|
git config core.sharedrepository 0666 &&
|
|
cp .git/config templates/config &&
|
|
git init --bare --template=templates child.git &&
|
|
echo "-rw-rw-rw-" >expect &&
|
|
test_modebits child.git/HEAD >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_done
|