annotate mercurial/lock.py @ 1205:4003ea658693

Write out hgrc properly. Previously, we simply appended to the hgrc file, which meant that it ended up containing multiple "paths" sections. Now, we only modify "paths.default".
author Bryan O'Sullivan <bos@serpentine.com>
date Sun, 04 Sep 2005 15:47:59 -0700
parents 6d5a62a549fa
children abfab59fce79
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:
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 705
diff changeset
15 def __init__(self, file, wait=1):
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
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
19 self.lock()
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
20
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
21 def __del__(self):
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
22 self.release()
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
23
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
24 def lock(self):
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
25 while 1:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
26 try:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
27 self.trylock()
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
28 return 1
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
29 except LockHeld, inst:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
30 if self.wait:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
31 time.sleep(1)
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
32 continue
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
33 raise inst
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 503
diff changeset
34
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
35 def trylock(self):
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
36 pid = os.getpid()
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
37 try:
422
10c43444a38e [PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents: 161
diff changeset
38 util.makelock(str(pid), self.f)
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
39 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
40 except (OSError, IOError):
422
10c43444a38e [PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents: 161
diff changeset
41 raise LockHeld(util.readlock(self.f))
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
42
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
43 def release(self):
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
44 if self.held:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
45 self.held = 0
503
c6a2e41c8c60 Fix troubles with clone and exception handling
mpm@selenic.com
parents: 429
diff changeset
46 try:
c6a2e41c8c60 Fix troubles with clone and exception handling
mpm@selenic.com
parents: 429
diff changeset
47 os.unlink(self.f)
c6a2e41c8c60 Fix troubles with clone and exception handling
mpm@selenic.com
parents: 429
diff changeset
48 except: pass
161
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
49