comparison mercurial/simplemerge.py @ 48585:c6649c53073f

simplemerge: make merge_lines() a free function IMO, the rendering of a conflict as text with merge markers should be separate from the code for resolving conflicts. The latter is what `Merge3Text` is mostly about already. Differential Revision: https://phab.mercurial-scm.org/D11974
author Martin von Zweigbergk <martinvonz@google.com>
date Fri, 07 Jan 2022 22:16:22 -0800
parents ce8c82a5cd65
children 2dbee604a4f0
comparison
equal deleted inserted replaced
48584:ce8c82a5cd65 48585: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)