~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/weave.py

Moved plan_merge into Weave

Show diffs side-by-side

added added

removed removed

Lines of Context:
710
710
            raise WeaveFormatError("unclosed deletion blocks at end of weave: %s"
711
711
                                   % dset)
712
712
 
 
713
    def plan_merge(self, ver_a, ver_b):
 
714
        """Return pseudo-annotation indicating how the two versions merge.
 
715
 
 
716
        This is computed between versions a and b and their common
 
717
        base.
 
718
 
 
719
        Weave lines present in none of them are skipped entirely.
 
720
        """
 
721
        inc_a = set(self.get_ancestry([ver_a]))
 
722
        inc_b = set(self.get_ancestry([ver_b]))
 
723
        inc_c = inc_a & inc_b
 
724
 
 
725
        for lineno, insert, deleteset, line in\
 
726
            self.walk([ver_a, ver_b]):
 
727
            if deleteset & inc_c:
 
728
                # killed in parent; can't be in either a or b
 
729
                # not relevant to our work
 
730
                yield 'killed-base', line
 
731
            elif insert in inc_c:
 
732
                # was inserted in base
 
733
                killed_a = bool(deleteset & inc_a)
 
734
                killed_b = bool(deleteset & inc_b)
 
735
                if killed_a and killed_b:
 
736
                    yield 'killed-both', line
 
737
                elif killed_a:
 
738
                    yield 'killed-a', line
 
739
                elif killed_b:
 
740
                    yield 'killed-b', line
 
741
                else:
 
742
                    yield 'unchanged', line
 
743
            elif insert in inc_a:
 
744
                if deleteset & inc_a:
 
745
                    yield 'ghost-a', line
 
746
                else:
 
747
                    # new in A; not in B
 
748
                    yield 'new-a', line
 
749
            elif insert in inc_b:
 
750
                if deleteset & inc_b:
 
751
                    yield 'ghost-b', line
 
752
                else:
 
753
                    yield 'new-b', line
 
754
            else:
 
755
                # not in either revision
 
756
                yield 'irrelevant', line
 
757
 
 
758
        yield 'unchanged', ''           # terminator
 
759
 
713
760
    def _extract(self, versions):
714
761
        """Yield annotation of lines in included set.
715
762