~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/merge3.py

  • Committer: Martin Pool
  • Date: 2005-07-05 08:09:30 UTC
  • Revision ID: mbp@sourcefrog.net-20050705080929-f44361a66a8b2e29
- Merge3.find_sync_regions always returns a zero-length sentinal at the end to
  ease matching.

- Merge3.merge partially done.

Show diffs side-by-side

added added

removed removed

Lines of Context:
68
68
        self.b_ops = SequenceMatcher(None, base, b).get_opcodes()
69
69
 
70
70
 
71
 
    def merge(self):
 
71
    def merge_regions(self):
72
72
        """Return sequences of matching and conflicting regions.
73
73
 
 
74
        This returns tuples, where the first value says what kind we
 
75
        have:
 
76
 
 
77
        'unchanged', start, end
 
78
             Take a region of base[start:end]
 
79
 
 
80
        'a', start, end
 
81
             Non-clashing insertion from a[start:end]
 
82
 
74
83
        Method is as follows:
75
84
 
76
85
        The two sequences align only on regions which match the base
82
91
        The regions in between can be in any of three cases:
83
92
        conflicted, or changed on only one side.
84
93
        """
 
94
 
 
95
        # section a[0:ia] has been disposed of, etc
 
96
        iz = ia = ib = 0
 
97
        
 
98
        for zmatch, zend, amatch, aend, bmatch, bend in self.find_sync_regions():
 
99
            matchlen = zend - zmatch
 
100
            assert matchlen >= 0
 
101
            assert matchlen == (aend - amatch)
 
102
            assert matchlen == (bend - bmatch)
 
103
            
 
104
            if amatch > ia:   # or bmatch > ib:
 
105
                # got an unmatched region; work out if either
 
106
                # alternative is the same as the base
 
107
 
 
108
                # kludge: return the whole thing as inserted into A
 
109
                yield 'a', ia, amatch
 
110
                ia = amatch
 
111
 
 
112
                
 
113
            if matchlen > 0:
 
114
                assert ia == amatch
 
115
                assert ib == bmatch
 
116
                assert iz == zmatch
 
117
                
 
118
                yield 'unchanged', zmatch, zend
 
119
                iz = zend
 
120
                ia = aend
 
121
                ib = bend
85
122
        
86
123
 
87
124
        
88
125
    def find_sync_regions(self):
89
126
        """Return a list of sync regions, where both descendents match the base.
90
127
 
91
 
        Generates a list of (base1, base2, a1, a2, b1, b2). 
 
128
        Generates a list of (base1, base2, a1, a2, b1, b2).  There is
 
129
        always a zero-length sync region at the end of all the files.
92
130
        """
93
131
        from difflib import SequenceMatcher
94
132
        aiter = iter(SequenceMatcher(None, self.base, self.a).get_matching_blocks())
133
171
            else:
134
172
                bbase, bmatch, blen = biter.next()
135
173
 
 
174
        intbase = len(self.base)
 
175
        abase = len(self.a)
 
176
        bbase = len(self.b)
 
177
        yield (intbase, intbase, abase, abase, bbase, bbase)
 
178
 
136
179
 
137
180
 
138
181
    def find_unconflicted(self):