# HG changeset patch # User Nicolas Dumazet # Date 1283139979 -32400 # Node ID bb69460e9d2dd70205005e2c547da85236d7a22b # Parent 80b0865b3fa5ef895042366587f24d1a1fbfe281 tests: unify test-inherit-mode diff -r 80b0865b3fa5 -r bb69460e9d2d tests/test-inherit-mode --- a/tests/test-inherit-mode Mon Aug 30 12:41:43 2010 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +0,0 @@ -#!/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 <mode.py < /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 - diff -r 80b0865b3fa5 -r bb69460e9d2d tests/test-inherit-mode.out --- a/tests/test-inherit-mode.out Mon Aug 30 12:41:43 2010 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -% before commit -% store can be written by the group, other files cannot -% store is setgid -00700 ./.hg/ -00600 ./.hg/00changelog.i -00600 ./.hg/requires -00770 ./.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 file, undo files) -% new directories are setgid -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 - -% 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/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 diff -r 80b0865b3fa5 -r bb69460e9d2d tests/test-inherit-mode.t --- /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 < 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 < 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