--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-inherit-mode Sat Feb 09 18:38:54 2008 -0200
@@ -0,0 +1,67 @@
+#!/bin/sh
+
+# test that new files created in .hg inherit the permissions from .hg/store
+
+"$TESTDIR/hghave" unix-permissions || exit 80
+
+mkdir dir
+# just in case somebody has a strange $TMPDIR
+chmod g-s dir
+cd dir
+
+cat >printmodes.py <<EOF
+import os, sys
+
+allnames = []
+isdir = {}
+for root, dirs, files in os.walk(sys.argv[1]):
+ for d in dirs:
+ name = os.path.join(root, d)
+ isdir[name] = 1
+ allnames.append(name)
+ for f in files:
+ name = os.path.join(root, f)
+ allnames.append(name)
+allnames.sort()
+for name in allnames:
+ suffix = name in isdir and '/' or ''
+ print '%05o %s%s' % (os.lstat(name).st_mode & 07777, name, suffix)
+EOF
+
+umask 077
+
+hg init repo
+cd repo
+
+chmod 02770 .hg/store
+
+echo '% before commit'
+echo '% store can be written by the group, other files cannot'
+echo '% store is setgid'
+python ../printmodes.py .
+
+mkdir dir
+touch foo dir/bar
+hg ci -qAm 'add files'
+
+echo
+echo '% after commit'
+echo '% working dir files can only be written by the owner'
+echo '% files created in .hg can be written by the group'
+echo '% (in particular, store/**, dirstate, branch.cache)'
+echo '% new directories are setgid'
+python ../printmodes.py .
+
+umask 007
+hg init ../push
+echo
+echo '% before push'
+echo '% group can write everything'
+python ../printmodes.py ../push
+
+umask 077
+hg -q push ../push
+echo
+echo '% after push'
+echo '% group can still write everything'
+python ../printmodes.py ../push
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-inherit-mode.out Sat Feb 09 18:38:54 2008 -0200
@@ -0,0 +1,54 @@
+% before commit
+% store can be written by the group, other files cannot
+% store is setgid
+00700 ./.hg/
+00600 ./.hg/00changelog.i
+00600 ./.hg/requires
+02770 ./.hg/store/
+
+% after commit
+% working dir files can only be written by the owner
+% files created in .hg can be written by the group
+% (in particular, store/**, dirstate, branch.cache)
+% new directories are setgid
+00700 ./.hg/
+00600 ./.hg/00changelog.i
+00660 ./.hg/dirstate
+00600 ./.hg/requires
+02770 ./.hg/store/
+00660 ./.hg/store/00changelog.i
+00660 ./.hg/store/00manifest.i
+02770 ./.hg/store/data/
+02770 ./.hg/store/data/dir/
+00660 ./.hg/store/data/dir/bar.i
+00660 ./.hg/store/data/foo.i
+00600 ./.hg/store/undo
+00660 ./.hg/undo.branch
+00660 ./.hg/undo.dirstate
+00700 ./dir/
+00600 ./dir/bar
+00600 ./foo
+
+% before push
+% group can write everything
+00770 ../push/.hg/
+00660 ../push/.hg/00changelog.i
+00660 ../push/.hg/requires
+00770 ../push/.hg/store/
+
+% after push
+% group can still write everything
+00770 ../push/.hg/
+00660 ../push/.hg/00changelog.i
+00660 ../push/.hg/branch.cache
+00660 ../push/.hg/requires
+00770 ../push/.hg/store/
+00660 ../push/.hg/store/00changelog.i
+00660 ../push/.hg/store/00manifest.i
+00770 ../push/.hg/store/data/
+00770 ../push/.hg/store/data/dir/
+00660 ../push/.hg/store/data/dir/bar.i
+00660 ../push/.hg/store/data/foo.i
+00600 ../push/.hg/store/undo
+00660 ../push/.hg/undo.branch
+00660 ../push/.hg/undo.dirstate