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 | import sys, struct, sha, socket, os, time, re, urllib2 |
|
8 | import sys, struct, sha, socket, os, time, re, urllib2 | |
9 | import urllib |
|
9 | import urllib | |
10 | from mercurial import byterange |
|
10 | from mercurial import byterange, lock | |
11 | from mercurial.transaction import * |
|
11 | from mercurial.transaction import * | |
12 | from mercurial.revlog import * |
|
12 | from mercurial.revlog import * | |
13 | from difflib import SequenceMatcher |
|
13 | from difflib import SequenceMatcher | |
@@ -297,7 +297,17 b' class localrepository:' | |||||
297 | return transaction(self.opener, self.join("journal"), |
|
297 | return transaction(self.opener, self.join("journal"), | |
298 | self.join("undo")) |
|
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 | def commit(self, parent, update = None, text = ""): |
|
309 | def commit(self, parent, update = None, text = ""): | |
|
310 | self.lock() | |||
301 | try: |
|
311 | try: | |
302 | remove = [ l[:-1] for l in self.opener("to-remove") ] |
|
312 | remove = [ l[:-1] for l in self.opener("to-remove") ] | |
303 | os.unlink(self.join("to-remove")) |
|
313 | os.unlink(self.join("to-remove")) | |
@@ -612,6 +622,7 b' class localrepository:' | |||||
612 | yield "".join([l, f, g]) |
|
622 | yield "".join([l, f, g]) | |
613 |
|
623 | |||
614 | def addchangegroup(self, generator): |
|
624 | def addchangegroup(self, generator): | |
|
625 | self.lock() | |||
615 | class genread: |
|
626 | class genread: | |
616 | def __init__(self, generator): |
|
627 | def __init__(self, generator): | |
617 | self.g = generator |
|
628 | self.g = generator |
General Comments 0
You need to be logged in to leave comments.
Login now