mercurial/posix.py
changeset 49306 2e726c934fcd
parent 49305 53e9422a9b45
child 49307 6f2a57ba2d13
equal deleted inserted replaced
49305:53e9422a9b45 49306:2e726c934fcd
   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