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