--- a/mercurial/lock.py Sun Mar 26 22:54:05 2006 +0200
+++ b/mercurial/lock.py Tue Mar 28 09:01:07 2006 -0800
@@ -8,10 +8,16 @@
from demandload import *
demandload(globals(), 'errno os socket time util')
-class LockException(Exception):
- pass
+class LockException(IOError):
+ def __init__(self, errno, strerror, filename, desc):
+ IOError.__init__(self, errno, strerror, filename)
+ self.desc = desc
+
class LockHeld(LockException):
- pass
+ def __init__(self, errno, filename, desc, locker):
+ LockException.__init__(self, errno, 'Lock held', filename, desc)
+ self.locker = locker
+
class LockUnavailable(LockException):
pass
@@ -24,7 +30,7 @@
# old-style lock: symlink to pid
# new-style lock: symlink to hostname:pid
- def __init__(self, file, timeout=-1, releasefn=None):
+ def __init__(self, file, timeout=-1, releasefn=None, desc=None):
self.f = file
self.held = 0
self.timeout = timeout
@@ -32,6 +38,7 @@
self.id = None
self.host = None
self.pid = None
+ self.desc = desc
self.lock()
def __del__(self):
@@ -49,7 +56,8 @@
if timeout > 0:
timeout -= 1
continue
- raise inst
+ raise LockHeld(errno.ETIMEDOUT, inst.filename, self.desc,
+ inst.locker)
def trylock(self):
if self.id is None:
@@ -64,9 +72,11 @@
if why.errno == errno.EEXIST:
locker = self.testlock()
if locker:
- raise LockHeld(locker)
+ raise LockHeld(errno.EAGAIN, self.f, self.desc,
+ locker)
else:
- raise LockUnavailable(why)
+ raise LockUnavailable(why.errno, why.strerror,
+ why.filename, self.desc)
def testlock(self):
'''return id of locker if lock is valid, else None.'''