[Updated] D11904: simplemerge: rewrite `merge_lines()` using `merge_groups()`

martinvonz (Martin von Zweigbergk) phabricator at mercurial-scm.org
Wed Jan 5 09:04:12 UTC 2022


Closed by commit rHG0590c6c96852: simplemerge: rewrite `merge_lines()` using `merge_groups()` (authored by martinvonz).
This revision was automatically updated to reflect the committed changes.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D11904?vs=31439&id=31592

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D11904/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D11904

AFFECTED FILES
  mercurial/simplemerge.py

CHANGE DETAILS

diff --git a/mercurial/simplemerge.py b/mercurial/simplemerge.py
--- a/mercurial/simplemerge.py
+++ b/mercurial/simplemerge.py
@@ -112,38 +112,32 @@
             end_marker = end_marker + b' ' + name_b
         if name_base and base_marker:
             base_marker = base_marker + b' ' + name_base
-        merge_regions = self.merge_regions()
+        merge_groups = self.merge_groups()
         if minimize:
-            merge_regions = self.minimize(merge_regions)
-        for t in merge_regions:
-            what = t[0]
-            if what == b'unchanged':
-                for i in range(t[1], t[2]):
-                    yield self.base[i]
-            elif what == b'a' or what == b'same':
-                for i in range(t[1], t[2]):
-                    yield self.a[i]
-            elif what == b'b':
-                for i in range(t[1], t[2]):
-                    yield self.b[i]
-            elif what == b'conflict':
+            merge_groups = self.minimize(merge_groups)
+        for group in merge_groups:
+            what = group[0]
+            if what == b'conflict':
+                base_lines, a_lines, b_lines = group[1:]
                 self.conflicts = True
                 if start_marker is not None:
                     yield start_marker + newline
-                for i in range(t[3], t[4]):
-                    yield self.a[i]
+                for line in a_lines:
+                    yield line
                 if base_marker is not None:
                     yield base_marker + newline
-                    for i in range(t[1], t[2]):
-                        yield self.base[i]
+                    for line in base_lines:
+                        yield line
                 if mid_marker is not None:
                     yield mid_marker + newline
-                for i in range(t[5], t[6]):
-                    yield self.b[i]
+                for line in b_lines:
+                    yield line
                 if end_marker is not None:
                     yield end_marker + newline
             else:
-                raise ValueError(what)
+                resolved_lines = group[1]
+                for line in resolved_lines:
+                    yield line
 
     def merge_groups(self):
         """Yield sequence of line groups.  Each one is a tuple:
@@ -270,66 +264,47 @@
                 ia = aend
                 ib = bend
 
-    def minimize(self, merge_regions):
+    def minimize(self, merge_groups):
         """Trim conflict regions of lines where A and B sides match.
 
         Lines where both A and B have made the same changes at the beginning
         or the end of each merge region are eliminated from the conflict
         region and are instead considered the same.
         """
-        for region in merge_regions:
-            if region[0] != b"conflict":
-                yield region
+        for group in merge_groups:
+            if group[0] != b"conflict":
+                yield group
                 continue
-            # pytype thinks this tuple contains only 3 things, but
-            # that's clearly not true because this code successfully
-            # executes. It might be wise to rework merge_regions to be
-            # some kind of attrs type.
-            (
-                issue,
-                z1,
-                z2,
-                a1,
-                a2,
-                b1,
-                b2,
-            ) = region  # pytype: disable=bad-unpacking
-            alen = a2 - a1
-            blen = b2 - b1
+            base_lines, a_lines, b_lines = group[1:]
+            alen = len(a_lines)
+            blen = len(b_lines)
 
             # find matches at the front
             ii = 0
-            while (
-                ii < alen and ii < blen and self.a[a1 + ii] == self.b[b1 + ii]
-            ):
+            while ii < alen and ii < blen and a_lines[ii] == b_lines[ii]:
                 ii += 1
             startmatches = ii
 
             # find matches at the end
             ii = 0
             while (
-                ii < alen
-                and ii < blen
-                and self.a[a2 - ii - 1] == self.b[b2 - ii - 1]
+                ii < alen and ii < blen and a_lines[-ii - 1] == b_lines[-ii - 1]
             ):
                 ii += 1
             endmatches = ii
 
             if startmatches > 0:
-                yield b'same', a1, a1 + startmatches
+                yield b'same', a_lines[:startmatches]
 
             yield (
                 b'conflict',
-                z1,
-                z2,
-                a1 + startmatches,
-                a2 - endmatches,
-                b1 + startmatches,
-                b2 - endmatches,
+                base_lines,
+                a_lines[startmatches : alen - endmatches],
+                b_lines[startmatches : blen - endmatches],
             )
 
             if endmatches > 0:
-                yield b'same', a2 - endmatches, a2
+                yield b'same', a_lines[alen - endmatches :]
 
     def find_sync_regions(self):
         """Return a list of sync regions, where both descendants match the base.



To: martinvonz, #hg-reviewers, Alphare
Cc: mercurial-patches
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mercurial-scm.org/pipermail/mercurial-patches/attachments/20220105/c54be46f/attachment-0002.html>


More information about the Mercurial-patches mailing list