Mercurial hook that operates like 'changegroup', but only on push?

770 views Asked by At

We've built a changeset propagation mechanism, but it relies on bundling and unbundling the new changesets. If we were to use the changegroup hook, then it would cause cyclic behaviors, because the hook is run during a pull, push, or unbundle. What we need is for the sync to be done after a commit, which the commit hook works perfectly for, but also after a push.

Note, the post-push hook is not the answer, as it is run when you push from that repository to another. This scenario calls, basically, for a special behavior of changegroup, only running when the new changesets are a result of a push.

Is there any hook that works that way?

2

There are 2 answers

2
Martin Geisler On BEST ANSWER

Check the source argument to the hook. It will be bundle when you're unbundling a changegroup, serve when the changeset comes in over HTTP(S) or SSH, and push when it comes in via a push done to a repository on the local file system.

You find this argument as the HG_SOURCE environment variable for a hook run as an external process, and as the source keyword argument for an in-process hook.

0
voithos On

For the sake of completeness, here is a script that would work (as per @MartinGeisler's answer). Let's call it pushhook.py:

def pushhook(ui, repo, source=None, **kwargs):
    if source == 'push':
        # Perform push-only operations here

And the hgrc looks like:

[hooks]
changegroup.push = python:.hg/pushhook.py:pushhook