有很多方法可以做到这一点,但在我开始之前,你确定要这样做吗?在钩子中进行阻塞,可能是缓慢的,推送拒绝更改会惹恼人们,并且它一直持有存储库写锁,因此在验证脚本运行时没有其他人可以推送。人们可以很容易地将 DVCS 的一半生产力优势抛到窗外,以试图获得一点控制。
您可以通过两层存储库设置来避免大多数这些缺点。就像project-push
人们可以在没有通过验证的情况下推送的地方,并且project-pull
只有通过一些验证的变更集。然后,您有一个带外(cron 或钩子触发)脚本,仅在确认验证后才将变更集从 移动project-push
到。project-pull
因为该测试是在带外完成的,所以推送不会被阻止,但非验证变更集永远不会进入project-pull
. 当他们的推送project-pull
进入非验证状态时,您可以让它通过电子邮件发送给作者。像这样配置的用户.hg/hgrc
根本不必考虑他们是两个存储库:
[paths]
default=http://host//path/to/project-pull
default-push=http://host//path/to/project-push
他们可以使用hg push
andhg pull
并且事情会“正常工作”。
也就是说,如果您的验证不需要同时访问所有更新的文件,您可以在外部pretxnchangegroup
挂钩中使用类似这样的东西进行测试:
for thefile in $(hg manifest -r tip) ; do
if ! hg cat -r tip $thefile | ./validate_on_file.sh ; then
exit
fi
done
如果您确实需要一次对所有文件进行操作(编译等)并且您不愿意做一个可以让人们快速推送的两个 repo 结构,那么您确实需要一个单独的 repo 进行测试,但是您不必每次都克隆/创建它。像这样的pretxnchangegroup
钩子应该做:
hg push /scratch/long-lived-testrepo ## Warning: may not work,
## if pretxnchangegroup locks the repo and
## blocks this push to testrepo
hg -R /scratch/long-lived-testrepo update
cd /scratch/long-lived-testrepo
./validation.sh