util: move copymode into posix.py and windows.py
authorAdrian Buehlmann <adrian@cadifra.com>
Tue, 02 Aug 2011 13:18:56 +0200
changeset 15011 5e44e4b3a0a3
parent 15010 c3114acd8ea2
child 15012 ee766af457ed
util: move copymode into posix.py and windows.py reducing it to a NOP on Windows. This eliminates a pointless stat call on Windows and reduces the risk of interferring with other processes (e.g. AV-scanners, file change watchers). See also http://mercurial.selenic.com/wiki/UnlinkingFilesOnWindows, item 2d
mercurial/posix.py
mercurial/util.py
mercurial/windows.py
--- a/mercurial/posix.py	Tue Aug 02 12:29:48 2011 +0200
+++ b/mercurial/posix.py	Tue Aug 02 13:18:56 2011 +0200
@@ -84,6 +84,21 @@
         # Turn off all +x bits
         os.chmod(f, s & 0666)
 
+def copymode(src, dst, mode=None):
+    '''Copy the file mode from the file at path src to dst.
+    If src doesn't exist, we're using mode instead. If mode is None, we're
+    using umask.'''
+    try:
+        st_mode = os.lstat(src).st_mode & 0777
+    except OSError, inst:
+        if inst.errno != errno.ENOENT:
+            raise
+        st_mode = mode
+        if st_mode is None:
+            st_mode = ~umask
+        st_mode &= 0666
+    os.chmod(dst, st_mode)
+
 def checkexec(path):
     """
     Check whether the given path is on a filesystem with UNIX-like exec flags
--- a/mercurial/util.py	Tue Aug 02 12:29:48 2011 +0200
+++ b/mercurial/util.py	Tue Aug 02 13:18:56 2011 +0200
@@ -27,6 +27,7 @@
 cachestat = platform.cachestat
 checkexec = platform.checkexec
 checklink = platform.checklink
+copymode = platform.copymode
 executablepath = platform.executablepath
 expandglobs = platform.expandglobs
 explainexit = platform.explainexit
@@ -701,21 +702,6 @@
     else:
         return os.name == "nt" or os.environ.get("DISPLAY")
 
-def copymode(src, dst, mode=None):
-    '''Copy the file mode from the file at path src to dst.
-    If src doesn't exist, we're using mode instead. If mode is None, we're
-    using umask.'''
-    try:
-        st_mode = os.lstat(src).st_mode & 0777
-    except OSError, inst:
-        if inst.errno != errno.ENOENT:
-            raise
-        st_mode = mode
-        if st_mode is None:
-            st_mode = ~umask
-        st_mode &= 0666
-    os.chmod(dst, st_mode)
-
 def mktempcopy(name, emptyok=False, createmode=None):
     """Create a temporary file with the same contents from name
 
--- a/mercurial/windows.py	Tue Aug 02 12:29:48 2011 +0200
+++ b/mercurial/windows.py	Tue Aug 02 13:18:56 2011 +0200
@@ -105,6 +105,9 @@
 def setflags(f, l, x):
     pass
 
+def copymode(src, dst, mode=None):
+    pass
+
 def checkexec(path):
     return False