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:
You should not just run hg incoming
twice 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 full hg pull
.
So save the incoming changesets in a bundle and pull from that instead:
hg incoming --bundle incoming.hg && hg pull --update incoming.hg && echo "Go!"
The hg incoming
command 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 that hg pull
and any following commands aren't executed at all when hg incoming
signals that there is nothing to pull.
Follow up to @Adam
Quotes from hg help incoming
For remote repository, using --bundle avoids downloading the changesets twice if the incoming is followed by a pull.
...
Returns 0 if there are incoming changes, 1 otherwise.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With