Merge branch 'maint' to sync with 1.7.2.2
[gitweb.git] / t / t1301-shared-repo.sh
index 6c78c8bc9b76828c258f524e73b40d7daff7c305..de42d21c922045415abedf3c81163682d0754eb5 100755 (executable)
@@ -7,6 +7,9 @@ test_description='Test shared repository initialization'
 
 . ./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)' '
        mkdir sub && (
@@ -17,6 +20,33 @@ test_expect_success 'shared = 0400 (faulty permission u-w)' '
        test $ret != "0"
 '
 
+modebits () {
+       ls -l "$1" | sed -e 's|^\(..........\).*|\1|'
+}
+
+for u in 002 022
+do
+       test_expect_success POSIXPERM "shared=1 does not clear bits preset by umask $u" '
+               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
+       '
+       rm -rf sub
+done
+
 test_expect_success 'shared=all' '
        mkdir sub &&
        cd sub &&
@@ -24,7 +54,7 @@ test_expect_success 'shared=all' '
        test 2 = $(git config core.sharedrepository)
 '
 
-test_expect_success 'update-server-info honors core.sharedRepository' '
+test_expect_success POSIXPERM 'update-server-info honors core.sharedRepository' '
        : > a1 &&
        git add a1 &&
        test_tick &&
@@ -55,12 +85,11 @@ do
        git config core.sharedrepository "$u" &&
        umask 0277 &&
 
-       test_expect_success "shared = $u ($y) ro" '
+       test_expect_success POSIXPERM "shared = $u ($y) ro" '
 
                rm -f .git/info/refs &&
                git update-server-info &&
-               actual="$(ls -l .git/info/refs)" &&
-               actual=${actual%% *} &&
+               actual="$(modebits .git/info/refs)" &&
                test "x$actual" = "x-$y" || {
                        ls -lt .git/info
                        false
@@ -68,12 +97,11 @@ do
        '
 
        umask 077 &&
-       test_expect_success "shared = $u ($x) rw" '
+       test_expect_success POSIXPERM "shared = $u ($x) rw" '
 
                rm -f .git/info/refs &&
                git update-server-info &&
-               actual="$(ls -l .git/info/refs)" &&
-               actual=${actual%% *} &&
+               actual="$(modebits .git/info/refs)" &&
                test "x$actual" = "x-$x" || {
                        ls -lt .git/info
                        false
@@ -83,7 +111,7 @@ do
 
 done
 
-test_expect_success 'git reflog expire honors core.sharedRepository' '
+test_expect_success POSIXPERM 'git reflog expire honors core.sharedRepository' '
        git config core.sharedRepository group &&
        git reflog expire --all &&
        actual="$(ls -l .git/logs/refs/heads/master)" &&
@@ -98,4 +126,45 @@ test_expect_success 'git reflog expire honors core.sharedRepository' '
        esac
 '
 
+test_expect_success POSIXPERM 'forced modes' '
+       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 &&
+               >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_done