changeset 5420:6d1bd20ae14d

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) .
author Rafael Villar Burke <pachi@rvburke.com>
date Fri, 05 Oct 2007 01:52:53 +0200
parents 041bd297f01e
children 9b5d626be8ba
files mercurial/util.py
diffstat 1 files changed, 7 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- 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'''