# HG changeset patch # User Matt Mackall # Date 1198821340 21600 # Node ID 45fa7b1c5d4c791c19c83377c6bbf972a0acc52c # Parent 2a54e2b177b6a4a143ac618c98c585cab6bc6e78 checkexec: fix VFAT tempfile droppings with more modern Linux kernels More recent Linux kernels don't pretend to allow any bogus chmods on VFAT. diff -r 2a54e2b177b6 -r 45fa7b1c5d4c mercurial/util.py --- a/mercurial/util.py Thu Dec 27 23:55:40 2007 -0600 +++ b/mercurial/util.py Thu Dec 27 23:55:40 2007 -0600 @@ -848,18 +848,23 @@ Requires a directory (like /foo/.hg) """ + + # VFAT on some Linux versions can flip mode but it doesn't persist + # a FS remount. Frequently we can detect it if files are created + # with exec bit on. + 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 - # 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): + try: + os.close(fh) + m = os.stat(fn).st_mode & 0777 + new_file_has_exec = m & EXECFLAGS + os.chmod(fn, m ^ EXECFLAGS) + exec_flags_cannot_flip = (os.stat(fn).st_mode == m) + finally: + os.unlink(fn) + except (IOError, OSError): # we don't care, the user probably won't be able to commit anyway return False return not (new_file_has_exec or exec_flags_cannot_flip)