Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mercurial 如何从hg钩子中获取命令的工作目录?_Mercurial - Fatal编程技术网

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

Mercurial 如何从hg钩子中获取命令的工作目录?,mercurial,Mercurial,我正在为Mercurial开发一个提交钩子,并且在相对路径方面遇到了问题 假设我的钩子想要查看正在提交的文件的内容,并警告是否有包含短语“xyzy”的文件。但是,用户已决定从子文件夹调用commit,并以模式形式传入文件名 C:\clone\subdir> hg commit file.txt -m 'test' 我的钩子是用C:\clone作为工作目录调用的,但是HG\u PATS只包含file.txt,没有subdir\prefix。如何获取hg命令本身的工作目录?我在文档中找不到这

我正在为Mercurial开发一个提交钩子,并且在相对路径方面遇到了问题

假设我的钩子想要查看正在提交的文件的内容,并警告是否有包含短语“xyzy”的文件。但是,用户已决定从子文件夹调用commit,并以模式形式传入文件名

C:\clone\subdir> hg commit file.txt -m 'test'
我的钩子是用C:\clone作为工作目录调用的,但是HG\u PATS只包含file.txt,没有subdir\prefix。如何获取hg命令本身的工作目录?我在文档中找不到这样做的方法


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

如果您使用
pretxncommit
钩子,那么您会得到
$HG\u NODE
,它是提交id,但提交在那一点上还没有完成,所以您仍然可以返回1来取消它

那你可以用

hg log -r $HG_NODE --template '{files}' 
获取提交中的文件列表,并提供相对于repo根的完整路径


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

谢谢你的回答和评论,但经过更多的研究,我确定没有干净的方法可以从外部钩子做我想做的事情。我确实实现了我在问题中提到的CWD黑客。代码不是很多,但相当讨厌,在Windows上,它需要通过未记录的方式访问外部进程CWD。它是有效的,但是……恶心

正确的方法似乎是编写一个示例库(位于)。通常的版本控制注意事项适用于编写任何扩展,尽管我认为对于我们的钩子来说,hg的接口足够简单,我们可以


(在我的问题中,我提到我不想写一个扩展,但我想写一个完整的扩展,比如hgeol。一个只有一个函数入口点的hook-only扩展感觉更加约束和简单,这就是我现在想要的。)

问题中的场景稍微简化了一点-钩子还允许用户选择自动修复(如选项卡空间)。我假设这需要预提交,因为散列会改变。啊,我明白了,你想自动进行操作,然后继续提交。我唯一能想到的另一个选择是,在预提交钩子上进行操作,只操作工作目录中所有更改的文件,因为您无法提交特定的文件。是的,这也是一位同事建议的,在我将我的CWD hack从实验状态移走之前,这是我们必须做的。问题是,这种行为可能会让人们非常惊讶(“为什么它会弄乱我没有提交的文件?”),因此我暂时发出警告,提醒用户在指定模式时,钩子仍将应用于所有修改过的文件。这是以前的回答:(当前目录始终是钩子中的存储库根目录)这个钩子是如何编写的,批处理文件,powershell,python?它是perl,但重要的是它是通过[hooks]钩住的,它以repo root作为工作目录启动进程,并且不传递工作目录是什么。