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

在mercurial中使用钩子与包装命令,mercurial,mercurial-hook,Mercurial,Mercurial Hook,使用钩子与使用为特定任务包装命令的扩展相比,有哪些相对的优点和缺点 换句话说,决定是使用钩子还是包装命令的标准是什么 还请列出一种方法是唯一选择的情况。我能想到的一种情况是为现有命令添加新参数。您还可以更改/删除参数,例如,我将默认的log更改为log-g,但是graphlog会在存在一些“不兼容”参数时中止(请参见graphlog.check\u unsupported\u标志),因此在这些情况下,我添加了log包装来删除-g,因为强迫堕胎是危害人类的罪行 感觉钩子更干净。Python钩子在h

使用钩子与使用为特定任务包装命令的扩展相比,有哪些相对的优点和缺点

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

还请列出一种方法是唯一选择的情况。我能想到的一种情况是为现有命令添加新参数。您还可以更改/删除参数,例如,我将默认的
log
更改为
log-g
,但是
graphlog
会在存在一些“不兼容”参数时中止(请参见
graphlog.check\u unsupported\u标志
),因此在这些情况下,我添加了
log
包装来删除
-g
,因为强迫堕胎是危害人类的罪行

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

这里有一段引用,推荐标准钩子优于前/后命令钩子,但它也适用于包装器上的钩子:

。。。像“commit”这样的钩子将在生成commit(例如标记)的所有上下文中被调用,而不仅仅是commit命令

另外,我猜钩子不受GPL的约束(或者它们是否受GPL约束?),而命令包装器则受GPL约束


(我希望1.5k+用户可以创建一个
mercurialhooks
标签。Git粉丝们用
githooks
击败了我们)

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

如果是用python编写的,那么钩子和扩展之间没有什么区别:

  • 两者都可以深入研究反复无常的内部结构
  • 两者都要求用户修改其
    .hgrc
    以启用它们
  • 两者都可以换行/截取命令
我认为您的log命令参数修改除了作为扩展之外,还可以使用
pre-log
hook来完成


TL;DR:如果您是用python编写的,则没有什么区别,如果您不是,则挂钩是您唯一的选择。

重新标记,但稍微更改了名称以符合约定。@Niall:谢谢!我猜git男孩不太关心惯例:)谢谢(对我来说)重要的区别。但是如何删除钩子中的命令参数呢?我尝试了这样一个日志前钩子:
def-prelogHook(ui,repo,**kwargs):print-kwargs
,当我将
log
默认为
log-g
时,它只显示
{args':'log',hooktype':'pre-log'}
。我不确定它们在哪里,但我怀疑有一个通过ui对象指向它们的引用路径。在shell钩子中,您只需检查
$HG\u OPTS
中是否存在不兼容的选项,如果找到了
-g
,然后使用新的参数集重新运行
HG log
命令,然后返回-1。不完全优雅,但完全从外部挂钩实现目标。