mercurial/util.py
changeset 705 574869103985
parent 667 31a9aa890016
parent 704 5ca319a641e1
child 724 1c0c413cccdd
child 725 c6b912f8b5b2
child 737 8db4d406b3d3
child 740 d2422f10c136
--- a/mercurial/util.py	Thu Jul 14 22:37:46 2005 -0800
+++ b/mercurial/util.py	Thu Jul 14 22:56:55 2005 -0800
@@ -5,7 +5,7 @@
 # This software may be used and distributed according to the terms
 # of the GNU General Public License, incorporated herein by reference.
 
-import os
+import os, errno
 
 def unique(g):
     seen = {}
@@ -46,6 +46,29 @@
         os.unlink(dst)
         os.rename(src, dst)
 
+def copytree(src, dst, copyfile):
+    """Copy a directory tree, files are copied using 'copyfile'."""
+    names = os.listdir(src)
+    os.mkdir(dst)
+
+    for name in names:
+        srcname = os.path.join(src, name)
+        dstname = os.path.join(dst, name)
+        if os.path.isdir(srcname):
+            copytree(srcname, dstname, copyfile)
+        elif os.path.isfile(srcname):
+            copyfile(srcname, dstname)
+        else:
+            raise IOError("Not a regular file: %r" % srcname)
+
+def _makelock_file(info, pathname):
+    ld = os.open(pathname, os.O_CREAT | os.O_WRONLY | os.O_EXCL)
+    os.write(ld, info)
+    os.close(ld)
+
+def _readlock_file(pathname):
+    return file(pathname).read()
+
 # Platfor specific varients
 if os.name == 'nt':
     nulldev = 'NUL:'
@@ -59,13 +82,8 @@
     def pconvert(path):
         return path.replace("\\", "/")
 
-    def makelock(info, pathname):
-        ld = os.open(pathname, os.O_CREAT | os.O_WRONLY | os.O_EXCL)
-        os.write(ld, info)
-        os.close(ld)
-
-    def readlock(pathname):
-        return file(pathname).read()
+    makelock = _makelock_file
+    readlock = _readlock_file
 
 else:
     nulldev = '/dev/null'
@@ -90,7 +108,19 @@
         return path
 
     def makelock(info, pathname):
-        os.symlink(info, pathname)
+        try:
+            os.symlink(info, pathname)
+        except OSError, why:
+            if why.errno == errno.EEXIST:
+                raise
+            else:
+                _makelock_file(info, pathname)
 
     def readlock(pathname):
-        return os.readlink(pathname)
+        try:
+            return os.readlink(pathname)
+        except OSError, why:
+            if why.errno == errno.EINVAL:
+                return _readlock_file(pathname)
+            else:
+                raise