view mercurial/lock.py @ 174:23057dc57d1b

hg merge: abort if there are outstanding changes in the working directory We currently don't support merging from the tip into the working directory, so merge with outstanding local changes is asking for trouble.
author mpm@selenic.com
date Thu, 26 May 2005 22:54:48 -0800
parents 0b4c5cb953d9
children 10c43444a38e 688d03d6997a
line wrap: on
line source

# lock.py - simple locking scheme for mercurial
#
# Copyright 2005 Matt Mackall <mpm@selenic.com>
#
# This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference.

import os, time

class LockHeld(Exception):
    pass

class lock:
    def __init__(self, file, wait = 1):
        self.f = file
        self.held = 0
        self.wait = wait
        self.lock()

    def __del__(self):
        self.release()

    def lock(self):
        while 1:
            try:
                self.trylock()
                return 1
            except LockHeld, inst:
                if self.wait:
                    time.sleep(1)
                    continue
                raise inst
        
    def trylock(self):
        pid = os.getpid()
        try:
            os.symlink(str(pid), self.f)
            self.held = 1
        except:
            raise LockHeld(os.readlink(self.f))

    def release(self):
        if self.held:
            self.held = 0
            os.unlink(self.f)