# HG changeset patch # User Matt Mackall # Date 1202088545 21600 # Node ID 5af5f0f9d7242408055607bd7a50c687eaf1c89c # Parent 7855b88ba838c8092d28c8d0c5eb4c6bdfb6a7ec merge: allow smarter tool configuration Add [merge-tool] hgrc section with: .executable = name or path () .args = args with $local/base/other/output ($local $base $other) .priority = priority (default 0) .binary = handles binary (False) .symlink = handles symlinks (False) .checkconflict = check for conflict markers (False) .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: = 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 diff -r 7855b88ba838 -r 5af5f0f9d724 mercurial/commands.py --- a/mercurial/commands.py Sun Feb 03 19:29:05 2008 -0600 +++ b/mercurial/commands.py Sun Feb 03 19:29:05 2008 -0600 @@ -813,40 +813,6 @@ os.unlink(fa) os.unlink(fd) - # merge helper - ui.status(_("Checking merge helper...\n")) - cmd = (os.environ.get("HGMERGE") or ui.config("ui", "merge") - or "hgmerge") - cmdpath = util.find_exe(cmd) or util.find_exe(cmd.split()[0]) - if not cmdpath: - if cmd == 'hgmerge': - ui.write(_(" No merge helper set and can't find default" - " hgmerge script in PATH\n")) - ui.write(_(" (specify a merge helper in your .hgrc file)\n")) - else: - ui.write(_(" Can't find merge helper '%s' in PATH\n") % cmd) - ui.write(_(" (specify a merge helper in your .hgrc file)\n")) - problems += 1 - else: - # actually attempt a patch here - fa = writetemp("1\n2\n3\n4\n") - fl = writetemp("1\n2\n3\ninsert\n4\n") - fr = writetemp("begin\n1\n2\n3\n4\n") - r = util.system('%s "%s" "%s" "%s"' % (cmd, fl, fa, fr)) - if r: - ui.write(_(" Got unexpected merge error %d!\n") % r) - problems += 1 - m = file(fl).read() - if m != "begin\n1\n2\n3\ninsert\n4\n": - ui.write(_(" Got unexpected merge results!\n")) - ui.write(_(" (your merge helper may have the" - " wrong argument order)\n")) - ui.write(_(" Result: %r\n") % m) - problems += 1 - os.unlink(fa) - os.unlink(fl) - os.unlink(fr) - # editor ui.status(_("Checking commit editor...\n")) editor = ui.geteditor() diff -r 7855b88ba838 -r 5af5f0f9d724 mercurial/filemerge.py --- a/mercurial/filemerge.py Sun Feb 03 19:29:05 2008 -0600 +++ b/mercurial/filemerge.py Sun Feb 03 19:29:05 2008 -0600 @@ -7,7 +7,57 @@ from node import * from i18n import _ -import util, os, tempfile, context +import util, os, tempfile, context, simplemerge, re + +def _toolstr(ui, tool, part, default=None): + return ui.config("merge-tools", tool + "." + part, default) + +def _toolbool(ui, tool, part, default=False): + return ui.configbool("merge-tools", tool + "." + part, default) + +def _findtool(ui, tool): + return util.find_exe(_toolstr(ui, tool, "executable", tool)) + +def _picktool(repo, ui, path, binary, symlink): + def check(tool, pat, symlink, binary): + tmsg = tool + if pat: + tmsg += " specified for " + pat + if pat and not _findtool(ui, tool): # skip search if not matching + ui.warn(_("couldn't find merge tool %s\n") % tmsg) + elif symlink and not _toolbool(ui, tool, "symlink"): + ui.warn(_("tool %s can't handle symlinks\n") % tmsg) + elif binary and not _toolbool(ui, tool, "binary"): + ui.warn(_("tool %s can't handle binary\n") % tmsg) + else: + return True + return False + + # HGMERGE takes precedence + if os.environ.get("HGMERGE"): + return os.environ.get("HGMERGE") + + # then patterns + for pattern, tool in ui.configitems("merge-patterns"): + mf = util.matcher(repo.root, "", [pat], [], [])[1] + if mf(path) and check(tool, pat, symlink, False): + return tool + + # then merge tools + tools = {} + for k,v in ui.configitems("merge-tools"): + t = k.split('.')[0] + if t not in tools: + tools[t] = int(_toolstr(ui, t, "priority", "0")) + tools = [(-p,t) for t,p in tools.items()] + tools.sort() + if ui.config("ui", "merge"): + tools.insert(0, (None, ui.config("ui", "merge"))) # highest priority + tools.append((None, "hgmerge")) # the old default, if found + tools.append((None, "internal:merge")) # internal merge as last resort + for p,t in tools: + if _findtool(ui, t) and check(t, None, symlink, binary): + return t def filemerge(repo, fw, fd, fo, wctx, mctx): """perform a 3-way merge in the working directory @@ -27,38 +77,91 @@ f.close() return name - fcm = wctx.filectx(fw) - fcmdata = wctx.filectx(fd).data() + def isbin(ctx): + try: + return util.binary(ctx.data()) + except IOError: + return False + fco = mctx.filectx(fo) - - if not fco.cmp(fcmdata): # files identical? + if not fco.cmp(wctx.filectx(fd).data()): # files identical? return None - fca = fcm.ancestor(fco) - if not fca: - fca = repo.filectx(fw, fileid=nullrev) + ui = repo.ui + fcm = wctx.filectx(fw) + fca = fcm.ancestor(fco) or repo.filectx(fw, fileid=nullrev) + binary = isbin(fcm) or isbin(fco) or isbin(fca) + symlink = fcm.islink() or fco.islink() + tool = _picktool(repo, ui, fw, binary, symlink) + ui.debug(_("picked tool '%s' for %s (binary %s symlink %s)\n") % + (tool, fw, binary, symlink)) + + if not tool: + tool = "internal:local" + if ui.prompt(_(" no tool found to merge %s\n" + "keep (l)ocal or take (o)ther?") % fw, + _("[lo]"), _("l")) != _("l"): + tool = "internal:other" + if tool == "internal:local": + return 0 + if tool == "internal:other": + repo.wwrite(fd, fco.data(), fco.fileflags()) + return 0 + if tool == "internal:fail": + return 1 + + # do the actual merge a = repo.wjoin(fd) b = temp("base", fca) c = temp("other", fco) + out = "" + back = a + ".orig" + util.copyfile(a, back) if fw != fo: repo.ui.status(_("merging %s and %s\n") % (fw, fo)) else: repo.ui.status(_("merging %s\n") % fw) - repo.ui.debug(_("my %s other %s ancestor %s\n") % (fcm, fco, fca)) - cmd = (os.environ.get("HGMERGE") or repo.ui.config("ui", "merge") - or "hgmerge") - r = util.system('%s "%s" "%s" "%s"' % (cmd, a, b, c), cwd=repo.root, - environ={'HG_FILE': fd, - 'HG_MY_NODE': str(wctx.parents()[0]), - 'HG_OTHER_NODE': str(mctx), - 'HG_MY_ISLINK': fcm.islink(), - 'HG_OTHER_ISLINK': fco.islink(), - 'HG_BASE_ISLINK': fca.islink(),}) + # do we attempt to simplemerge first? + if _toolbool(ui, tool, "premerge", not (binary or symlink)): + r = simplemerge.simplemerge(a, b, c, quiet=True) + if not r: + ui.debug(_(" premerge successful\n")) + os.unlink(back) + os.unlink(b) + os.unlink(c) + return 0 + util.copyfile(back, a) # restore from backup and try again + + env = dict(HG_FILE=fd, + HG_MY_NODE=str(wctx.parents()[0]), + HG_OTHER_NODE=str(mctx), + HG_MY_ISLINK=fcm.islink(), + HG_OTHER_ISLINK=fco.islink(), + HG_BASE_ISLINK=fca.islink()) + + if tool == "internal:merge": + r = simplemerge.simplemerge(a, b, c, label=['local', 'other']) + else: + toolpath = _findtool(ui, tool) + args = _toolstr(ui, tool, "args", '$local $base $other') + if "$output" in args: + out, a = a, back # read input from backup, write to original + replace = dict(local=a, base=b, other=c, output=out) + args = re.sub("\$(local|base|other|output)", + lambda x: '"%s"' % replace[x.group()[1:]], args) + r = util.system(toolpath + ' ' + args, cwd=repo.root, environ=env) + + if not r and _toolbool(ui, tool, "checkconflicts"): + if re.match("^(<<<<<<< .*|=======|>>>>>>> .*)$", fcm.data()): + r = 1 + if r: repo.ui.warn(_("merging %s failed!\n") % fd) + else: + os.unlink(back) os.unlink(b) os.unlink(c) diff -r 7855b88ba838 -r 5af5f0f9d724 tests/run-tests.py --- a/tests/run-tests.py Sun Feb 03 19:29:05 2008 -0600 +++ b/tests/run-tests.py Sun Feb 03 19:29:05 2008 -0600 @@ -420,9 +420,7 @@ HGRCPATH = None os.environ["HGEDITOR"] = sys.executable + ' -c "import sys; sys.exit(0)"' -os.environ["HGMERGE"] = ('python "%s" -L my -L other' - % os.path.join(TESTDIR, os.path.pardir, - 'contrib', 'simplemerge')) +os.environ["HGMERGE"] = "internal:merge" os.environ["HGUSER"] = "test" os.environ["HGENCODING"] = "ascii" os.environ["HGENCODINGMODE"] = "strict" diff -r 7855b88ba838 -r 5af5f0f9d724 tests/test-add.out --- a/tests/test-add.out Sun Feb 03 19:29:05 2008 -0600 +++ b/tests/test-add.out Sun Feb 03 19:29:05 2008 -0600 @@ -13,21 +13,26 @@ % should fail a already tracked! 1 files updated, 0 files merged, 0 files removed, 0 files unresolved +merging a warning: conflicts during merge. -merging a merging a failed! 0 files updated, 0 files merged, 0 files removed, 1 files unresolved There are unresolved merges, you can redo the full merge using: hg update -C 2 hg merge 1 M a +? a.orig % should fail a already tracked! M a +? a.orig % issue683 R a +? a.orig M a +? a.orig c does not exist! d does not exist! M a A c +? a.orig diff -r 7855b88ba838 -r 5af5f0f9d724 tests/test-conflict.out --- a/tests/test-conflict.out Sun Feb 03 19:29:05 2008 -0600 +++ b/tests/test-conflict.out Sun Feb 03 19:29:05 2008 -0600 @@ -1,15 +1,16 @@ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved +merging a warning: conflicts during merge. -merging a merging a failed! 0 files updated, 0 files merged, 0 files removed, 1 files unresolved There are unresolved merges, you can redo the full merge using: hg update -C 2 hg merge 1 e7fe8eb3e180+0d24b7662d3e+ tip -<<<<<<< my +<<<<<<< local something else ======= something >>>>>>> other M a +? a.orig diff -r 7855b88ba838 -r 5af5f0f9d724 tests/test-convert-svn-sink.out --- a/tests/test-convert-svn-sink.out Sun Feb 03 19:29:05 2008 -0600 +++ b/tests/test-convert-svn-sink.out Sun Feb 03 19:29:05 2008 -0600 @@ -260,8 +260,8 @@ adding right-1 adding right-2 3 files updated, 0 files merged, 2 files removed, 0 files unresolved +merging b warning: conflicts during merge. -merging b merging b failed! 2 files updated, 0 files merged, 0 files removed, 1 files unresolved There are unresolved merges, you can redo the full merge using: diff -r 7855b88ba838 -r 5af5f0f9d724 tests/test-copy-move-merge.out --- a/tests/test-copy-move-merge.out Sun Feb 03 19:29:05 2008 -0600 +++ b/tests/test-copy-move-merge.out Sun Feb 03 19:29:05 2008 -0600 @@ -14,11 +14,15 @@ a: remote moved to b -> m copying a to b copying a to c +picked tool 'internal:merge' for a (binary False symlink False) merging a and b my a@fb3948d97f07+ other b@40da226db0f0 ancestor a@583c7b748052 + premerge successful removing a +picked tool 'internal:merge' for a (binary False symlink False) merging a and c my a@fb3948d97f07+ other c@40da226db0f0 ancestor a@583c7b748052 + premerge successful 0 files updated, 2 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) -- b -- diff -r 7855b88ba838 -r 5af5f0f9d724 tests/test-double-merge.out --- a/tests/test-double-merge.out Sun Feb 03 19:29:05 2008 -0600 +++ b/tests/test-double-merge.out Sun Feb 03 19:29:05 2008 -0600 @@ -10,10 +10,14 @@ foo: versions differ -> m foo: remote copied to bar -> m copying foo to bar +picked tool 'internal:merge' for foo (binary False symlink False) merging foo and bar my foo@2092631ce82b+ other bar@7731dad1c2b9 ancestor foo@310fd17130da + premerge successful +picked tool 'internal:merge' for foo (binary False symlink False) merging foo my foo@2092631ce82b+ other foo@7731dad1c2b9 ancestor foo@310fd17130da + premerge successful 0 files updated, 2 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) -- foo -- diff -r 7855b88ba838 -r 5af5f0f9d724 tests/test-install.out --- a/tests/test-install.out Sun Feb 03 19:29:05 2008 -0600 +++ b/tests/test-install.out Sun Feb 03 19:29:05 2008 -0600 @@ -2,7 +2,6 @@ Checking extensions... Checking templates... Checking patch... -Checking merge helper... Checking commit editor... Checking username... No problems detected diff -r 7855b88ba838 -r 5af5f0f9d724 tests/test-issue672.out --- a/tests/test-issue672.out Sun Feb 03 19:29:05 2008 -0600 +++ b/tests/test-issue672.out Sun Feb 03 19:29:05 2008 -0600 @@ -28,8 +28,10 @@ 1a -> 1 * checking for directory renames 1a: local moved to 1 -> m +picked tool 'internal:merge' for 1a (binary False symlink False) merging 1a and 1 my 1a@ac7575e3c052+ other 1@746e9549ea96 ancestor 1@81f4b099af3d + premerge successful 0 files updated, 1 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) 1 files updated, 0 files merged, 1 files removed, 0 files unresolved @@ -44,8 +46,10 @@ checking for directory renames 1: remote moved to 1a -> m copying 1 to 1a +picked tool 'internal:merge' for 1 (binary False symlink False) merging 1 and 1a my 1@746e9549ea96+ other 1a@ac7575e3c052 ancestor 1@81f4b099af3d + premerge successful removing 1 0 files updated, 1 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) diff -r 7855b88ba838 -r 5af5f0f9d724 tests/test-merge-commit.out --- a/tests/test-merge-commit.out Sun Feb 03 19:29:05 2008 -0600 +++ b/tests/test-merge-commit.out Sun Feb 03 19:29:05 2008 -0600 @@ -25,8 +25,10 @@ ancestor 0a3ab4856510 local 2d2f9a22c82b+ remote 7d3b554bfdf1 searching for copies back to rev 1 bar: versions differ -> m +picked tool 'internal:merge' for bar (binary False symlink False) merging bar my bar@2d2f9a22c82b+ other bar@7d3b554bfdf1 ancestor bar@0a3ab4856510 + premerge successful 0 files updated, 1 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) % contents of bar should be line1 line2 @@ -71,8 +73,10 @@ ancestor 0a3ab4856510 local 2d2f9a22c82b+ remote 96ab80c60897 searching for copies back to rev 1 bar: versions differ -> m +picked tool 'internal:merge' for bar (binary False symlink False) merging bar my bar@2d2f9a22c82b+ other bar@96ab80c60897 ancestor bar@0a3ab4856510 + premerge successful 0 files updated, 1 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) % contents of bar should be line1 line2 diff -r 7855b88ba838 -r 5af5f0f9d724 tests/test-merge-local.out --- a/tests/test-merge-local.out Sun Feb 03 19:29:05 2008 -0600 +++ b/tests/test-merge-local.out Sun Feb 03 19:29:05 2008 -0600 @@ -18,27 +18,28 @@ M zzz2_merge_bad # local merge with bad merge tool merging zzz1_merge_ok -merging zzz1_merge_ok failed! merging zzz2_merge_bad merging zzz2_merge_bad failed! -3 files updated, 0 files merged, 2 files removed, 2 files unresolved +3 files updated, 1 files merged, 2 files removed, 1 files unresolved There are unresolved merges with locally modified files. -You can redo the full merge using: +You can finish the partial merge using: hg update 0 hg update 1 2 files updated, 0 files merged, 3 files removed, 0 files unresolved --- a/zzz1_merge_ok +++ b/zzz1_merge_ok ++new first line +new last line --- a/zzz2_merge_bad +++ b/zzz2_merge_bad +another last line M zzz1_merge_ok M zzz2_merge_bad +? zzz2_merge_bad.orig # local merge with conflicts -warning: conflicts during merge. merging zzz1_merge_ok merging zzz2_merge_bad +warning: conflicts during merge. merging zzz2_merge_bad failed! 3 files updated, 1 files merged, 2 files removed, 1 files unresolved There are unresolved merges with locally modified files. @@ -57,6 +58,7 @@ +new last line M zzz1_merge_ok M zzz2_merge_bad +? zzz2_merge_bad.orig # local merge without conflicts merging zzz1_merge_ok 4 files updated, 1 files merged, 2 files removed, 0 files unresolved diff -r 7855b88ba838 -r 5af5f0f9d724 tests/test-merge-revert2.out --- a/tests/test-merge-revert2.out Sun Feb 03 19:29:05 2008 -0600 +++ b/tests/test-merge-revert2.out Sun Feb 03 19:29:05 2008 -0600 @@ -9,8 +9,8 @@ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved f248da0d4c3e tip 1 files updated, 0 files merged, 0 files removed, 0 files unresolved +merging file1 warning: conflicts during merge. -merging file1 merging file1 failed! 0 files updated, 0 files merged, 0 files removed, 1 files unresolved There are unresolved merges with locally modified files. @@ -23,15 +23,19 @@ @@ -1,3 +1,7 @@ added file1 another line of text -+<<<<<<< my ++<<<<<<< local +changed file1 different +======= changed file1 +>>>>>>> other M file1 +? file1.orig f248da0d4c3e+ tip reverting file1 +? file1.orig f248da0d4c3e tip +? file1.orig f248da0d4c3e tip 0 files updated, 0 files merged, 0 files removed, 0 files unresolved +? file1.orig f248da0d4c3e tip diff -r 7855b88ba838 -r 5af5f0f9d724 tests/test-merge7.out --- a/tests/test-merge7.out Sun Feb 03 19:29:05 2008 -0600 +++ b/tests/test-merge7.out Sun Feb 03 19:29:05 2008 -0600 @@ -6,8 +6,8 @@ adding file changes added 1 changesets with 1 changes to 1 files (+1 heads) (run 'hg heads' to see heads, 'hg merge' to merge) +merging test.txt warning: conflicts during merge. -merging test.txt merging test.txt failed! 0 files updated, 0 files merged, 0 files removed, 1 files unresolved There are unresolved merges, you can redo the full merge using: @@ -20,21 +20,22 @@ adding file changes added 1 changesets with 1 changes to 1 files (+1 heads) (run 'hg heads' to see heads, 'hg merge' to merge) -warning: conflicts during merge. resolving manifests overwrite None partial False ancestor faaea63e63a9 local 451c744aabcc+ remote a070d41e8360 searching for copies back to rev 1 test.txt: versions differ -> m +picked tool 'internal:merge' for test.txt (binary False symlink False) merging test.txt my test.txt@451c744aabcc+ other test.txt@a070d41e8360 ancestor test.txt@faaea63e63a9 +warning: conflicts during merge. merging test.txt failed! 0 files updated, 0 files merged, 0 files removed, 1 files unresolved There are unresolved merges, you can redo the full merge using: hg update -C 3 hg merge 4 one -<<<<<<< my +<<<<<<< local two-point-five ======= two-point-one diff -r 7855b88ba838 -r 5af5f0f9d724 tests/test-merge9.out --- a/tests/test-merge9.out Sun Feb 03 19:29:05 2008 -0600 +++ b/tests/test-merge9.out Sun Feb 03 19:29:05 2008 -0600 @@ -5,8 +5,7 @@ merging bar merging bar failed! merging foo and baz -merging baz failed! -1 files updated, 0 files merged, 0 files removed, 2 files unresolved +1 files updated, 1 files merged, 0 files removed, 1 files unresolved There are unresolved merges, you can redo the full merge using: hg update -C 2 hg merge 1 @@ -14,8 +13,7 @@ merging bar merging bar failed! merging baz and foo -merging baz failed! -1 files updated, 0 files merged, 0 files removed, 2 files unresolved +1 files updated, 1 files merged, 0 files removed, 1 files unresolved There are unresolved merges, you can redo the full merge using: hg update -C 1 hg merge 2 diff -r 7855b88ba838 -r 5af5f0f9d724 tests/test-rename-merge1.out --- a/tests/test-rename-merge1.out Sun Feb 03 19:29:05 2008 -0600 +++ b/tests/test-rename-merge1.out Sun Feb 03 19:29:05 2008 -0600 @@ -19,8 +19,10 @@ a: remote moved to b -> m b2: remote created -> g copying a to b +picked tool 'internal:merge' for a (binary False symlink False) merging a and b my a@f26ec4fc3fa3+ other b@8e765a822af2 ancestor a@af1939970a1c + premerge successful removing a warning: detected divergent renames of a2 to: c2 diff -r 7855b88ba838 -r 5af5f0f9d724 tests/test-rename-merge2.out --- a/tests/test-rename-merge2.out Sun Feb 03 19:29:05 2008 -0600 +++ b/tests/test-rename-merge2.out Sun Feb 03 19:29:05 2008 -0600 @@ -13,8 +13,11 @@ rev: versions differ -> m a: remote copied to b -> m copying a to b +picked tool 'python ../merge' for a (binary False symlink False) merging a and b my a@e300d1c794ec+ other b@735846fee2d7 ancestor a@924404dff337 + premerge successful +picked tool 'python ../merge' for rev (binary False symlink False) merging rev my rev@e300d1c794ec+ other rev@735846fee2d7 ancestor rev@924404dff337 0 files updated, 2 files merged, 0 files removed, 0 files unresolved @@ -41,8 +44,11 @@ b: local copied to a -> m rev: versions differ -> m getting a +picked tool 'python ../merge' for b (binary False symlink False) merging b and a my b@ac809aeed39a+ other a@f4db7e329e71 ancestor a@924404dff337 + premerge successful +picked tool 'python ../merge' for rev (binary False symlink False) merging rev my rev@ac809aeed39a+ other rev@f4db7e329e71 ancestor rev@924404dff337 1 files updated, 2 files merged, 0 files removed, 0 files unresolved @@ -68,9 +74,12 @@ rev: versions differ -> m a: remote moved to b -> m copying a to b +picked tool 'python ../merge' for a (binary False symlink False) merging a and b my a@e300d1c794ec+ other b@e03727d2d66b ancestor a@924404dff337 + premerge successful removing a +picked tool 'python ../merge' for rev (binary False symlink False) merging rev my rev@e300d1c794ec+ other rev@e03727d2d66b ancestor rev@924404dff337 0 files updated, 2 files merged, 0 files removed, 0 files unresolved @@ -94,8 +103,11 @@ checking for directory renames b: local moved to a -> m rev: versions differ -> m +picked tool 'python ../merge' for b (binary False symlink False) merging b and a my b@ecf3cb2a4219+ other a@f4db7e329e71 ancestor a@924404dff337 + premerge successful +picked tool 'python ../merge' for rev (binary False symlink False) merging rev my rev@ecf3cb2a4219+ other rev@f4db7e329e71 ancestor rev@924404dff337 0 files updated, 2 files merged, 0 files removed, 0 files unresolved @@ -120,6 +132,7 @@ rev: versions differ -> m b: remote created -> g getting b +picked tool 'python ../merge' for rev (binary False symlink False) merging rev my rev@94b33a1b7f2d+ other rev@735846fee2d7 ancestor rev@924404dff337 1 files updated, 1 files merged, 0 files removed, 0 files unresolved @@ -142,6 +155,7 @@ b -> a checking for directory renames rev: versions differ -> m +picked tool 'python ../merge' for rev (binary False symlink False) merging rev my rev@ac809aeed39a+ other rev@97c705ade336 ancestor rev@924404dff337 0 files updated, 1 files merged, 0 files removed, 0 files unresolved @@ -168,6 +182,7 @@ b: remote created -> g removing a getting b +picked tool 'python ../merge' for rev (binary False symlink False) merging rev my rev@94b33a1b7f2d+ other rev@e03727d2d66b ancestor rev@924404dff337 1 files updated, 1 files merged, 1 files removed, 0 files unresolved @@ -189,6 +204,7 @@ b -> a checking for directory renames rev: versions differ -> m +picked tool 'python ../merge' for rev (binary False symlink False) merging rev my rev@ecf3cb2a4219+ other rev@97c705ade336 ancestor rev@924404dff337 0 files updated, 1 files merged, 0 files removed, 0 files unresolved @@ -206,8 +222,10 @@ searching for copies back to rev 1 b: versions differ -> m rev: versions differ -> m +picked tool 'python ../merge' for b (binary False symlink False) merging b my b@ec03c2ca8642+ other b@79cc6877a3b7 ancestor a@924404dff337 +picked tool 'python ../merge' for rev (binary False symlink False) merging rev my rev@ec03c2ca8642+ other rev@79cc6877a3b7 ancestor rev@924404dff337 0 files updated, 2 files merged, 0 files removed, 0 files unresolved @@ -238,6 +256,7 @@ b c getting c +picked tool 'python ../merge' for rev (binary False symlink False) merging rev my rev@ecf3cb2a4219+ other rev@e6abcc1a30c2 ancestor rev@924404dff337 1 files updated, 1 files merged, 0 files removed, 0 files unresolved @@ -256,8 +275,10 @@ searching for copies back to rev 1 b: versions differ -> m rev: versions differ -> m +picked tool 'python ../merge' for b (binary False symlink False) merging b my b@ac809aeed39a+ other b@af30c7647fc7 ancestor b@000000000000 +picked tool 'python ../merge' for rev (binary False symlink False) merging rev my rev@ac809aeed39a+ other rev@af30c7647fc7 ancestor rev@924404dff337 0 files updated, 2 files merged, 0 files removed, 0 files unresolved @@ -278,8 +299,10 @@ b: versions differ -> m rev: versions differ -> m removing a +picked tool 'python ../merge' for b (binary False symlink False) merging b my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000 +picked tool 'python ../merge' for rev (binary False symlink False) merging rev my rev@59318016310c+ other rev@e03727d2d66b ancestor rev@924404dff337 0 files updated, 2 files merged, 1 files removed, 0 files unresolved @@ -299,8 +322,10 @@ b: versions differ -> m rev: versions differ -> m getting a +picked tool 'python ../merge' for b (binary False symlink False) merging b my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000 +picked tool 'python ../merge' for rev (binary False symlink False) merging rev my rev@ac809aeed39a+ other rev@8dbce441892a ancestor rev@924404dff337 1 files updated, 2 files merged, 0 files removed, 0 files unresolved @@ -321,8 +346,10 @@ b: versions differ -> m rev: versions differ -> m removing a +picked tool 'python ../merge' for b (binary False symlink False) merging b my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000 +picked tool 'python ../merge' for rev (binary False symlink False) merging rev my rev@59318016310c+ other rev@e03727d2d66b ancestor rev@924404dff337 0 files updated, 2 files merged, 1 files removed, 0 files unresolved @@ -342,8 +369,10 @@ b: versions differ -> m rev: versions differ -> m getting a +picked tool 'python ../merge' for b (binary False symlink False) merging b my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000 +picked tool 'python ../merge' for rev (binary False symlink False) merging rev my rev@ac809aeed39a+ other rev@8dbce441892a ancestor rev@924404dff337 1 files updated, 2 files merged, 0 files removed, 0 files unresolved @@ -362,8 +391,10 @@ searching for copies back to rev 1 b: versions differ -> m rev: versions differ -> m +picked tool 'python ../merge' for b (binary False symlink False) merging b my b@0b76e65c8289+ other b@735846fee2d7 ancestor b@000000000000 +picked tool 'python ../merge' for rev (binary False symlink False) merging rev my rev@0b76e65c8289+ other rev@735846fee2d7 ancestor rev@924404dff337 0 files updated, 2 files merged, 0 files removed, 0 files unresolved @@ -384,8 +415,10 @@ rev: versions differ -> m a: prompt recreating -> g getting a +picked tool 'python ../merge' for b (binary False symlink False) merging b my b@ecf3cb2a4219+ other b@8dbce441892a ancestor b@000000000000 +picked tool 'python ../merge' for rev (binary False symlink False) merging rev my rev@ecf3cb2a4219+ other rev@8dbce441892a ancestor rev@924404dff337 1 files updated, 2 files merged, 0 files removed, 0 files unresolved @@ -404,8 +437,10 @@ searching for copies back to rev 1 b: versions differ -> m rev: versions differ -> m +picked tool 'python ../merge' for b (binary False symlink False) merging b my b@0b76e65c8289+ other b@e03727d2d66b ancestor b@000000000000 +picked tool 'python ../merge' for rev (binary False symlink False) merging rev my rev@0b76e65c8289+ other rev@e03727d2d66b ancestor rev@924404dff337 0 files updated, 2 files merged, 0 files removed, 0 files unresolved @@ -430,9 +465,11 @@ rev: versions differ -> m a: remote moved to b -> m copying a to b +picked tool 'python ../merge' for a (binary False symlink False) merging a and b my a@e300d1c794ec+ other b@79cc6877a3b7 ancestor a@924404dff337 removing a +picked tool 'python ../merge' for rev (binary False symlink False) merging rev my rev@e300d1c794ec+ other rev@79cc6877a3b7 ancestor rev@924404dff337 0 files updated, 2 files merged, 0 files removed, 0 files unresolved @@ -456,8 +493,10 @@ checking for directory renames b: local moved to a -> m rev: versions differ -> m +picked tool 'python ../merge' for b (binary False symlink False) merging b and a my b@ec03c2ca8642+ other a@f4db7e329e71 ancestor a@924404dff337 +picked tool 'python ../merge' for rev (binary False symlink False) merging rev my rev@ec03c2ca8642+ other rev@f4db7e329e71 ancestor rev@924404dff337 0 files updated, 2 files merged, 0 files removed, 0 files unresolved @@ -484,9 +523,12 @@ b: local moved to a -> m rev: versions differ -> m c: remote created -> g +picked tool 'python ../merge' for b (binary False symlink False) merging b and a my b@ecf3cb2a4219+ other a@2b958612230f ancestor a@924404dff337 + premerge successful getting c +picked tool 'python ../merge' for rev (binary False symlink False) merging rev my rev@ecf3cb2a4219+ other rev@2b958612230f ancestor rev@924404dff337 1 files updated, 2 files merged, 0 files removed, 0 files unresolved diff -r 7855b88ba838 -r 5af5f0f9d724 tests/test-up-local-change.out --- a/tests/test-up-local-change.out Sun Feb 03 19:29:05 2008 -0600 +++ b/tests/test-up-local-change.out Sun Feb 03 19:29:05 2008 -0600 @@ -22,6 +22,7 @@ b a: versions differ -> m b: remote created -> g +picked tool 'true' for a (binary False symlink False) merging a my a@33aaa84a386b+ other a@802f095af299 ancestor a@33aaa84a386b getting b @@ -58,6 +59,7 @@ b a: versions differ -> m b: remote created -> g +picked tool 'true' for a (binary False symlink False) merging a my a@33aaa84a386b+ other a@802f095af299 ancestor a@33aaa84a386b getting b @@ -109,8 +111,10 @@ searching for copies back to rev 1 a: versions differ -> m b: versions differ -> m +picked tool 'true' for a (binary False symlink False) merging a my a@802f095af299+ other a@030602aee63d ancestor a@33aaa84a386b +picked tool 'true' for b (binary False symlink False) merging b my b@802f095af299+ other b@030602aee63d ancestor b@000000000000 0 files updated, 2 files merged, 0 files removed, 0 files unresolved