Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/simplemerge.py @ 48589:69e76b2aad3d
simplemerge: split out function for rendering :merge3 conflict markers
The results in some duplicate, but the code is very straight-forward
and I think it's worth it to have each conflict marker style in a
separate function.
Differential Revision: https://phab.mercurial-scm.org/D11978
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Tue, 11 Jan 2022 16:23:10 -0800 |
parents | 6ad70879d2bd |
children | 12ac4401ff7d |
comparison
equal
deleted
inserted
replaced
48588:6ad70879d2bd | 48589:69e76b2aad3d |
---|---|
352 | 352 |
353 def render_markers( | 353 def render_markers( |
354 m3, | 354 m3, |
355 name_a=None, | 355 name_a=None, |
356 name_b=None, | 356 name_b=None, |
357 name_base=None, | |
358 start_marker=b'<<<<<<<', | 357 start_marker=b'<<<<<<<', |
359 mid_marker=b'=======', | 358 mid_marker=b'=======', |
360 end_marker=b'>>>>>>>', | 359 end_marker=b'>>>>>>>', |
361 base_marker=None, | |
362 minimize=False, | 360 minimize=False, |
363 ): | 361 ): |
364 """Return merge in cvs-like form.""" | 362 """Return merge in cvs-like form.""" |
365 newline = _detect_newline(m3) | 363 newline = _detect_newline(m3) |
366 conflicts = False | 364 conflicts = False |
367 if name_a and start_marker: | 365 if name_a and start_marker: |
368 start_marker = start_marker + b' ' + name_a | 366 start_marker = start_marker + b' ' + name_a |
369 if name_b and end_marker: | 367 if name_b and end_marker: |
370 end_marker = end_marker + b' ' + name_b | 368 end_marker = end_marker + b' ' + name_b |
371 if name_base and base_marker: | |
372 base_marker = base_marker + b' ' + name_base | |
373 merge_groups = m3.merge_groups() | 369 merge_groups = m3.merge_groups() |
374 if minimize: | 370 if minimize: |
375 merge_groups = m3.minimize(merge_groups) | 371 merge_groups = m3.minimize(merge_groups) |
376 lines = [] | 372 lines = [] |
377 for what, group_lines in merge_groups: | 373 for what, group_lines in merge_groups: |
379 base_lines, a_lines, b_lines = group_lines | 375 base_lines, a_lines, b_lines = group_lines |
380 conflicts = True | 376 conflicts = True |
381 if start_marker is not None: | 377 if start_marker is not None: |
382 lines.append(start_marker + newline) | 378 lines.append(start_marker + newline) |
383 lines.extend(a_lines) | 379 lines.extend(a_lines) |
384 if base_marker is not None: | |
385 lines.append(base_marker + newline) | |
386 lines.extend(base_lines) | |
387 if mid_marker is not None: | 380 if mid_marker is not None: |
388 lines.append(mid_marker + newline) | 381 lines.append(mid_marker + newline) |
389 lines.extend(b_lines) | 382 lines.extend(b_lines) |
390 if end_marker is not None: | 383 if end_marker is not None: |
391 lines.append(end_marker + newline) | 384 lines.append(end_marker + newline) |
392 else: | 385 else: |
393 lines.extend(group_lines) | 386 lines.extend(group_lines) |
394 return lines, conflicts | 387 return lines, conflicts |
395 | 388 |
396 | 389 |
390 def render_merge3(m3, name_a, name_b, name_base): | |
391 """Render conflicts as 3-way conflict markers.""" | |
392 newline = _detect_newline(m3) | |
393 conflicts = False | |
394 lines = [] | |
395 for what, group_lines in m3.merge_groups(): | |
396 if what == b'conflict': | |
397 base_lines, a_lines, b_lines = group_lines | |
398 conflicts = True | |
399 lines.append(b'<<<<<<< ' + name_a + newline) | |
400 lines.extend(a_lines) | |
401 lines.append(b'||||||| ' + name_base + newline) | |
402 lines.extend(base_lines) | |
403 lines.append(b'=======' + newline) | |
404 lines.extend(b_lines) | |
405 lines.append(b'>>>>>>> ' + name_b + newline) | |
406 else: | |
407 lines.extend(group_lines) | |
408 return lines, conflicts | |
409 | |
410 | |
397 def render_mergediff(m3, name_a, name_b, name_base): | 411 def render_mergediff(m3, name_a, name_b, name_base): |
412 """Render conflicts as conflict markers with one snapshot and one diff.""" | |
398 newline = _detect_newline(m3) | 413 newline = _detect_newline(m3) |
399 lines = [] | 414 lines = [] |
400 conflicts = False | 415 conflicts = False |
401 for what, group_lines in m3.merge_groups(): | 416 for what, group_lines in m3.merge_groups(): |
402 if what == b'conflict': | 417 if what == b'conflict': |
502 lines = _resolve(m3, (2,)) | 517 lines = _resolve(m3, (2,)) |
503 else: | 518 else: |
504 name_a, name_b, name_base = _picklabels(opts.get('label', [])) | 519 name_a, name_b, name_base = _picklabels(opts.get('label', [])) |
505 if mode == b'mergediff': | 520 if mode == b'mergediff': |
506 lines, conflicts = render_mergediff(m3, name_a, name_b, name_base) | 521 lines, conflicts = render_mergediff(m3, name_a, name_b, name_base) |
522 elif mode == b'merge3': | |
523 lines, conflicts = render_merge3(m3, name_a, name_b, name_base) | |
507 else: | 524 else: |
508 extrakwargs = { | 525 extrakwargs = { |
509 'minimize': True, | 526 'minimize': True, |
510 } | 527 } |
511 if mode == b'merge3': | |
512 extrakwargs['base_marker'] = b'|||||||' | |
513 extrakwargs['name_base'] = name_base | |
514 extrakwargs['minimize'] = False | |
515 lines, conflicts = render_markers( | 528 lines, conflicts = render_markers( |
516 m3, name_a=name_a, name_b=name_b, **extrakwargs | 529 m3, name_a=name_a, name_b=name_b, **extrakwargs |
517 ) | 530 ) |
518 | 531 |
519 mergedtext = b''.join(lines) | 532 mergedtext = b''.join(lines) |