views:

640

answers:

1

Folks, I'm using i**nternal:merge** tool since I'm not a big fan of GUI diff tools. I really like it and the only thing I find a bit confusing and not quite convenient is its behavior for binary file conflicts.

It can't merge binary files and exits which is absolutely correct. However in the directory with the conflicting file "foo" it creates only "foo.orig" file.

Can it at least create "foo.other" as well so I can pick which version of file to use(mine or the pulled one)?

P.S. I asked the same question in Mercurial mailing list but noone replied me for several days, maybe I'll have more luck here :)

+2  A: 

You have already gotten some input to your question on the Mercurial mailing list -- I went ahead and tried making the script suggested in the thread. It's been a long while since I've used Subversion, but I think this simple script does the trick:

#!/bin/sh
cp "$1" "$1.mine"
cp "$2" "$1.base"
cp "$3" "$1.other"
false

The final false command makes the script return a non-zero exit code, signaling to Mercurial that the merge failed. For Windows it looks like this (thanks Pavel):

@copy %1 %1.mine
@copy %2 %1.base
@copy %3 %1.other
exit 1

I saved the Unix version in ~/tmp/m.sh and tried it with no other merge settings configured than

[ui]
merge = ~/tmp/m.sh

I made a repository with two heads, each with a conflicting change to a JPEG file (mg.jpg). I also added a non-conflicting change to a text file (a.txt). Merging gave:

% hg --debug merge
  searching for copies back to rev 1
resolving manifests
 overwrite None partial False
 ancestor 0848c2f8f8f8 local 845b8aa076bd+ remote f611c55aa8ec
 mg.jpg: versions differ -> m
 a.txt: versions differ -> m
preserving a.txt for resolve of a.txt
preserving mg.jpg for resolve of mg.jpg
picked tool '~/tmp/m.sh' for a.txt (binary False symlink False)
merging a.txt
my a.txt@845b8aa076bd+ other a.txt@f611c55aa8ec ancestor a.txt@0848c2f8f8f8
 premerge successful
picked tool '~/tmp/m.sh' for mg.jpg (binary True symlink False)
merging mg.jpg
my mg.jpg@845b8aa076bd+ other mg.jpg@f611c55aa8ec ancestor mg.jpg@0848c2f8f8f8
merging mg.jpg failed!
0 files updated, 1 files merged, 0 files removed, 1 files unresolved
use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to abandon

The nice thing is that the pre-merge could merge a.txt by itself and so no a.txt.* files were created:

% hg stat
M a.txt
M mg.jpg
? mg.jpg.base
? mg.jpg.mine
? mg.jpg.orig
? mg.jpg.other

You can probably fine-tune this script further to suit your needs -- if you do so, then consider adding the information to the Mercurial wiki or at least post your finding on the mailing list.

Martin Geisler
It works just fine and here's the Windows version as well(don't forget to put it into some .bat script):@copy %1 %1.mine@copy %2 %1.base@copy %3 %1.otherexit 1The only thing I find a bit misleading is the naming of files. Itturned out that ".other" is actually ".mine" and vice versa :) So I'drather rewrite this script as follows:@copy %1 %1.other@copy %2 %1.base@copy %3 %1.mineexit 1
pachanga
Ooops, stackoverflow screwed my indenting :(
pachanga
My reply is here - http://markmail.org/message/whucv2g2qmlagjv6
pachanga
I've put your Windows version in the answer to get proper formatting, thanks!
Martin Geisler