merge: allow smarter tool configuration
Add [merge-tool] hgrc section with:
<tool>.executable = name or path (<tool>)
<tool>.args = args with $local/base/other/output ($local $base $other)
<tool>.priority = priority (default 0)
<tool>.binary = handles binary (False)
<tool>.symlink = handles symlinks (False)
<tool>.checkconflict = check for conflict markers (False)
<tool>.premerge = try internal simplemerge (True if not binary or symlink)
Four built-in tools: internal:{merge,local,other,fail}
Add [merge-patterns] section of the form:
<pattern> = <tool>
Priority of settings is:
HGMERGE
merge-patterns
ui:merge
merge-tools by priority
hgmerge, if it can be found
Changes:
unsuccessful merges leave .orig files
#!/bin/sh
HGMERGE=true; export HGMERGE
echo '[extensions]' >> $HGRCPATH
echo 'hgext.graphlog =' >> $HGRCPATH
echo 'hgext.convert =' >> $HGRCPATH
glog()
{
hg glog --template '#rev# "#desc#" files: #files#\n' "$@"
}
hg init source
cd source
echo foo > foo
echo baz > baz
mkdir dir
echo dir/file >> dir/file
echo dir/file2 >> dir/file2
hg ci -d '0 0' -qAm '0: add foo baz dir/'
echo bar > bar
echo quux > quux
hg copy foo copied
hg ci -d '1 0' -qAm '1: add bar quux; copy foo to copied'
echo >> foo
hg ci -d '2 0' -m '2: change foo'
hg up -qC 1
echo >> bar
echo >> quux
hg ci -d '3 0' -m '3: change bar quux'
hg up -qC 2
hg merge -qr 3
echo >> bar
echo >> baz
hg ci -d '4 0' -m '4: first merge; change bar baz'
echo >> bar
echo 1 >> baz
echo >> quux
hg ci -d '5 0' -m '5: change bar baz quux'
hg up -qC 4
echo >> foo
echo 2 >> baz
hg ci -d '6 0' -m '6: change foo baz'
hg up -qC 5
hg merge -qr 6
echo >> bar
hg ci -d '7 0' -m '7: second merge; change bar'
echo >> foo
hg ci -m '8: change foo'
glog
echo '% final file versions in this repo:'
hg manifest --debug
hg debugrename copied
echo
cd ..
splitrepo()
{
msg="$1"
files="$2"
opts=$3
echo "% $files: $msg"
prefix=`echo "$files" | sed -e 's/ /-/g'`
fmap="$prefix.fmap"
repo="$prefix.repo"
for i in $files; do
echo "include $i" >> "$fmap"
done
hg -q convert $opts --filemap "$fmap" --datesort source "$repo"
glog -R "$repo"
hg -R "$repo" manifest --debug
}
splitrepo 'skip unwanted merges; use 1st parent in 1st merge, 2nd in 2nd' foo
splitrepo 'merges are not merges anymore' bar
splitrepo '1st merge is not a merge anymore; 2nd still is' baz
splitrepo 'we add additional merges when they are interesting' 'foo quux'
splitrepo 'partial conversion' 'bar quux' '-r 3'
splitrepo 'complete the partial conversion' 'bar quux'
rm -r foo.repo
splitrepo 'partial conversion' 'foo' '-r 3'
splitrepo 'complete the partial conversion' 'foo'
splitrepo 'copied file; source not included in new repo' copied
hg --cwd copied.repo debugrename copied
splitrepo 'copied file; source included in new repo' 'foo copied'
hg --cwd foo-copied.repo debugrename copied
cat > renames.fmap <<EOF
include dir
exclude dir/file2
rename dir dir2
include foo
include copied
rename foo foo2
rename copied copied2
EOF
hg -q convert --filemap renames.fmap --datesort source renames.repo
glog -R renames.repo
hg -R renames.repo manifest --debug
hg --cwd renames.repo debugrename copied2
echo 'copied:'
hg --cwd source cat copied
echo 'copied2:'
hg --cwd renames.repo cat copied2