I am the process of writing an update script, which pulls the latest version of a number of repositories, and rebuilds the projects. I wanted to make the build conditional, so I tried
hg pull -u && ant clean build
and the variation
hg pull; hg update && ant clean build
However, the ant build is always invoked, even when nothing has changed. I know that I can use hg incoming to check for changes before doing the pull, but this feels wasteful to me.
How can I check for new changes, without having to contact the server twice (once for hg incoming, once for hg pull)?
UPDATE: This is my build script now:
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 )
And for people wondering why I do a clean build every time, there are two reasons for that:
- The repositories depend on each other, and when the API in one of them changes, I need to do a full rebuild to find places where these API changes break code
- The Java compiler inlines constants, also from other class files. Now, when I change a constant in a class back to a field that can change, all other class files using that constant remain untouched by a build, and this can lead to subtle bugs that I want to avoid.
You should not just run
hg incomingtwice since it will actually download all the changesets twice then. This because you cannot just take a sneak peek at the remote repository without running a fullhg pull.So save the incoming changesets in a bundle and pull from that instead:
The
hg incomingcommand acts as a guard for the following commands: the&&is short-circuiting so the first command that return a non-zero exit code will make the whole construct fail with that exit code. This means thathg pulland any following commands aren’t executed at all whenhg incomingsignals that there is nothing to pull.