173 """Copy the file mode from the file at path src to dst. |
173 """Copy the file mode from the file at path src to dst. |
174 If src doesn't exist, we're using mode instead. If mode is None, we're |
174 If src doesn't exist, we're using mode instead. If mode is None, we're |
175 using umask.""" |
175 using umask.""" |
176 try: |
176 try: |
177 st_mode = os.lstat(src).st_mode & 0o777 |
177 st_mode = os.lstat(src).st_mode & 0o777 |
178 except OSError as inst: |
178 except FileNotFoundError: |
179 if inst.errno != errno.ENOENT: |
|
180 raise |
|
181 st_mode = mode |
179 st_mode = mode |
182 if st_mode is None: |
180 if st_mode is None: |
183 st_mode = ~umask |
181 st_mode = ~umask |
184 st_mode &= 0o666 |
182 st_mode &= 0o666 |
185 |
183 |
224 checkisexec = os.path.join(cachedir, b'checkisexec') |
222 checkisexec = os.path.join(cachedir, b'checkisexec') |
225 checknoexec = os.path.join(cachedir, b'checknoexec') |
223 checknoexec = os.path.join(cachedir, b'checknoexec') |
226 |
224 |
227 try: |
225 try: |
228 m = os.stat(checkisexec).st_mode |
226 m = os.stat(checkisexec).st_mode |
229 except OSError as e: |
227 except FileNotFoundError: |
230 if e.errno != errno.ENOENT: |
|
231 raise |
|
232 # checkisexec does not exist - fall through ... |
228 # checkisexec does not exist - fall through ... |
|
229 pass |
233 else: |
230 else: |
234 # checkisexec exists, check if it actually is exec |
231 # checkisexec exists, check if it actually is exec |
235 if m & EXECFLAGS != 0: |
232 if m & EXECFLAGS != 0: |
236 # ensure checkisexec exists, check it isn't exec |
233 # ensure checkisexec exists, check it isn't exec |
237 try: |
234 try: |
238 m = os.stat(checknoexec).st_mode |
235 m = os.stat(checknoexec).st_mode |
239 except OSError as e: |
236 except FileNotFoundError: |
240 if e.errno != errno.ENOENT: |
|
241 raise |
|
242 open(checknoexec, b'w').close() # might fail |
237 open(checknoexec, b'w').close() # might fail |
243 m = os.stat(checknoexec).st_mode |
238 m = os.stat(checknoexec).st_mode |
244 if m & EXECFLAGS == 0: |
239 if m & EXECFLAGS == 0: |
245 # check-exec is exec and check-no-exec is not exec |
240 # check-exec is exec and check-no-exec is not exec |
246 return True |
241 return True |