# HG changeset patch # User Rafael Villar Burke # Date 1191541973 -7200 # Node ID 6d1bd20ae14d135e2cd18c9ba90e3a13edc4b730 # Parent 041bd297f01eb5ea1fb70625872e2aba7ee1632d Execution bit detection fixes for VFAT on Linux On Linux VFAT execution mode can be modified, but changes don't persist a filesy stem remount. The current test can be trickled by this. We can help with the det ection of VFAT checking whether new files get created with the execution bits on (as usually these partitions are mounted with the exec option, for convenience) . diff --git a/mercurial/util.py b/mercurial/util.py --- a/mercurial/util.py +++ b/mercurial/util.py @@ -851,16 +851,20 @@ def checkexec(path): Requires a directory (like /foo/.hg) """ try: + EXECFLAGS = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH fh, fn = tempfile.mkstemp("", "", path) os.close(fh) m = os.stat(fn).st_mode - os.chmod(fn, m ^ 0111) - r = (os.stat(fn).st_mode != m) + # VFAT on Linux can flip mode but it doesn't persist a FS remount. + # frequently we can detect it if files are created with exec bit on. + new_file_has_exec = m & EXECFLAGS + os.chmod(fn, m ^ EXECFLAGS) + exec_flags_cannot_flip = (os.stat(fn).st_mode == m) os.unlink(fn) except (IOError,OSError): # we don't care, the user probably won't be able to commit anyway return False - return r + return not (new_file_has_exec or exec_flags_cannot_flip) def execfunc(path, fallback): '''return an is_exec() function with default to fallback'''