# HG changeset patch # User Matt Mackall # Date 1333208671 18000 # Node ID 0e6cee08a2f8287c86c54a00d39dc873a6abe5ab # Parent dabed2cabd5e8bd0ce9204114ffd36c98556b982 tests: make hghave handle exec bit on Linux with vfat [ original upstream message ] diff -r dabed2cabd5e -r 0e6cee08a2f8 tests/hghave --- a/tests/hghave Sat Mar 31 10:44:31 2012 -0500 +++ b/tests/hghave Sat Mar 31 10:44:31 2012 -0500 @@ -4,7 +4,7 @@ prefixed with "no-", the absence of feature is tested. """ import optparse -import os +import os, stat import re import sys import tempfile @@ -64,14 +64,21 @@ return False def has_executablebit(): - fd, path = tempfile.mkstemp(prefix=tempprefix) - os.close(fd) try: - s = os.lstat(path).st_mode - os.chmod(path, s | 0100) - return (os.lstat(path).st_mode & 0100 != 0) - finally: - os.remove(path) + EXECFLAGS = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH + fh, fn = tempfile.mkstemp(dir=".", prefix='hg-checkexec-') + 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 & 0777) == 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) def has_icasefs(): # Stolen from mercurial.util