问题
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?
回答1:
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.
回答2:
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
来源:https://stackoverflow.com/questions/8918822/mercurial-hook-that-operates-like-changegroup-but-only-on-push