comparison mercurial/posix.py @ 13879:5b0a3f6cbead

util: move checkexec() to posix.py and return False on Windows
author Adrian Buehlmann <adrian@cadifra.com>
date Mon, 04 Apr 2011 11:41:54 +0200
parents 14f3795a5ed7
children 31eb145b50b6
comparison
equal deleted inserted replaced
13878:a8d13ee0ce68 13879:5b0a3f6cbead
5 # This software may be used and distributed according to the terms of the 5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version. 6 # GNU General Public License version 2 or any later version.
7 7
8 from i18n import _ 8 from i18n import _
9 import osutil 9 import osutil
10 import os, sys, errno, stat, getpass, pwd, grp 10 import os, sys, errno, stat, getpass, pwd, grp, tempfile
11 11
12 posixfile = open 12 posixfile = open
13 nulldev = '/dev/null' 13 nulldev = '/dev/null'
14 normpath = os.path.normpath 14 normpath = os.path.normpath
15 samestat = os.path.samestat 15 samestat = os.path.samestat
106 os.chmod(f, s | (s & 0444) >> 2 & ~umask) 106 os.chmod(f, s | (s & 0444) >> 2 & ~umask)
107 elif not x and sx: 107 elif not x and sx:
108 # Turn off all +x bits 108 # Turn off all +x bits
109 os.chmod(f, s & 0666) 109 os.chmod(f, s & 0666)
110 110
111 def checkexec(path):
112 """
113 Check whether the given path is on a filesystem with UNIX-like exec flags
114
115 Requires a directory (like /foo/.hg)
116 """
117
118 # VFAT on some Linux versions can flip mode but it doesn't persist
119 # a FS remount. Frequently we can detect it if files are created
120 # with exec bit on.
121
122 try:
123 EXECFLAGS = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
124 fh, fn = tempfile.mkstemp(dir=path, prefix='hg-checkexec-')
125 try:
126 os.close(fh)
127 m = os.stat(fn).st_mode & 0777
128 new_file_has_exec = m & EXECFLAGS
129 os.chmod(fn, m ^ EXECFLAGS)
130 exec_flags_cannot_flip = ((os.stat(fn).st_mode & 0777) == m)
131 finally:
132 os.unlink(fn)
133 except (IOError, OSError):
134 # we don't care, the user probably won't be able to commit anyway
135 return False
136 return not (new_file_has_exec or exec_flags_cannot_flip)
137
111 def set_binary(fd): 138 def set_binary(fd):
112 pass 139 pass
113 140
114 def pconvert(path): 141 def pconvert(path):
115 return path 142 return path