Mercurial > hg
comparison mercurial/util.py @ 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 | 5105b119edd2 |
children | fa836e050c50 |
comparison
equal
deleted
inserted
replaced
5419:041bd297f01e | 5420:6d1bd20ae14d |
---|---|
849 Check whether the given path is on a filesystem with UNIX-like exec flags | 849 Check whether the given path is on a filesystem with UNIX-like exec flags |
850 | 850 |
851 Requires a directory (like /foo/.hg) | 851 Requires a directory (like /foo/.hg) |
852 """ | 852 """ |
853 try: | 853 try: |
854 EXECFLAGS = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH | |
854 fh, fn = tempfile.mkstemp("", "", path) | 855 fh, fn = tempfile.mkstemp("", "", path) |
855 os.close(fh) | 856 os.close(fh) |
856 m = os.stat(fn).st_mode | 857 m = os.stat(fn).st_mode |
857 os.chmod(fn, m ^ 0111) | 858 # VFAT on Linux can flip mode but it doesn't persist a FS remount. |
858 r = (os.stat(fn).st_mode != m) | 859 # frequently we can detect it if files are created with exec bit on. |
860 new_file_has_exec = m & EXECFLAGS | |
861 os.chmod(fn, m ^ EXECFLAGS) | |
862 exec_flags_cannot_flip = (os.stat(fn).st_mode == m) | |
859 os.unlink(fn) | 863 os.unlink(fn) |
860 except (IOError,OSError): | 864 except (IOError,OSError): |
861 # we don't care, the user probably won't be able to commit anyway | 865 # we don't care, the user probably won't be able to commit anyway |
862 return False | 866 return False |
863 return r | 867 return not (new_file_has_exec or exec_flags_cannot_flip) |
864 | 868 |
865 def execfunc(path, fallback): | 869 def execfunc(path, fallback): |
866 '''return an is_exec() function with default to fallback''' | 870 '''return an is_exec() function with default to fallback''' |
867 if checkexec(path): | 871 if checkexec(path): |
868 return lambda x: is_exec(os.path.join(path, x)) | 872 return lambda x: is_exec(os.path.join(path, x)) |