Execution bit detection fixes for VFAT on Linux
authorRafael Villar Burke <pachi@rvburke.com>
Fri, 05 Oct 2007 01:52:53 +0200
changeset 5420 6d1bd20ae14d
parent 5419 041bd297f01e
child 5421 9b5d626be8ba
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) .
mercurial/util.py
--- a/mercurial/util.py	Wed Sep 12 12:54:36 2007 +0200
+++ b/mercurial/util.py	Fri Oct 05 01:52:53 2007 +0200
@@ -851,16 +851,20 @@
     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'''