diff --git a/mercurial/filemerge.py b/mercurial/filemerge.py --- a/mercurial/filemerge.py +++ b/mercurial/filemerge.py @@ -458,7 +458,11 @@ def _idump(repo, mynode, orig, fcd, fco, perform a merge manually. If the file to be merged is named ``a.txt``, these files will accordingly be named ``a.txt.local``, ``a.txt.other`` and ``a.txt.base`` and they will be placed in the - same directory as ``a.txt``.""" + same directory as ``a.txt``. + + This implies permerge. Therefore, files aren't dumped, if premerge + runs successfully. Use :forcedump to forcibly write files out. + """ a, b, c, back = files fd = fcd.path() @@ -468,6 +472,15 @@ def _idump(repo, mynode, orig, fcd, fco, repo.wwrite(fd + ".base", fca.data(), fca.flags()) return False, 1, False +@internaltool('forcedump', mergeonly) +def _forcedump(repo, mynode, orig, fcd, fco, fca, toolconf, files, + labels=None): + """ + Creates three versions of the files as same as :dump, but omits premerge. + """ + return _idump(repo, mynode, orig, fcd, fco, fca, toolconf, files, + labels=labels) + def _xmerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None): tool, toolpath, binary, symlink = toolconf if fcd.isabsent() or fco.isabsent(): diff --git a/tests/test-help.t b/tests/test-help.t --- a/tests/test-help.t +++ b/tests/test-help.t @@ -1760,11 +1760,18 @@ Test dynamic list of merge tools only sh accordingly be named "a.txt.local", "a.txt.other" and "a.txt.base" and they will be placed in the same directory as "a.txt". + This implies permerge. Therefore, files aren't dumped, if premerge runs + successfully. Use :forcedump to forcibly write files out. + ":fail" Rather than attempting to merge files that were modified on both branches, it marks them as unresolved. The resolve command must be used to resolve these conflicts. + ":forcedump" + Creates three versions of the files as same as :dump, but omits + premerge. + ":local" Uses the local 'p1()' version of files as the merged version. diff --git a/tests/test-merge-tools.t b/tests/test-merge-tools.t --- a/tests/test-merge-tools.t +++ b/tests/test-merge-tools.t @@ -671,6 +671,72 @@ f.other: space $ rm f.base f.local f.other +check that internal:dump doesn't dump files if premerge runs +successfully + + $ beforemerge + [merge-tools] + false.whatever= + true.priority=1 + true.executable=cat + # hg update -C 1 + $ hg merge -r 3 --config ui.merge=internal:dump + merging f + 0 files updated, 1 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + + $ aftermerge + # cat f + revision 1 + space + revision 3 + # hg stat + M f + # hg resolve --list + R f + +check that internal:forcedump dumps files, even if local and other can +be merged easily + + $ beforemerge + [merge-tools] + false.whatever= + true.priority=1 + true.executable=cat + # hg update -C 1 + $ hg merge -r 3 --config ui.merge=internal:forcedump + merging f + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved + use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon + [1] + $ aftermerge + # cat f + revision 1 + space + # hg stat + M f + ? f.base + ? f.local + ? f.orig + ? f.other + # hg resolve --list + U f + + $ cat f.base + revision 0 + space + + $ cat f.local + revision 1 + space + + $ cat f.other + revision 0 + space + revision 3 + + $ rm -f f.base f.local f.other + ui.merge specifies internal:other but is overruled by pattern for false: $ beforemerge