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) |