changeset 704:5ca319a641e1

Make makelock and readlock work on filesystems without symlink support. -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Make makelock and readlock work on filesystems without symlink support. This way you can have a repository on a fat partiton, e.g. a USB stick. manifest hash: cea2c120ef2b25a50c5d98b59648f773feefe470 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.1 (GNU/Linux) iD8DBQFC1t5yW7P1GVgWeRoRAsKjAJ9BFcn/EqBK/dmJ4BY1pPIZIbDDJACghN3p VCQS6CJ72MHpzhOOsnOpHzE= =laDT -----END PGP SIGNATURE-----
author Thomas Arendsen Hein <thomas@intevation.de>
date Thu, 14 Jul 2005 22:51:47 +0100
parents fb6f85ecc863
children 574869103985
files mercurial/lock.py mercurial/util.py
diffstat 2 files changed, 26 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/lock.py
+++ b/mercurial/lock.py
@@ -37,7 +37,7 @@ class lock:
         try:
             util.makelock(str(pid), self.f)
             self.held = 1
-        except:
+        except (OSError, IOError):
             raise LockHeld(util.readlock(self.f))
 
     def release(self):
--- a/mercurial/util.py
+++ b/mercurial/util.py
@@ -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 = {}
@@ -61,6 +61,14 @@ def copytree(src, dst, copyfile):
         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:'
@@ -74,13 +82,8 @@ if os.name == 'nt':
     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'
@@ -105,7 +108,19 @@ else:
         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