获取变更组中的更改集列表(Mercurial Python钩子)

3 投票
3 回答
2807 浏览
提问于 2025-04-16 03:36

我想要一个Mercurial的钩子(hook),它可以在所有被修改的文件上运行JSLint、PyChecker等工具。不过,我不能控制所有的hg客户端,所以我希望这个钩子能在推送到主仓库时运行(我可以控制这个仓库),所以在主仓库上使用一个pretxnchangegroup钩子似乎是最合适的。

我该如何获取即将被提交的变更组中所有变更集的列表呢?

我见过其他一些解决方案使用precommit钩子,但这些对我来说不适用,因为客户端可能已经有一个提交是JSLint检查不通过的。在这种情况下,他们应该能够在新的提交中修复这些错误,并且能够成功地将(坏的和新的提交)推送到服务器。服务器只需要检查每个分支上最近的变更集,针对变更组中每个被修改的文件。

3 个回答

0

我的这个回答有没有帮助到你呢?https://stackoverflow.com/a/8615156/1025457

这是一个预交易变更组(pretxnchangegroup)钩子的基本结构,它会遍历变更组中的节点。

3

我刚写了一个叫做pretxnchangegroup的钩子,它正好可以做到这一点。如果你想获取当前变更组中所有已更改的文件,你可以通过这两个命令的输出结果来获取它们的并集:

hg status --rev $HG_NODE:

(注意最后的冒号)

还有

hg status --change $HG_NODE

在同一台机器上的两个仓库之间推送时,第一个命令似乎就足够了,但当推送到远程仓库时,第一个命令会漏掉在变更组中第一个变更集里更改的文件,这时候就需要第二个命令了。

根据http://www.selenic.com/mercurial/hgrc.5.html,"第一个新变更集的ID在$HG_NODE中."

4

你说得对,你需要一个叫做pretxnchangegroup的钩子,但你不需要检查所有的新版本。因为人们会在后续的更改中修复你拒绝的错误,如果你检查所有的更改,他们的工作就永远不会被接受了!

所以,你可以选择检查所有头部的文件,或者使用 hg status --rev x:y 这个命令,来获取你已经有的版本和你正在接收的最新版本之间的更改文件列表,只检查最新版本中的这些文件。

如果你真的想要所有版本的列表,可以使用在1.6版本中新加入的revset( hg help revsets ),但其实你只想检查结果,而不是所有让你到达这个结果的版本。

撰写回答