view mercurial/lock.py @ 406:d8abb687d501

[PATCH] Using monotone-viz/git-viz with mercurial -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 [PATCH] Using monotone-viz/git-viz with mercurial From: Vincent Danjean <vdanjean.ml@free.fr> monotone-viz is a small GTK+ application that visualizes monotone ancestry graphs. Its home page is: http://oandrieu.nerim.net/monotone-viz/ As monotone and git are similar, the author adapted the 0.9 version to display git ancestry graphs and call it git-viz. I cannot see any link from the homepage, but looking in the archive of git ML, it can be found here: http://oandrieu.nerim.net/monotone-viz/git-viz-0.1.tar.gz I few days ago, I adapted it so that it works with the last versions of git/cogito. Patches and package are available here: http://dept-info.labri.fr/~danjean/deb.html#git-viz Today, I patched hgit so that it respects the output of git-diff-tree, I added git-{diff-tree,cat-file,rev-list,rev-tree} that call hgit (2 lines scripts), and added the script 'hg-viz'. hg-viz create a .git directory and store the SHA1 of the tip in .git/HEAD and then call my git-viz. All these modifications are in the attached patch. I try it in the mercurial repository. After applying the patch, you just have to add the contrib directory in your PATH and call hg-viz. An example of what we can see is on my web page (probably not for a long time) : http://dept-info.labri.fr/~danjean/temp/hg-viz.png Vincent -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCuM50ywK+sNU5EO8RAtlvAJ425JJI9chCdSi8D+R2Af/vJEOUpACffC9e fxjJ3umBkffj5g86jWaRGZ0= =LwA2 -----END PGP SIGNATURE-----
author mpm@selenic.com
date Tue, 21 Jun 2005 18:35:32 -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)