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-----
This commit is contained in:
Thomas Arendsen Hein 2005-07-14 22:51:47 +01:00
parent 061a741620
commit e78588e43a
2 changed files with 26 additions and 11 deletions

View File

@ -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):

View File

@ -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