Mercurial > public > mercurial-scm > hg-stable
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) |