##// END OF EJS Templates
error: move lock errors...
Matt Mackall -
r7640:7197812e default
parent child Browse files
Show More
@@ -63,13 +63,13 b' def _runcatch(ui, args):'
63 commands.help_(ui, 'shortlist')
63 commands.help_(ui, 'shortlist')
64 except error.RepoError, inst:
64 except error.RepoError, inst:
65 ui.warn(_("abort: %s!\n") % inst)
65 ui.warn(_("abort: %s!\n") % inst)
66 except lock.LockHeld, inst:
66 except error.LockHeld, inst:
67 if inst.errno == errno.ETIMEDOUT:
67 if inst.errno == errno.ETIMEDOUT:
68 reason = _('timed out waiting for lock held by %s') % inst.locker
68 reason = _('timed out waiting for lock held by %s') % inst.locker
69 else:
69 else:
70 reason = _('lock held by %s') % inst.locker
70 reason = _('lock held by %s') % inst.locker
71 ui.warn(_("abort: %s: %s\n") % (inst.desc or inst.filename, reason))
71 ui.warn(_("abort: %s: %s\n") % (inst.desc or inst.filename, reason))
72 except lock.LockUnavailable, inst:
72 except error.LockUnavailable, inst:
73 ui.warn(_("abort: could not lock %s: %s\n") %
73 ui.warn(_("abort: could not lock %s: %s\n") %
74 (inst.desc or inst.filename, inst.strerror))
74 (inst.desc or inst.filename, inst.strerror))
75 except error.RevlogError, inst:
75 except error.RevlogError, inst:
@@ -33,3 +33,16 b' class RepoError(Exception):'
33
33
34 class CapabilityError(RepoError):
34 class CapabilityError(RepoError):
35 pass
35 pass
36
37 class LockError(IOError):
38 def __init__(self, errno, strerror, filename, desc):
39 IOError.__init__(self, errno, strerror, filename)
40 self.desc = desc
41
42 class LockHeld(LockError):
43 def __init__(self, errno, filename, desc, locker):
44 LockError.__init__(self, errno, 'Lock held', filename, desc)
45 self.locker = locker
46
47 class LockUnavailable(LockError):
48 pass
@@ -8,7 +8,7 b''
8
8
9 from i18n import _
9 from i18n import _
10 import localrepo, bundlerepo, httprepo, sshrepo, statichttprepo
10 import localrepo, bundlerepo, httprepo, sshrepo, statichttprepo
11 import errno, lock, os, shutil, util, extensions
11 import errno, lock, os, shutil, util, extensions, error
12 import merge as _merge
12 import merge as _merge
13 import verify as _verify
13 import verify as _verify
14
14
@@ -161,7 +161,7 b' def clone(ui, source, dest=None, pull=Fa'
161 # not pointed to by changesets, thus causing verify to
161 # not pointed to by changesets, thus causing verify to
162 # fail
162 # fail
163 src_lock = src_repo.lock()
163 src_lock = src_repo.lock()
164 except lock.LockException:
164 except error.LockError:
165 copy = False
165 copy = False
166
166
167 if copy:
167 if copy:
@@ -637,7 +637,7 b' class localrepository(repo.repository):'
637 def _lock(self, lockname, wait, releasefn, acquirefn, desc):
637 def _lock(self, lockname, wait, releasefn, acquirefn, desc):
638 try:
638 try:
639 l = lock.lock(lockname, 0, releasefn, desc=desc)
639 l = lock.lock(lockname, 0, releasefn, desc=desc)
640 except lock.LockHeld, inst:
640 except error.LockHeld, inst:
641 if not wait:
641 if not wait:
642 raise
642 raise
643 self.ui.warn(_("waiting for lock on %s held by %r\n") %
643 self.ui.warn(_("waiting for lock on %s held by %r\n") %
@@ -1023,7 +1023,7 b' class localrepository(repo.repository):'
1023 wlock = self.wlock(False)
1023 wlock = self.wlock(False)
1024 for f in fixup:
1024 for f in fixup:
1025 self.dirstate.normal(f)
1025 self.dirstate.normal(f)
1026 except lock.LockException:
1026 except lock.LockError:
1027 pass
1027 pass
1028 finally:
1028 finally:
1029 del wlock
1029 del wlock
@@ -5,20 +5,7 b''
5 # This software may be used and distributed according to the terms
5 # This software may be used and distributed according to the terms
6 # of the GNU General Public License, incorporated herein by reference.
6 # of the GNU General Public License, incorporated herein by reference.
7
7
8 import errno, os, socket, time, util
8 import errno, os, socket, time, util, error
9
10 class LockException(IOError):
11 def __init__(self, errno, strerror, filename, desc):
12 IOError.__init__(self, errno, strerror, filename)
13 self.desc = desc
14
15 class LockHeld(LockException):
16 def __init__(self, errno, filename, desc, locker):
17 LockException.__init__(self, errno, 'Lock held', filename, desc)
18 self.locker = locker
19
20 class LockUnavailable(LockException):
21 pass
22
9
23 class lock(object):
10 class lock(object):
24 # lock is symlink on platforms that support it, file on others.
11 # lock is symlink on platforms that support it, file on others.
@@ -48,14 +35,14 b' class lock(object):'
48 try:
35 try:
49 self.trylock()
36 self.trylock()
50 return 1
37 return 1
51 except LockHeld, inst:
38 except error.LockHeld, inst:
52 if timeout != 0:
39 if timeout != 0:
53 time.sleep(1)
40 time.sleep(1)
54 if timeout > 0:
41 if timeout > 0:
55 timeout -= 1
42 timeout -= 1
56 continue
43 continue
57 raise LockHeld(errno.ETIMEDOUT, inst.filename, self.desc,
44 raise error.LockHeld(errno.ETIMEDOUT, inst.filename, self.desc,
58 inst.locker)
45 inst.locker)
59
46
60 def trylock(self):
47 def trylock(self):
61 if lock._host is None:
48 if lock._host is None:
@@ -69,11 +56,11 b' class lock(object):'
69 if why.errno == errno.EEXIST:
56 if why.errno == errno.EEXIST:
70 locker = self.testlock()
57 locker = self.testlock()
71 if locker is not None:
58 if locker is not None:
72 raise LockHeld(errno.EAGAIN, self.f, self.desc,
59 raise error.LockHeld(errno.EAGAIN, self.f, self.desc,
73 locker)
60 locker)
74 else:
61 else:
75 raise LockUnavailable(why.errno, why.strerror,
62 raise error.LockUnavailable(why.errno, why.strerror,
76 why.filename, self.desc)
63 why.filename, self.desc)
77
64
78 def testlock(self):
65 def testlock(self):
79 """return id of locker if lock is valid, else None.
66 """return id of locker if lock is valid, else None.
@@ -106,7 +93,7 b' class lock(object):'
106 l.trylock()
93 l.trylock()
107 os.unlink(self.f)
94 os.unlink(self.f)
108 l.release()
95 l.release()
109 except (LockHeld, LockUnavailable):
96 except error.LockError:
110 return locker
97 return locker
111
98
112 def release(self):
99 def release(self):
@@ -5,7 +5,7 b''
5 # This software may be used and distributed according to the terms
5 # This software may be used and distributed according to the terms
6 # of the GNU General Public License, incorporated herein by reference.
6 # of the GNU General Public License, incorporated herein by reference.
7
7
8 import util, lock
8 import util, error
9 from i18n import _
9 from i18n import _
10
10
11 class StreamException(Exception):
11 class StreamException(Exception):
@@ -51,7 +51,7 b' def stream_out(repo, untrusted=False):'
51 total_bytes += size
51 total_bytes += size
52 finally:
52 finally:
53 del l
53 del l
54 except (lock.LockHeld, lock.LockUnavailable):
54 except error.LockError:
55 raise StreamException(2)
55 raise StreamException(2)
56
56
57 yield '0\n'
57 yield '0\n'
General Comments 0
You need to be logged in to leave comments. Login now