annotate mercurial/lock.py @ 222:87484f627422

make pull work for multiple heads -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 make pull work for multiple heads add repository.heads() teach remoterepository and hgweb about heads command teach getchangegroup about multiple heads break apart addchangegroup and merge (cleaning up merge saved for later) after this change, it is now possible to pull and get multiple heads, but not possible to merge the heads manifest hash: 86fe3ede296254698fdd4c97df02944993ef2cbb -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCn8SZywK+sNU5EO8RAkSvAJ9NOA4UZ3cFyyzymlYBZnV+PpGRcACeLL+R PFaSgJHGKvxsXpvPYiZA0O0= =L2Xr -----END PGP SIGNATURE-----
author mpm@selenic.com
date Thu, 02 Jun 2005 18:46:49 -0800
parents 0b4c5cb953d9
children 10c43444a38e 688d03d6997a
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
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
9
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
10 class LockHeld(Exception):
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
11 pass
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
12
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
13 class lock:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
14 def __init__(self, file, wait = 1):
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
15 self.f = file
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
16 self.held = 0
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
17 self.wait = wait
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
18 self.lock()
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
19
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
20 def __del__(self):
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
21 self.release()
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
22
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
23 def lock(self):
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
24 while 1:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
25 try:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
26 self.trylock()
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
27 return 1
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
28 except LockHeld, inst:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
29 if self.wait:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
30 time.sleep(1)
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
31 continue
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
32 raise inst
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
33
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
34 def trylock(self):
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
35 pid = os.getpid()
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
36 try:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
37 os.symlink(str(pid), self.f)
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
38 self.held = 1
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
39 except:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
40 raise LockHeld(os.readlink(self.f))
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
41
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
42 def release(self):
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
43 if self.held:
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
44 self.held = 0
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
45 os.unlink(self.f)
0b4c5cb953d9 Simply repository locking
mpm@selenic.com
parents:
diff changeset
46