~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/textmerge.py

(jameinel) Allow 'bzr serve' to interpret SIGHUP as a graceful shutdown.
 (bug #795025) (John A Meinel)

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
20
 
21
 
import bzrlib.patiencediff
 
21
from bzrlib.lazy_import import lazy_import
 
22
lazy_import(globals(), """
 
23
from bzrlib import patiencediff
 
24
""")
22
25
 
23
26
 
24
27
class TextMerge(object):
29
32
    This is an iterable of tuples of lists of lines.
30
33
    Each tuple may have a length of 1 - 3, depending on whether the region it
31
34
    represents is conflicted.
32
 
    
 
35
 
33
36
    Unconflicted region tuples have length 1.
34
37
    Conflicted region tuples have length 2 or 3.  Index 1 is text_a, e.g. THIS.
35
38
    Index 1 is text_b, e.g. OTHER.  Index 2 is optional.  If present, it
60
63
                    yield line
61
64
            else:
62
65
                yield self.a_marker
63
 
                for line in lines[0]: 
 
66
                for line in lines[0]:
64
67
                    yield line
65
68
                yield self.split_marker
66
 
                for line in lines[1]: 
 
69
                for line in lines[1]:
67
70
                    yield line
68
71
                yield self.b_marker
69
72
 
120
123
    regions produce conflicts.
121
124
    """
122
125
 
123
 
    def __init__(self, lines_a, lines_b, a_marker=TextMerge.A_MARKER, 
124
 
                 b_marker=TextMerge.B_MARKER, 
 
126
    def __init__(self, lines_a, lines_b, a_marker=TextMerge.A_MARKER,
 
127
                 b_marker=TextMerge.B_MARKER,
125
128
                 split_marker=TextMerge.SPLIT_MARKER):
126
129
        TextMerge.__init__(self, a_marker, b_marker, split_marker)
127
130
        self.lines_a = lines_a
128
131
        self.lines_b = lines_b
129
132
 
130
133
    def _merge_struct(self):
131
 
        """Return structured merge info.  
 
134
        """Return structured merge info.
132
135
        See TextMerge docstring.
133
136
        """
134
 
        sm = bzrlib.patiencediff.PatienceSequenceMatcher(None, self.lines_a, self.lines_b)
 
137
        sm = patiencediff.PatienceSequenceMatcher(
 
138
            None, self.lines_a, self.lines_b)
135
139
        pos_a = 0
136
140
        pos_b = 0
137
141
        for ai, bi, l in sm.get_matching_blocks():
139
143
            yield(self.lines_a[pos_a:ai], self.lines_b[pos_b:bi])
140
144
            # matching lines
141
145
            yield(self.lines_a[ai:ai+l],)
142
 
            pos_a = ai + l 
 
146
            pos_a = ai + l
143
147
            pos_b = bi + l
144
148
        # final non-matching lines
145
149
        yield(self.lines_a[pos_a:-1], self.lines_b[pos_b:-1])