mercurial/simplemerge.py
changeset 48557 c6649c53073f
parent 48556 ce8c82a5cd65
child 48558 2dbee604a4f0
equal deleted inserted replaced
48556:ce8c82a5cd65 48557:c6649c53073f
    84         if b is None:
    84         if b is None:
    85             b = mdiff.splitnewlines(btext)
    85             b = mdiff.splitnewlines(btext)
    86         self.base = base
    86         self.base = base
    87         self.a = a
    87         self.a = a
    88         self.b = b
    88         self.b = b
    89 
       
    90     def merge_lines(
       
    91         self,
       
    92         name_a=None,
       
    93         name_b=None,
       
    94         name_base=None,
       
    95         start_marker=b'<<<<<<<',
       
    96         mid_marker=b'=======',
       
    97         end_marker=b'>>>>>>>',
       
    98         base_marker=None,
       
    99         minimize=False,
       
   100     ):
       
   101         """Return merge in cvs-like form."""
       
   102         conflicts = False
       
   103         newline = b'\n'
       
   104         if len(self.a) > 0:
       
   105             if self.a[0].endswith(b'\r\n'):
       
   106                 newline = b'\r\n'
       
   107             elif self.a[0].endswith(b'\r'):
       
   108                 newline = b'\r'
       
   109         if name_a and start_marker:
       
   110             start_marker = start_marker + b' ' + name_a
       
   111         if name_b and end_marker:
       
   112             end_marker = end_marker + b' ' + name_b
       
   113         if name_base and base_marker:
       
   114             base_marker = base_marker + b' ' + name_base
       
   115         merge_groups = self.merge_groups()
       
   116         if minimize:
       
   117             merge_groups = self.minimize(merge_groups)
       
   118         lines = []
       
   119         for what, group_lines in merge_groups:
       
   120             if what == b'conflict':
       
   121                 base_lines, a_lines, b_lines = group_lines
       
   122                 conflicts = True
       
   123                 if start_marker is not None:
       
   124                     lines.append(start_marker + newline)
       
   125                 lines.extend(a_lines)
       
   126                 if base_marker is not None:
       
   127                     lines.append(base_marker + newline)
       
   128                     lines.extend(base_lines)
       
   129                 if mid_marker is not None:
       
   130                     lines.append(mid_marker + newline)
       
   131                 lines.extend(b_lines)
       
   132                 if end_marker is not None:
       
   133                     lines.append(end_marker + newline)
       
   134             else:
       
   135                 lines.extend(group_lines)
       
   136         return lines, conflicts
       
   137 
    89 
   138     def merge_groups(self):
    90     def merge_groups(self):
   139         """Yield sequence of line groups.  Each one is a tuple:
    91         """Yield sequence of line groups.  Each one is a tuple:
   140 
    92 
   141         'unchanged', lines
    93         'unchanged', lines
   385         raise error.Abort(_(b"can only specify three labels."))
   337         raise error.Abort(_(b"can only specify three labels."))
   386     result = defaults[:]
   338     result = defaults[:]
   387     for i, override in enumerate(overrides):
   339     for i, override in enumerate(overrides):
   388         result[i] = override
   340         result[i] = override
   389     return result
   341     return result
       
   342 
       
   343 
       
   344 def merge_lines(
       
   345     m3,
       
   346     name_a=None,
       
   347     name_b=None,
       
   348     name_base=None,
       
   349     start_marker=b'<<<<<<<',
       
   350     mid_marker=b'=======',
       
   351     end_marker=b'>>>>>>>',
       
   352     base_marker=None,
       
   353     minimize=False,
       
   354 ):
       
   355     """Return merge in cvs-like form."""
       
   356     conflicts = False
       
   357     newline = b'\n'
       
   358     if len(m3.a) > 0:
       
   359         if m3.a[0].endswith(b'\r\n'):
       
   360             newline = b'\r\n'
       
   361         elif m3.a[0].endswith(b'\r'):
       
   362             newline = b'\r'
       
   363     if name_a and start_marker:
       
   364         start_marker = start_marker + b' ' + name_a
       
   365     if name_b and end_marker:
       
   366         end_marker = end_marker + b' ' + name_b
       
   367     if name_base and base_marker:
       
   368         base_marker = base_marker + b' ' + name_base
       
   369     merge_groups = m3.merge_groups()
       
   370     if minimize:
       
   371         merge_groups = m3.minimize(merge_groups)
       
   372     lines = []
       
   373     for what, group_lines in merge_groups:
       
   374         if what == b'conflict':
       
   375             base_lines, a_lines, b_lines = group_lines
       
   376             conflicts = True
       
   377             if start_marker is not None:
       
   378                 lines.append(start_marker + newline)
       
   379             lines.extend(a_lines)
       
   380             if base_marker is not None:
       
   381                 lines.append(base_marker + newline)
       
   382                 lines.extend(base_lines)
       
   383             if mid_marker is not None:
       
   384                 lines.append(mid_marker + newline)
       
   385             lines.extend(b_lines)
       
   386             if end_marker is not None:
       
   387                 lines.append(end_marker + newline)
       
   388         else:
       
   389             lines.extend(group_lines)
       
   390     return lines, conflicts
   390 
   391 
   391 
   392 
   392 def _mergediff(m3, name_a, name_b, name_base):
   393 def _mergediff(m3, name_a, name_b, name_base):
   393     lines = []
   394     lines = []
   394     conflicts = False
   395     conflicts = False
   506             }
   507             }
   507             if mode == b'merge3':
   508             if mode == b'merge3':
   508                 extrakwargs['base_marker'] = b'|||||||'
   509                 extrakwargs['base_marker'] = b'|||||||'
   509                 extrakwargs['name_base'] = name_base
   510                 extrakwargs['name_base'] = name_base
   510                 extrakwargs['minimize'] = False
   511                 extrakwargs['minimize'] = False
   511             lines, conflicts = m3.merge_lines(
   512             lines, conflicts = merge_lines(
   512                 name_a=name_a, name_b=name_b, **extrakwargs
   513                 m3, name_a=name_a, name_b=name_b, **extrakwargs
   513             )
   514             )
   514 
   515 
   515     mergedtext = b''.join(lines)
   516     mergedtext = b''.join(lines)
   516     if opts.get('print'):
   517     if opts.get('print'):
   517         ui.fout.write(mergedtext)
   518         ui.fout.write(mergedtext)