如何从hg钩子获取命令的工作目录?

时间:2015-04-15 10:39:10

标签: mercurial

我正在处理Mercurial的提交挂钩并遇到相对路径问题。

假设我的钩子想要查看正在提交的文件的内容,并警告是否包含短语" xyzzy"。但是,用户决定从子文件夹调用commit并将文件名称作为模式传递...

C:\clone\subdir> hg commit file.txt -m 'test'

使用C:\ clone作为工作目录调用我的钩子,但是HG_PATS只包含没有subdir \前缀的file.txt。如何获取hg命令本身的工作目录?我无法在文档中找到这样做的方法。

我能弄清楚如何获取它的唯一方法是查找进程树以找到第一个hg.exe并获取其工作目录。但这并不完全可以移植到其他操作系统。 (而且我知道我可以写一个扩展名,但我真的想避免这种情况。)

2 个答案:

答案 0 :(得分:1)

如果您使用pretxncommit挂钩,那么您将获得$HG_NODE这是提交ID,但提交尚未最终确定,因此您仍然可以返回1以取消它。

然后你可以使用

hg log -r $HG_NODE --template '{files}' 

获取提交中的文件列表,它为您提供了相对于repo根目录的完整路径。

这不完全是你所追求的,但它可能会让你足够接近,让你做你想要的内容检查。

答案 1 :(得分:0)

感谢您的回答和评论,但经过一些更多的研究后,我确定没有干净的方法从外部钩子做我想做的事情。我确实实现了我在问题中提到的CWD hack。不是很多代码,但非常讨厌,而且在Windows上它需要通过tlist.exe对外部进程CWD进行无证访问。它有效,但是......哎呀。

执行此操作的正确方法似乎是编写in-process hookhghooklib处的示例库)。通常的版本警告适用于编写任何扩展,但我认为对于我们的钩子,hg的界面很简单,我们可以。

(在我的问题中,我提到我并不想写一个扩展,但我正在考虑像hgeol那样的完整扩展。一个只有钩子的扩展,只有一个函数入口点,感觉更加紧凑和简单,这就是我想要的。)