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

How to get the working directory of the command from an hg hook?

我正在为 Mercurial 开发一个提交挂钩,运行 解决相对路径的问题。

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

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

我的挂钩是使用 C:\clone 作为工作目录调用的,但是 HG_PATS 仅包含 file.txt,没有 subdir\ 前缀。如何获取 hg 命令本身的工作目录?我在文档中找不到执行此操作的方法。

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

如果你使用 pretxncommit 钩子,那么你会得到 $HG_NODE 这是提交 ID,但是此时提交还没有完成,所以你仍然可以 return 1 取消它。

那么你可以使用

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

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

这并不完全是您想要的,但它可能会让您足够接近,让您进行所需的内容检查。

感谢您的回答和评论,但经过更多研究后,我确定没有干净的方法可以通过外部挂钩来完成我想做的事情。我确实实施了我在问题中提到的 CWD hack。代码不多,但相当讨厌,在 Windows 上,它需要通过 tlist.exe 对外部进程 CWD 进行无证访问。它有效,但是..yuck.

正确的做法似乎是写一个 in-process hook (example library at hghooklib)。通常的版本控制警告适用于编写任何扩展,尽管我认为对于我们的钩子来说,hg 的接口足够简单,我们会没事的。

(在我的问题中我提到我不想编写扩展,但我在考虑像 hgeol 这样的完整扩展。具有单个函数入口点的 hook-only 扩展感觉更受限制和简单,这这就是我现在想要的。)