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-----
--- a/mercurial/lock.py Thu Jul 14 17:28:19 2005 +0100
+++ b/mercurial/lock.py Thu Jul 14 22:51:47 2005 +0100
@@ -37,7 +37,7 @@
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 Thu Jul 14 17:28:19 2005 +0100
+++ b/mercurial/util.py Thu Jul 14 22:51:47 2005 +0100
@@ -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 @@
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 @@
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 @@
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