在mercurial中使用钩子与包装命令

时间:2010-10-04 18:02:46

标签: mercurial mercurial-hook

使用钩子与使用包装特定任务命令的扩展相比,有什么相对的利弊?

换句话说,决定是使用挂钩还是包装命令的标准是什么?

请列出一种方法是唯一选择的情况。我能想到的一个案例是为现有命令添加新参数。您也可以更改/删除参数,例如我将log默认为log -g,但graphlog在存在一些“不兼容”参数时中止(请参阅graphlog.check_unsupported_flags),所以我在这些情况下添加了log封装器以删除-g,因为强制堕胎是对人类的犯罪。

感觉钩子更干净利落。 Python钩子在hg进程中运行,因此没有性能问题。虽然使用extensions.wrapcommand创建命令包装器很容易,但创建/禁用挂钩以及调整它们的顺序(它们应该首先是自包含的)是微不足道的。

这是来自hgrc doc的引用,它推荐了关于pre / post命令挂钩的标准挂钩,但它也适用于包装器上的挂钩:

  

...类似“commit”的钩子将在生成提交(例如标记)的所有上下文中调用,而不仅仅是提交命令。

另外我猜钩子不受GPL(或者它们是?),而extensions are中的命令包装器。

(我希望1.5k +用户可以创建mercurialhooks代码.Git粉丝男孩用githooks打败了我们。)

1 个答案:

答案 0 :(得分:4)

我不能谈论许可问题,但是钩子和扩展之间的最大区别是钩子可以用任何语言编写,而扩展总是python。

如果一个人在python中写作,那么钩子和扩展之间几乎没有区别:

  • 要么深入研究mercurial internals
  • 都要求用户修改其.hgrc以启用它们
  • 都可以包装/拦截命令

我认为你的日志命令参数修改可以用pre-log钩子完成,除了作为扩展完成。

TL; DR:如果你在python中写作没有什么区别,如果你不是钩子,那么你是唯一的选择。