~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/textmerge.py

  • Committer: Jelmer Vernooij
  • Date: 2012-02-01 19:18:09 UTC
  • mfrom: (6459 +trunk)
  • mto: This revision was merged to the branch mainline in revision 6460.
  • Revision ID: jelmer@samba.org-20120201191809-xn340a5i5v4fqsfu
Merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 Canonical Ltd
 
1
# Copyright (C) 2006, 2009, 2010 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
#
17
 
# Author: Martin Pool <mbp@canonical.com> 
 
17
# Author: Martin Pool <mbp@canonical.com>
18
18
#         Aaron Bentley <aaron.bentley@utoronto.ca>
19
19
 
 
20
from __future__ import absolute_import
20
21
 
21
 
import bzrlib.patiencediff
 
22
from bzrlib.lazy_import import lazy_import
 
23
lazy_import(globals(), """
 
24
from bzrlib import patiencediff
 
25
""")
22
26
 
23
27
 
24
28
class TextMerge(object):
29
33
    This is an iterable of tuples of lists of lines.
30
34
    Each tuple may have a length of 1 - 3, depending on whether the region it
31
35
    represents is conflicted.
32
 
    
 
36
 
33
37
    Unconflicted region tuples have length 1.
34
38
    Conflicted region tuples have length 2 or 3.  Index 1 is text_a, e.g. THIS.
35
39
    Index 1 is text_b, e.g. OTHER.  Index 2 is optional.  If present, it
60
64
                    yield line
61
65
            else:
62
66
                yield self.a_marker
63
 
                for line in lines[0]: 
 
67
                for line in lines[0]:
64
68
                    yield line
65
69
                yield self.split_marker
66
 
                for line in lines[1]: 
 
70
                for line in lines[1]:
67
71
                    yield line
68
72
                yield self.b_marker
69
73
 
120
124
    regions produce conflicts.
121
125
    """
122
126
 
123
 
    def __init__(self, lines_a, lines_b, a_marker=TextMerge.A_MARKER, 
124
 
                 b_marker=TextMerge.B_MARKER, 
 
127
    def __init__(self, lines_a, lines_b, a_marker=TextMerge.A_MARKER,
 
128
                 b_marker=TextMerge.B_MARKER,
125
129
                 split_marker=TextMerge.SPLIT_MARKER):
126
130
        TextMerge.__init__(self, a_marker, b_marker, split_marker)
127
131
        self.lines_a = lines_a
128
132
        self.lines_b = lines_b
129
133
 
130
134
    def _merge_struct(self):
131
 
        """Return structured merge info.  
 
135
        """Return structured merge info.
132
136
        See TextMerge docstring.
133
137
        """
134
 
        sm = bzrlib.patiencediff.PatienceSequenceMatcher(None, self.lines_a, self.lines_b)
 
138
        sm = patiencediff.PatienceSequenceMatcher(
 
139
            None, self.lines_a, self.lines_b)
135
140
        pos_a = 0
136
141
        pos_b = 0
137
142
        for ai, bi, l in sm.get_matching_blocks():
139
144
            yield(self.lines_a[pos_a:ai], self.lines_b[pos_b:bi])
140
145
            # matching lines
141
146
            yield(self.lines_a[ai:ai+l],)
142
 
            pos_a = ai + l 
 
147
            pos_a = ai + l
143
148
            pos_b = bi + l
144
149
        # final non-matching lines
145
150
        yield(self.lines_a[pos_a:-1], self.lines_b[pos_b:-1])