Show More
@@ -0,0 +1,46 b'' | |||
|
1 | # lock.py - simple locking scheme for mercurial | |
|
2 | # | |
|
3 | # Copyright 2005 Matt Mackall <mpm@selenic.com> | |
|
4 | # | |
|
5 | # This software may be used and distributed according to the terms | |
|
6 | # of the GNU General Public License, incorporated herein by reference. | |
|
7 | ||
|
8 | import os, time | |
|
9 | ||
|
10 | class LockHeld(Exception): | |
|
11 | pass | |
|
12 | ||
|
13 | class lock: | |
|
14 | def __init__(self, file, wait = 1): | |
|
15 | self.f = file | |
|
16 | self.held = 0 | |
|
17 | self.wait = wait | |
|
18 | self.lock() | |
|
19 | ||
|
20 | def __del__(self): | |
|
21 | self.release() | |
|
22 | ||
|
23 | def lock(self): | |
|
24 | while 1: | |
|
25 | try: | |
|
26 | self.trylock() | |
|
27 | return 1 | |
|
28 | except LockHeld, inst: | |
|
29 | if self.wait: | |
|
30 | time.sleep(1) | |
|
31 | continue | |
|
32 | raise inst | |
|
33 | ||
|
34 | def trylock(self): | |
|
35 | pid = os.getpid() | |
|
36 | try: | |
|
37 | os.symlink(str(pid), self.f) | |
|
38 | self.held = 1 | |
|
39 | except: | |
|
40 | raise LockHeld(os.readlink(self.f)) | |
|
41 | ||
|
42 | def release(self): | |
|
43 | if self.held: | |
|
44 | self.held = 0 | |
|
45 | os.unlink(self.f) | |
|
46 |
@@ -7,7 +7,7 b'' | |||
|
7 | 7 | |
|
8 | 8 | import sys, struct, sha, socket, os, time, re, urllib2 |
|
9 | 9 | import urllib |
|
10 | from mercurial import byterange | |
|
10 | from mercurial import byterange, lock | |
|
11 | 11 | from mercurial.transaction import * |
|
12 | 12 | from mercurial.revlog import * |
|
13 | 13 | from difflib import SequenceMatcher |
@@ -297,7 +297,17 b' class localrepository:' | |||
|
297 | 297 | return transaction(self.opener, self.join("journal"), |
|
298 | 298 | self.join("undo")) |
|
299 | 299 | |
|
300 | def lock(self, wait = 1): | |
|
301 | try: | |
|
302 | return lock.lock(self.join("lock"), 0) | |
|
303 | except lock.LockHeld, inst: | |
|
304 | if wait: | |
|
305 | self.ui.warn("waiting for lock held by %s\n" % inst.args[0]) | |
|
306 | return lock.lock(self.join("lock"), wait) | |
|
307 | raise inst | |
|
308 | ||
|
300 | 309 | def commit(self, parent, update = None, text = ""): |
|
310 | self.lock() | |
|
301 | 311 | try: |
|
302 | 312 | remove = [ l[:-1] for l in self.opener("to-remove") ] |
|
303 | 313 | os.unlink(self.join("to-remove")) |
@@ -612,6 +622,7 b' class localrepository:' | |||
|
612 | 622 | yield "".join([l, f, g]) |
|
613 | 623 | |
|
614 | 624 | def addchangegroup(self, generator): |
|
625 | self.lock() | |
|
615 | 626 | class genread: |
|
616 | 627 | def __init__(self, generator): |
|
617 | 628 | self.g = generator |
General Comments 0
You need to be logged in to leave comments.
Login now