我正在尝试编写一个在某些条件下阻止推送的Mercurial钩子,但是为了确定是否阻止推送它需要知道推送将要发送到的存储库。我知道理想情况下,这将在远程存储库端的prechangegroup
挂钩中完成,但在我的情况下这是不可能的 - 请参阅我的earlier question了解原因。 (我喜欢Ry4an的建议,但我必须为一大堆存储库执行此操作,因此为每个存储库创建副本似乎不太可能。)
无论如何,我最初是在一个pre-push
钩子里做这件事,但这只是在非常具体的情况下调用的;特别是,如果用户具有为push
定义的别名,那么我的钩子将不会被调用,这意味着它可能会被无意中绕过。我的下一个想法是preoutgoing
钩子,这绝对是更加万无一失的 - 它可以在推送以外的情况下调用,但这些很容易使用传递的source
参数进行过滤。
但是,preoutgoing
挂钩没有可用的目标存储库;甚至a bug filed就是这样,但它现在对我没什么好处。目前,我正在通过两个钩子来解决这个问题。确定目的地的pre-push
,然后是preoutgoing
实际作用的目的地。当然,pre-push
挂钩可能不会运行,但在这种情况下我只是警告用户他们的推送可能不安全,并让他们选择放弃它。
我有两个问题。首先,有没有更好的方法来实现这一目标?其次,如果没有,可以安全地假设传递给我的两个钩子的repo
对象(它们都在进程中)将是相同的吗?换句话说,如果我做了像
repo.some_custom_property = outgoing_url
在我的pre-push
挂钩中,是否保证随后调用的preoutgoing
挂钩会收到相同的repo
对象,因此可以访问我的自定义属性?我知道我可以通过环境变量或临时文件来做到这一点,但这看起来更好,我不必担心它之后的清理。我也看到this question,但它并没有多大帮助。