annotate mercurial/lock.py @ 1555:01a5121a005a

bash_completion: use hg --debug help to get the list of debug commands. Also, try completing with the debug commands only when there's no other candidates. Based on an idea by TK Soh.
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
date Wed, 23 Nov 2005 08:02:35 +0100
parents abfab59fce79
children 59b3639df0a9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
1 # lock.py - simple locking scheme for mercurial
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
2 #
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
3 # Copyright 2005 Matt Mackall <mpm@selenic.com>
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
4 #
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
5 # This software may be used and distributed according to the terms
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
6 # of the GNU General Public License, incorporated herein by reference.
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
7
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
8 import os, time
422
10c43444a38e [PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents: 161
diff changeset
9 import util
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
10
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
11 class LockHeld(Exception):
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
12 pass
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
13
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
14 class lock:
1530
abfab59fce79 add a releasefn keyword to lock.lock
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1062
diff changeset
15 def __init__(self, file, wait=1, releasefn=None):
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
16 self.f = file
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
17 self.held = 0
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
18 self.wait = wait
1530
abfab59fce79 add a releasefn keyword to lock.lock
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1062
diff changeset
19 self.releasefn = releasefn
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
20 self.lock()
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
21
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
22 def __del__(self):
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
23 self.release()
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
24
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
25 def lock(self):
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
26 while 1:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
27 try:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
28 self.trylock()
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
29 return 1
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
30 except LockHeld, inst:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
31 if self.wait:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
32 time.sleep(1)
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
33 continue
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
34 raise inst
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 503
diff changeset
35
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
36 def trylock(self):
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
37 pid = os.getpid()
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
38 try:
422
10c43444a38e [PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents: 161
diff changeset
39 util.makelock(str(pid), self.f)
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
40 self.held = 1
704
5ca319a641e1 Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 515
diff changeset
41 except (OSError, IOError):
422
10c43444a38e [PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents: 161
diff changeset
42 raise LockHeld(util.readlock(self.f))
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
43
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
44 def release(self):
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
45 if self.held:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
46 self.held = 0
1530
abfab59fce79 add a releasefn keyword to lock.lock
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1062
diff changeset
47 if self.releasefn:
abfab59fce79 add a releasefn keyword to lock.lock
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1062
diff changeset
48 self.releasefn()
503
c6a2e41c8c60 Fix troubles with clone and exception handling
mpm@selenic.com
parents: 429
diff changeset
49 try:
c6a2e41c8c60 Fix troubles with clone and exception handling
mpm@selenic.com
parents: 429
diff changeset
50 os.unlink(self.f)
c6a2e41c8c60 Fix troubles with clone and exception handling
mpm@selenic.com
parents: 429
diff changeset
51 except: pass
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
52