Mercurial:检查上次提取/更新是否引入了更改

时间:2012-01-19 08:05:44

标签: bash mercurial build dvcs

我是编写更新脚本的过程,该脚本提取了许多存储库的最新版本,并重建了项目。我想让构建有条件,所以我尝试了

hg pull -u && ant clean build

和变化

hg pull; hg update && ant clean build

但是,即使没有任何更改,也始终会调用ant构建。我知道我可以在执行拉动之前使用hg incoming检查更改,但这对我来说是浪费。

如何检查新的更改,而无需联系服务器两次(hg incoming一次,hg pull一次)?

更新:这是我的构建脚本:

update() {
  TIP=$(hg tip --template "{node"})
  hg pull -u
  if test "$TIP" != $(hg tip --template "{node}"); then
    ant clean build
  fi
}

(cd repo1; update )
(cd repo2; update )

对于那些想知道为什么我每次都做一个干净的构建的人来说,有两个原因:

  1. 存储库相互依赖,当其中一个存储库中的API发生变化时,我需要进行完全重建以找到这些API更改中断代码的地方
  2. Java编译器也会从其他类文件中内联常量。现在,当我将类中的常量更改回可以更改的字段时,使用该常量的所有其他类文件仍然不受构建的影响,这可能会导致我想要避免的细微错误。

2 个答案:

答案 0 :(得分:9)

您不应该只运行hg incoming两次,因为它实际上下载所有变更集两次。这是因为您不能只是偷看远程存储库而不运行完整的hg pull

因此,将传入的变更集保存在捆绑中并从中拉出:

hg incoming --bundle incoming.hg && hg pull --update incoming.hg && echo "Go!"

hg incoming命令充当以下命令的保护:&&正在短路,因此返回非零退出代码的第一个命令将使整个构造失败并返回该退出码。这意味着当hg pull表示没有任何内容可以提取时,hg incoming及以下任何命令都不会被执行。

答案 1 :(得分:3)

跟进@Adam

来自hg help incoming

的报价
  

对于远程存储库,使用--bundle可以避免在传入后跟拉动时两次下载变更集。

     

...

     

如果有传入更改,则返回0,否则返回1.