# HG changeset patch # User Martin von Zweigbergk # Date 2022-01-14 16:17:13 # Node ID 6ae3c97a09196bae94e9a6a7085ffb760a560eba # Parent d9602f0df4f3317250ad7328f8300ac43910ecce simplemerge: move printing of merge result to extension The `mercurial.simplemerge` module still has some command-lines processing that doesn't belong in such a low-level module. This patch moves the handling of `hg simplemerge --print` to the extension by having `mercurial.simplemerge.simplemerge()` return the merged text. Differential Revision: https://phab.mercurial-scm.org/D12148 diff --git a/contrib/simplemerge b/contrib/simplemerge --- a/contrib/simplemerge +++ b/contrib/simplemerge @@ -15,6 +15,7 @@ from mercurial import ( fancyopts, simplemerge, ui as uimod, + util, ) from mercurial.utils import procutil, stringutil @@ -116,18 +117,21 @@ try: _verifytext(base_input, ui, quiet=quiet, allow_binary=allow_binary) _verifytext(other_input, ui, quiet=quiet, allow_binary=allow_binary) - sys.exit( - simplemerge.simplemerge( - ui, - local_input, - base_input, - other_input, - mode, - quiet=True, - allow_binary=allow_binary, - print_result=opts.get(b'print'), - ) + merged_text, conflicts = simplemerge.simplemerge( + ui, + local_input, + base_input, + other_input, + mode, + quiet=True, + allow_binary=allow_binary, + print_result=opts.get(b'print'), ) + if opts.get(b'print'): + ui.fout.write(merged_text) + else: + util.writefile(local, merged_text) + sys.exit(1 if conflicts else 0) except ParseError as e: e = stringutil.forcebytestr(e) procutil.stdout.write(b"%s: %s\n" % (sys.argv[0].encode('utf8'), e)) diff --git a/mercurial/filemerge.py b/mercurial/filemerge.py --- a/mercurial/filemerge.py +++ b/mercurial/filemerge.py @@ -442,10 +442,13 @@ def _premerge(repo, local, other, base, stringutil.binary(input.text()) for input in (local, base, other) ): return 1 # continue merging - r = simplemerge.simplemerge( - ui, local, base, other, quiet=True, mode=mode + merged_text, conflicts = simplemerge.simplemerge( + ui, local, base, other, mode=mode ) - if not r: + # fcd.flags() already has the merged flags (done in + # mergestate.resolve()) + local.fctx.write(merged_text, local.fctx.flags()) + if not conflicts: ui.debug(b" premerge successful\n") return 0 if premerge not in validkeep: @@ -489,8 +492,14 @@ def _merge(repo, local, other, base, mod _verifytext(other, ui) except error.Abort: return True, True, False - r = simplemerge.simplemerge(ui, local, base, other, mode=mode) - return True, r, False + else: + merged_text, conflicts = simplemerge.simplemerge( + ui, local, base, other, mode=mode + ) + # fcd.flags() already has the merged flags (done in + # mergestate.resolve()) + local.fctx.write(merged_text, local.fctx.flags()) + return True, conflicts, False @internaltool( diff --git a/mercurial/simplemerge.py b/mercurial/simplemerge.py --- a/mercurial/simplemerge.py +++ b/mercurial/simplemerge.py @@ -532,11 +532,4 @@ def simplemerge( lines, conflicts = render_minimized(m3, *labels) mergedtext = b''.join(lines) - if print_result: - ui.fout.write(mergedtext) - else: - # local.fctx.flags() already has the merged flags (done in - # mergestate.resolve()) - local.fctx.write(mergedtext, local.fctx.flags()) - - return conflicts + return mergedtext, conflicts