mercurial/simplemerge.py
changeset 48563 ad0c6bf6f02e
parent 48562 12ac4401ff7d
child 48564 c2537aec3bb6
equal deleted inserted replaced
48562:12ac4401ff7d 48563:ad0c6bf6f02e
   212                 yield b'unchanged', zmatch, zend
   212                 yield b'unchanged', zmatch, zend
   213                 iz = zend
   213                 iz = zend
   214                 ia = aend
   214                 ia = aend
   215                 ib = bend
   215                 ib = bend
   216 
   216 
   217     def minimize(self, merge_groups):
       
   218         """Trim conflict regions of lines where A and B sides match.
       
   219 
       
   220         Lines where both A and B have made the same changes at the beginning
       
   221         or the end of each merge region are eliminated from the conflict
       
   222         region and are instead considered the same.
       
   223         """
       
   224         for what, lines in merge_groups:
       
   225             if what != b"conflict":
       
   226                 yield what, lines
       
   227                 continue
       
   228             base_lines, a_lines, b_lines = lines
       
   229             alen = len(a_lines)
       
   230             blen = len(b_lines)
       
   231 
       
   232             # find matches at the front
       
   233             ii = 0
       
   234             while ii < alen and ii < blen and a_lines[ii] == b_lines[ii]:
       
   235                 ii += 1
       
   236             startmatches = ii
       
   237 
       
   238             # find matches at the end
       
   239             ii = 0
       
   240             while (
       
   241                 ii < alen and ii < blen and a_lines[-ii - 1] == b_lines[-ii - 1]
       
   242             ):
       
   243                 ii += 1
       
   244             endmatches = ii
       
   245 
       
   246             if startmatches > 0:
       
   247                 yield b'same', a_lines[:startmatches]
       
   248 
       
   249             yield (
       
   250                 b'conflict',
       
   251                 (
       
   252                     base_lines,
       
   253                     a_lines[startmatches : alen - endmatches],
       
   254                     b_lines[startmatches : blen - endmatches],
       
   255                 ),
       
   256             )
       
   257 
       
   258             if endmatches > 0:
       
   259                 yield b'same', a_lines[alen - endmatches :]
       
   260 
       
   261     def find_sync_regions(self):
   217     def find_sync_regions(self):
   262         """Return a list of sync regions, where both descendants match the base.
   218         """Return a list of sync regions, where both descendants match the base.
   263 
   219 
   264         Generates a list of (base1, base2, a1, a2, b1, b2).  There is
   220         Generates a list of (base1, base2, a1, a2, b1, b2).  There is
   265         always a zero-length sync region at the end of all the files.
   221         always a zero-length sync region at the end of all the files.
   346         if m3.a[0].endswith(b'\r\n'):
   302         if m3.a[0].endswith(b'\r\n'):
   347             return b'\r\n'
   303             return b'\r\n'
   348         elif m3.a[0].endswith(b'\r'):
   304         elif m3.a[0].endswith(b'\r'):
   349             return b'\r'
   305             return b'\r'
   350     return b'\n'
   306     return b'\n'
       
   307 
       
   308 
       
   309 def _minimize(merge_groups):
       
   310     """Trim conflict regions of lines where A and B sides match.
       
   311 
       
   312     Lines where both A and B have made the same changes at the beginning
       
   313     or the end of each merge region are eliminated from the conflict
       
   314     region and are instead considered the same.
       
   315     """
       
   316     for what, lines in merge_groups:
       
   317         if what != b"conflict":
       
   318             yield what, lines
       
   319             continue
       
   320         base_lines, a_lines, b_lines = lines
       
   321         alen = len(a_lines)
       
   322         blen = len(b_lines)
       
   323 
       
   324         # find matches at the front
       
   325         ii = 0
       
   326         while ii < alen and ii < blen and a_lines[ii] == b_lines[ii]:
       
   327             ii += 1
       
   328         startmatches = ii
       
   329 
       
   330         # find matches at the end
       
   331         ii = 0
       
   332         while ii < alen and ii < blen and a_lines[-ii - 1] == b_lines[-ii - 1]:
       
   333             ii += 1
       
   334         endmatches = ii
       
   335 
       
   336         if startmatches > 0:
       
   337             yield b'same', a_lines[:startmatches]
       
   338 
       
   339         yield (
       
   340             b'conflict',
       
   341             (
       
   342                 base_lines,
       
   343                 a_lines[startmatches : alen - endmatches],
       
   344                 b_lines[startmatches : blen - endmatches],
       
   345             ),
       
   346         )
       
   347 
       
   348         if endmatches > 0:
       
   349             yield b'same', a_lines[alen - endmatches :]
   351 
   350 
   352 
   351 
   353 def render_minimized(
   352 def render_minimized(
   354     m3,
   353     m3,
   355     name_a=None,
   354     name_a=None,
   364     if name_a:
   363     if name_a:
   365         start_marker = start_marker + b' ' + name_a
   364         start_marker = start_marker + b' ' + name_a
   366     if name_b:
   365     if name_b:
   367         end_marker = end_marker + b' ' + name_b
   366         end_marker = end_marker + b' ' + name_b
   368     merge_groups = m3.merge_groups()
   367     merge_groups = m3.merge_groups()
   369     merge_groups = m3.minimize(merge_groups)
   368     merge_groups = _minimize(merge_groups)
   370     lines = []
   369     lines = []
   371     for what, group_lines in merge_groups:
   370     for what, group_lines in merge_groups:
   372         if what == b'conflict':
   371         if what == b'conflict':
   373             base_lines, a_lines, b_lines = group_lines
   372             base_lines, a_lines, b_lines = group_lines
   374             conflicts = True
   373             conflicts = True