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 |
|
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 |
|
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 |
|
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 |
|
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.LockE |
|
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, |
|
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