simplemerge: simplify and rename render_markers()

Summary:
Written by Martin von Zweigbergk at https://phab.mercurial-scm.org/D11979

I did minor compatibility changes.

Original commit message:

render_markers() now always renders minimized 2-way markers, so
let's simplify and rename it accordingly.

Reviewed By: quark-zju

Differential Revision: D48866237

fbshipit-source-id: 79ca3f4016e0cb3a55f78b10d183b10e90c4bf0e
This commit is contained in:
Zhaolong Zhu 2023-08-31 14:26:57 -07:00 committed by Facebook GitHub Bot
parent cc4e3c1ccd
commit 50f0e3cd0d
5 changed files with 27 additions and 35 deletions

View File

@ -9,7 +9,7 @@ from typing import List, Optional
from edenscm import commands, error, mdiff, registrar, scmutil
from edenscm.i18n import _
from edenscm.simplemerge import Merge3Text, render_markers, wordmergemode
from edenscm.simplemerge import Merge3Text, render_minimized, wordmergemode
cmdtable = {}
command = registrar.command(cmdtable)
@ -261,7 +261,7 @@ def merge_file(
bench_stats.changed_files += 1
m3 = m3merger(basetext, dsttext, srctext)
mergedlines, conflictscount = render_markers(m3)
mergedlines, conflictscount = render_minimized(m3)
mergedtext = b"".join(mergedlines)
if conflictscount:
@ -274,7 +274,7 @@ def merge_file(
if m3merger != Merge3Text:
m3_baseline = Merge3Text(basetext, dsttext, srctext)
mergedtext_baseline = b"".join(render_markers(m3_baseline)[0])
mergedtext_baseline = b"".join(render_minimized(m3_baseline)[0])
if mergedtext != mergedtext_baseline:
repo.ui.write(

View File

@ -316,7 +316,7 @@ def debugbuilddag(
pa = p1.ancestor(p2)
base, local, other = [x[fn].data() for x in (pa, p1, p2)]
m3 = simplemerge.Merge3Text(base, local, other)
merged_lines = simplemerge.render_markers(m3)[0]
merged_lines = simplemerge.render_minimized(m3)[0]
ml = [pycompat.decodeutf8(l.strip()) for l in merged_lines]
ml.append("")
elif at > 0:

View File

@ -1031,7 +1031,7 @@ class rebaseruntime:
def _simplemerge(ui, basectx, ctx, p1ctx, manifestbuilder):
from ..simplemerge import Merge3Text, render_markers, wordmergemode
from ..simplemerge import Merge3Text, render_minimized, wordmergemode
conflicts = []
resolved = {}
@ -1043,7 +1043,7 @@ def _simplemerge(ui, basectx, ctx, p1ctx, manifestbuilder):
wordmerge = wordmergemode.fromui(ui)
m3 = Merge3Text(basetext, localtext, othertext, wordmerge=wordmerge)
merged_lines, conflictscount = render_markers(m3)
merged_lines, conflictscount = render_minimized(m3)
merged = b"".join(merged_lines)
# Suppress message if merged result is the same as local contents.

View File

@ -89,7 +89,7 @@ def trywordmerge(base_lines, a_lines, b_lines):
btext = b"".join(b_lines)
try:
m3 = Merge3Text(basetext, atext, btext, wordmerge=wordmergemode.enforced)
text = b"".join(render_markers(m3)[0])
text = b"".join(render_minimized(m3)[0])
return text.splitlines(True)
except CantShowWordConflicts:
return None
@ -395,38 +395,33 @@ class Merge3Text:
return sl
def render_markers(
def render_minimized(
m3,
name_a=None,
name_b=None,
start_marker=b"<<<<<<<",
mid_marker=b"=======",
end_marker=b">>>>>>>",
minimize=False,
) -> Tuple[List[bytes], int]:
"""Return merge in cvs-like form."""
conflictscount = 0
newline = _detect_newline(m3)
if name_a and start_marker:
if name_a:
start_marker = start_marker + b" " + name_a
if name_b and end_marker:
if name_b:
end_marker = end_marker + b" " + name_b
merge_groups = m3.merge_groups(automerge=True)
if minimize:
merge_groups = m3.minimize(merge_groups)
lines = []
for what, group_lines in merge_groups:
if what == "conflict":
conflictscount += 1
base_lines, a_lines, b_lines = group_lines
if start_marker is not None:
lines.append(start_marker + newline)
lines.extend(a_lines)
if mid_marker is not None:
lines.append(mid_marker + newline)
lines.extend(b_lines)
if end_marker is not None:
lines.append(end_marker + newline)
else:
lines.extend(group_lines)
@ -603,10 +598,7 @@ def simplemerge(ui, localctx, basectx, otherctx, **opts):
elif mode == "merge3":
lines, conflictscount = render_merge3(m3, name_a, name_b, name_base)
else:
extrakwargs = {"minimize": True}
lines, conflictscount = render_markers(
m3, name_a=name_a, name_b=name_b, **extrakwargs
)
lines, conflictscount = render_minimized(m3, name_a, name_b)
mergedtext = b"".join(lines)
if opts.get("print"):

View File

@ -24,7 +24,7 @@ import unittest
from edenscm import error, util
from edenscm.pycompat import decodeutf8
from edenscm.simplemerge import Merge3Text, render_markers, wordmergemode
from edenscm.simplemerge import Merge3Text, render_minimized, wordmergemode
TestCase = unittest.TestCase
@ -171,7 +171,7 @@ class TestMerge3(TestCase):
self.assertEqual(list(m3.merge_regions()), [("a", 0, 2)])
self.assertEqual(render_markers(m3), ([b"aaa", b"bbb"], 0))
self.assertEqual(render_minimized(m3), ([b"aaa", b"bbb"], 0))
def test_no_conflicts(self):
"""No conflicts because only one side changed"""
@ -192,14 +192,14 @@ class TestMerge3(TestCase):
[b"aaa\n", b"bbb\n"], [b"aaa\n", b"bbb\n", b"222\n"], [b"aaa\n", b"bbb\n"]
)
self.assertEqual(b"".join(render_markers(m3)[0]), b"aaa\nbbb\n222\n")
self.assertEqual(b"".join(render_minimized(m3)[0]), b"aaa\nbbb\n222\n")
def test_append_b(self):
m3 = Merge3(
[b"aaa\n", b"bbb\n"], [b"aaa\n", b"bbb\n"], [b"aaa\n", b"bbb\n", b"222\n"]
)
self.assertEqual(b"".join(render_markers(m3)[0]), b"aaa\nbbb\n222\n")
self.assertEqual(b"".join(render_minimized(m3)[0]), b"aaa\nbbb\n222\n")
def test_append_agreement(self):
m3 = Merge3(
@ -208,7 +208,7 @@ class TestMerge3(TestCase):
[b"aaa\n", b"bbb\n", b"222\n"],
)
self.assertEqual(b"".join(render_markers(m3)[0]), b"aaa\nbbb\n222\n")
self.assertEqual(b"".join(render_minimized(m3)[0]), b"aaa\nbbb\n222\n")
def test_append_clash(self):
m3 = Merge3(
@ -217,7 +217,7 @@ class TestMerge3(TestCase):
[b"aaa\n", b"bbb\n", b"333\n"],
)
ml, conflictscount = render_markers(
ml, conflictscount = render_minimized(
m3,
name_a=b"a",
name_b=b"b",
@ -238,7 +238,7 @@ class TestMerge3(TestCase):
[b"aaa\n", b"222\n", b"bbb\n"],
)
ml, conflictscount = render_markers(
ml, conflictscount = render_minimized(
m3,
name_a=b"a",
name_b=b"b",
@ -276,7 +276,7 @@ class TestMerge3(TestCase):
],
)
ml, conflictscount = render_markers(
ml, conflictscount = render_minimized(
m3,
name_a=b"a",
name_b=b"b",
@ -324,7 +324,7 @@ bbb
def test_merge_poem(self):
"""Test case from diff3 manual"""
m3 = Merge3(TZU, LAO, TAO)
ml, conflictscount = render_markers(m3, b"LAO", b"TAO")
ml, conflictscount = render_minimized(m3, b"LAO", b"TAO")
self.log("merge result:")
self.log(decodeutf8(b"".join(ml)))
self.assertEqual(ml, MERGED_RESULT)
@ -343,7 +343,7 @@ bbb
other_text.splitlines(True),
this_text.splitlines(True),
)
m_lines, conflictscount = render_markers(m3, b"OTHER", b"THIS")
m_lines, conflictscount = render_minimized(m3, b"OTHER", b"THIS")
self.assertEqual(
b"<<<<<<< OTHER\r\nc\r\n=======\r\nb\r\n"
b">>>>>>> THIS\r\n".splitlines(True),
@ -360,7 +360,7 @@ bbb
other_text.splitlines(True),
this_text.splitlines(True),
)
m_lines, conflictscount = render_markers(m3, b"OTHER", b"THIS")
m_lines, conflictscount = render_minimized(m3, b"OTHER", b"THIS")
self.assertEqual(
b"<<<<<<< OTHER\rc\r=======\rb\r" b">>>>>>> THIS\r".splitlines(True),
list(m_lines),
@ -390,7 +390,7 @@ import {cached, LRU} from 'shared/LRU';
this_text.splitlines(True),
wordmerge=wordmergemode.ondemand,
)
m_lines, conflictscount = render_markers(m3, b"OTHER", b"THIS")
m_lines, conflictscount = render_minimized(m3, b"OTHER", b"THIS")
self.assertEqual(expected.splitlines(True), m_lines)
self.assertEqual(0, conflictscount)