我正在编写更新脚本的过程,该脚本提取许多存储库的最新版本,并重建项目。我想使构建有条件,所以我尝试了
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 )
对于那些想知道为什么我每次都做一个干净的构建的人来说,有两个原因:
- 存储库相互依赖,当其中一个存储库中的 API 发生变化时,我需要进行完全重建以找到这些 API 更改破坏代码的位置
- Java 编译器内联常量,也来自其他类文件。现在,当我将类中的常量更改回可以更改的字段时,使用该常量的所有其他类文件都不会受到构建的影响,这可能会导致我想要避免的细微错误。
您不应该只运行两次hg incoming
,因为它实际上会下载所有变更集两次。这是因为您不能在不运行完整hg pull
的情况下先睹为快地看一眼远程存储库。
传入的变更集保存在捆绑包中,然后从中拉取:
hg incoming --bundle incoming.hg && hg pull --update incoming.hg && echo "Go!"
hg incoming
命令充当以下命令的防护: &&
短路,因此返回非零退出代码的第一个命令将使整个构造因该退出代码而失败。这意味着当hg incoming
发出没有要拉取的信号时,根本不会执行hg pull
和任何后续命令。