【问题标题】:Mercurial pre-push hook scanning the working copyMercurial pre-push hook 扫描工作副本
【发布时间】:2012-02-16 09:31:42
【问题描述】:

我需要在人们可以推送的存储库上设置一个挂钩,这将运行一些验证(目标是在验证失败时拒绝推送)。我已经设置了一些钩子,可以在成功推送后自动更新,并防止出现多头。

我编写验证脚本(例如运行单元测试的 shell 脚本)没有问题,但它需要在完整的工作副本上运行。

我的问题是,如果我只是将它放在 pretxnchangegroup 挂钩中,它不会对更新的文件进行操作。如果我尝试在钩子中进行 hg update,那么每当验证失败并且推送被回滚时,都会导致存储库损坏。

我当前的解决方案是将存储库克隆到某个临时文件夹并在那里运行实际验证。但我觉得这有点难看,而且只进行更新的就地验证效率较低。这种钩子可以设置吗?

【问题讨论】:

    标签: mercurial mercurial-hook


    【解决方案1】:

    有很多方法可以做到这一点,但在我开始之前,你确定要这样做吗?在钩子中进行阻塞,可能是缓慢的,推送拒绝更改会惹恼人们,并且它一直持有存储库写锁,因此在验证脚本运行时没有其他人可以推送。人们可以很容易地放弃 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 pushhg 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
    

    【讨论】:

    • 感谢有趣的介绍性警告。但是,在这种情况下,项目在人员和验证时间方面仍然相对较小,所以我想尝试一下你的最后一个想法(验证需要所有文件,用于一些静态代码分析)。只有一个问题:万一验证失败,一个简单的“hg rollback”会做(清理临时回购)吗?这会丢弃整个分阶段的变更集吗?
    • 是的,回滚将撤消推或拉。确保使用-R,否则您将回滚接收回购而不是测试回购。
    • 谢谢,它似乎工作得很好。 (但我只是 cd 进入临时存储库而不是使用 -R)。
    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 2015-08-19
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 2018-07-20
    相关资源
    最近更新 更多