tests/test-inherit-mode.t
changeset 12096 bb69460e9d2d
parent 6301 68cfd7d208a5
child 12743 4c4aeaab2339
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-inherit-mode.t	Mon Aug 30 12:46:19 2010 +0900
@@ -0,0 +1,140 @@
+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
+
+  $ cat >mode.py <<EOF
+  > import sys
+  > import os
+  > print '%05o' % os.lstat(sys.argv[1]).st_mode
+  > EOF
+
+  $ umask 077
+
+  $ hg init repo
+  $ cd repo
+
+  $ chmod 0770 .hg/store
+
+before commit
+store can be written by the group, other files cannot
+store is setgid
+
+  $ python ../printmodes.py .
+  00700 ./.hg/
+  00600 ./.hg/00changelog.i
+  00600 ./.hg/requires
+  00770 ./.hg/store/
+
+  $ mkdir dir
+  $ touch foo dir/bar
+  $ hg ci -qAm 'add files'
+
+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 file, undo files)
+new directories are setgid
+
+  $ python ../printmodes.py .
+  00700 ./.hg/
+  00600 ./.hg/00changelog.i
+  00660 ./.hg/dirstate
+  00660 ./.hg/last-message.txt
+  00600 ./.hg/requires
+  00770 ./.hg/store/
+  00660 ./.hg/store/00changelog.i
+  00660 ./.hg/store/00manifest.i
+  00770 ./.hg/store/data/
+  00770 ./.hg/store/data/dir/
+  00660 ./.hg/store/data/dir/bar.i
+  00660 ./.hg/store/data/foo.i
+  00660 ./.hg/store/fncache
+  00660 ./.hg/store/undo
+  00660 ./.hg/undo.branch
+  00660 ./.hg/undo.desc
+  00660 ./.hg/undo.dirstate
+  00700 ./dir/
+  00600 ./dir/bar
+  00600 ./foo
+
+  $ umask 007
+  $ hg init ../push
+
+before push
+group can write everything
+
+  $ python ../printmodes.py ../push
+  00770 ../push/.hg/
+  00660 ../push/.hg/00changelog.i
+  00660 ../push/.hg/requires
+  00770 ../push/.hg/store/
+
+  $ umask 077
+  $ hg -q push ../push
+
+after push
+group can still write everything
+
+  $ python ../printmodes.py ../push
+  00770 ../push/.hg/
+  00660 ../push/.hg/00changelog.i
+  00660 ../push/.hg/branchheads.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
+  00660 ../push/.hg/store/fncache
+  00660 ../push/.hg/store/undo
+  00660 ../push/.hg/undo.branch
+  00660 ../push/.hg/undo.desc
+  00660 ../push/.hg/undo.dirstate
+
+
+Test that we don't lose the setgid bit when we call chmod.
+Not all systems support setgid directories (e.g. HFS+), so
+just check that directories have the same mode.
+
+  $ cd ..
+  $ hg init setgid
+  $ cd setgid
+  $ chmod g+rwx .hg/store
+  $ chmod g+s .hg/store 2> /dev/null
+  $ mkdir dir
+  $ touch dir/file
+  $ hg ci -qAm 'add dir/file'
+  $ storemode=`python ../mode.py .hg/store`
+  $ dirmode=`python ../mode.py .hg/store/data/dir`
+  $ if [ "$storemode" != "$dirmode" ]; then
+  >  echo "$storemode != $dirmode"
+  $ fi