~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/versionedfile.py

Got weave merge producing structural output

Show diffs side-by-side

added added

removed removed

Lines of Context:
440
440
        yield 'unchanged', ''           # terminator
441
441
 
442
442
    def weave_merge(self, plan, a_marker='<<<<<<< \n', b_marker='>>>>>>> \n'):
 
443
        return self.struct_to_lines(self.weave_merge_struct(plan), a_marker,
 
444
                                    b_marker)
 
445
 
 
446
    def struct_to_lines(self, struct_iter, a_marker, b_marker):
 
447
        for lines in struct_iter:
 
448
            if len(lines) == 1:
 
449
                for line in lines[0]:
 
450
                    yield line
 
451
            else:
 
452
                    yield a_marker
 
453
                    for l in lines[0]: yield l
 
454
                    yield '=======\n'
 
455
                    for l in lines[1]: yield l
 
456
                    yield b_marker
 
457
                    
 
458
 
 
459
    def weave_merge_struct(self, plan):
443
460
        lines_a = []
444
461
        lines_b = []
445
462
        ch_a = ch_b = False
446
 
        # TODO: Return a structured form of the conflicts (e.g. 2-tuples for
447
 
        # conflicted regions), rather than just inserting the markers.
448
 
        # 
449
463
        # TODO: Show some version information (e.g. author, date) on 
450
464
        # conflicted regions.
451
465
        
458
472
                if not lines_a and not lines_b:
459
473
                    pass
460
474
                elif ch_a and not ch_b:
461
 
                    # one-sided change:                    
462
 
                    for l in lines_a: yield l
 
475
                    # one-sided change:
 
476
                    yield(lines_a,)
463
477
                elif ch_b and not ch_a:
464
 
                    for l in lines_b: yield l
 
478
                    yield (lines_b,)
465
479
                elif lines_a == lines_b:
466
 
                    for l in lines_a: yield l
 
480
                    yield(lines_a,)
467
481
                else:
468
 
                    yield a_marker
469
 
                    for l in lines_a: yield l
470
 
                    yield '=======\n'
471
 
                    for l in lines_b: yield l
472
 
                    yield b_marker
 
482
                    yield (lines_a, lines_b)
473
483
 
474
484
                del lines_a[:]
475
485
                del lines_b[:]
477
487
                
478
488
            if state == 'unchanged':
479
489
                if line:
480
 
                    yield line
 
490
                    yield ([line],)
481
491
            elif state == 'killed-a':
482
492
                ch_a = True
483
493
                lines_b.append(line)