hg automatic merges with diff3

802 views Asked by At

Consider a Hg project with two central branches/clones - e.g. DEV and PRD. When someone pushes a hotfix to PRD, an automated script on the central server goes to DEV and pulls the new changes. It then tries to merge the hotfix into DEV.

The problem is that the merge tool integrated into Hg is terrible - as soon as there are parallel changes to the same file it will fail. Take the following example:

parent:3,7c
 four
 five
 six

 seven

child1:3,7c
 four
 five5
 six6

 seven7

child2:3,7c
 fourmore
 five
 six
 more
 seven

As you can see, there are no actual conflicts here. If we do the merge locally with kdiff, it solves this simple case without user input!

I'd like a way to get the central server to manage these cases. I thought of using kdiff3 in silent mode, but I can't install kdiff3 on it (it's a CLI only system that we don't even have admin access to), but maybe there is a way to plug diff3 into hg merge so it can resolve simple cases like this? I tried setting "[ui] /n merge = diff3" in the hgrc, but it just spits out the three versions to stdout. Am i missing some additional configuration? Or is there an easier/better tool?

Thanks a lot

1

There are 1 answers

0
Martin Geisler On

To use diff3 as your merge tool, you need to add

[merge-tools]
diff3.args = $local $base $other -m > $output

to your configuration file. You can set the priority if needed, see the wiki. You'll also find more complicated recipes for using diff3 there.

However, I tested how diff3 treats your scenario with edits on adjacent lines, and just like Mercurial, it also refused to merge this cleanly. Different merge tools have different thresholds for what they consider a "conflict" and it seems that KDiff3 is more forgiving than Mercurial and diff3.

I suggest that you let the developer who makes the hotfix on PRD be responsible for merging it into DEV locally where he has access to tools like KDiff3. Automated merging on a server is generally considered to be bad — merges should be verified just a little by a human before you commit them. It's not much extra work after having made the hotfix.