mercurial/lock.py
author mpm@selenic.com
Wed, 01 Jun 2005 00:25:42 -0800
changeset 209 63af1db35611
parent 161 0b4c5cb953d9
child 422 10c43444a38e
child 429 688d03d6997a
permissions -rw-r--r--
Beginning of new command parsing interface -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Beginning of new command parsing interface This adds commands.py, with a primary interface dispatch(args) Dispatch searches a table of known commands, handles switches, sets up a repo object if appropriate, and dispatches the command. It also handles KeyboardInterrupt and can handle similar exceptions in the future. If the command is unknown, it falls through to the current command handler. Commands currently handled by the new scheme: help, init, and annotate manifest hash: 134cd032c880985e3f92f82efb8b629dd862ba4c -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCnXEGywK+sNU5EO8RAuDAAJ9q7K4w7qGVWv1NWjCPFGO/UJc6VQCdEhMQ sBBlSRzah9QPy8K94catZyg= =wuRf -----END PGP SIGNATURE-----
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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