~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/textmerge.py

Tweaks from merge review

Show diffs side-by-side

added added

removed removed

Lines of Context:
37
37
    """
38
38
    # TODO: Show some version information (e.g. author, date) on conflicted
39
39
    # regions.
40
 
 
41
 
    def __init__(self, a_marker='<<<<<<< \n', b_marker='>>>>>>> \n',
42
 
                 split_marker='=======\n'):
 
40
    A_MARKER = '<<<<<<< \n'
 
41
    B_MARKER = '>>>>>>> \n'
 
42
    SPLIT_MARKER = '=======\n'
 
43
    def __init__(self, a_marker=A_MARKER, b_marker=B_MARKER,
 
44
                 split_marker=SPLIT_MARKER):
43
45
        self.a_marker = a_marker
44
46
        self.b_marker = b_marker
45
47
        self.split_marker = split_marker
46
48
 
 
49
    def _merge_struct(self):
 
50
        """Return structured merge info.  Must be implemented by subclasses.
 
51
        See TextMerge docstring for details on the format.
 
52
        """
 
53
        raise NotImplementedError('_merge_struct is abstract')
 
54
 
47
55
    def struct_to_lines(self, struct_iter):
48
56
        """Convert merge result tuples to lines"""
49
57
        for lines in struct_iter:
68
76
                yield group
69
77
 
70
78
    def merge_lines(self, reprocess=False):
71
 
        """
72
 
        Produce an iterable of lines, suitable for writing to a file
 
79
        """Produce an iterable of lines, suitable for writing to a file
73
80
        Returns a tuple of (line iterable, conflict indicator)
74
81
        If reprocess is True, a two-way merge will be performed on the
75
82
        intermediate structure, to reduce conflict regions.
92
99
 
93
100
    @staticmethod
94
101
    def reprocess_struct(struct_iter):
95
 
        """
96
 
        Perform a two-way merge on a two-way merge on structural merge info.
 
102
        """ Perform a two-way merge on structural merge info.
97
103
        This reduces the size of conflict regions, but breaks the connection
98
 
        between the BASE and the conflict region.
 
104
        between the BASE text and the conflict region.
99
105
 
100
106
        This process may split a single conflict region into several smaller
101
107
        ones, but will not introduce new conflicts.
109
115
 
110
116
 
111
117
class Merge2(TextMerge):
112
 
    """
113
 
    Two-way merge.
 
118
    """ Two-way merge.
114
119
    In a two way merge, common regions are shown as unconflicting, and uncommon
115
120
    regions produce conflicts.
116
121
    """
117
122
 
118
 
    def __init__(self, lines_a, lines_b, a_marker='<<<<<<< \n', 
119
 
                 b_marker='>>>>>>> \n', split_marker='=======\n'):
 
123
    def __init__(self, lines_a, lines_b, a_marker=TextMerge.A_MARKER, 
 
124
                 b_marker=TextMerge.B_MARKER, 
 
125
                 split_marker=TextMerge.SPLIT_MARKER):
120
126
        TextMerge.__init__(self, a_marker, b_marker, split_marker)
121
127
        self.lines_a = lines_a
122
128
        self.lines_b = lines_b
123
129
 
124
130
    def _merge_struct(self):
125
 
        """
126
 
        Return structured merge info.  
 
131
        """Return structured merge info.  
127
132
        See TextMerge docstring.
128
133
        """
129
134
        sm = SequenceMatcher(None, self.lines_a, self.lines_b)