1
# Copyright (C) 2004, 2005 by Canonical Ltd
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
# GNU General Public License for more details.
13
# You should have received a copy of the GNU General Public License
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
19
def intersect(ra, rb):
20
"""Given two ranges return the range where they intersect or None.
22
>>> intersect((0, 10), (0, 6))
24
>>> intersect((0, 10), (5, 15))
26
>>> intersect((0, 10), (10, 15))
27
>>> intersect((0, 9), (10, 15))
28
>>> intersect((0, 9), (7, 15))
34
sa = max(ra[0], rb[0])
35
sb = min(ra[1], rb[1])
43
"""3-way merge of texts.
45
Given BASE, OTHER, THIS, tries to produce a combined text
46
incorporating the changes from both BASE->OTHER and BASE->THIS.
47
All three will typically be sequences of lines."""
48
def __init__(self, base, a, b):
53
#from difflib import SequenceMatcher
55
#self.a_ops = SequenceMatcher(None, self.base, self.a).get_opcodes()
56
#self.b_ops = SequenceMatcher(None, self.base, self.b).get_opcodes()
59
def find_conflicts(self):
60
"""Return a list of conflict regions.
62
Each entry is given as (base1, base2, a1, a2, b1, b2).
64
This indicates that the range [base1,base2] can be replaced by either
69
def find_unconflicted(self):
70
"""Return a list of ranges in base that are not conflicted."""
71
from difflib import SequenceMatcher
72
am = SequenceMatcher(None, self.base, self.a).get_matching_blocks()
73
bm = SequenceMatcher(None, self.base, self.b).get_matching_blocks()
78
# there is an unconflicted block at i; how long does it
79
# extend? until whichever one ends earlier.
84
i = intersect((a1, a2), (b1, b2))