Mercurial > hg
annotate mercurial/simplemerge.py @ 33886:13dc7f29531e
exchange: don't attempt phase exchange if phase-heads was in bundle
The Mercurial core server doesn't yet include phase-heads parts in the
bundle, but our Google-internal server wants to do
that. Unfortunately, the usual exchange still happens even if
phase-heads part is included (including the short-circuited one for
old/publishing servers). That means that even if our server (again,
the Google-internal one, but also future Mercurial core servers)
includes a phase-heads part to indicate that some heads should be
drafts, that would still get overwritten by the phase updating that
happens after. So let's fix that by marking the phase step done if we
receive at least one phase-heads part in the bundle.
Differential Revision: https://phab.mercurial-scm.org/D440
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Thu, 17 Aug 2017 13:04:47 -0700 |
parents | aa6c290a77fa |
children | f39ba8237ed6 |
rev | line source |
---|---|
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
1 # Copyright (C) 2004, 2005 Canonical Ltd |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
2 # |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
3 # This program is free software; you can redistribute it and/or modify |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
4 # it under the terms of the GNU General Public License as published by |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
5 # the Free Software Foundation; either version 2 of the License, or |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
6 # (at your option) any later version. |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
7 # |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
8 # This program is distributed in the hope that it will be useful, |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
11 # GNU General Public License for more details. |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
12 # |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
13 # You should have received a copy of the GNU General Public License |
15782
7de7630053cb
Remove FSF mailing address from GPL headers
Martin Geisler <mg@aragost.com>
parents:
15381
diff
changeset
|
14 # along with this program; if not, see <http://www.gnu.org/licenses/>. |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
15 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
16 # mbp: "you know that thing where cvs gives you conflict markers?" |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
17 # s: "i hate that." |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
18 |
25974
241a1324a180
simplemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22056
diff
changeset
|
19 from __future__ import absolute_import |
241a1324a180
simplemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22056
diff
changeset
|
20 |
241a1324a180
simplemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22056
diff
changeset
|
21 import os |
241a1324a180
simplemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22056
diff
changeset
|
22 |
241a1324a180
simplemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22056
diff
changeset
|
23 from .i18n import _ |
241a1324a180
simplemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22056
diff
changeset
|
24 from . import ( |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26223
diff
changeset
|
25 error, |
25974
241a1324a180
simplemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22056
diff
changeset
|
26 mdiff, |
33017
c31d45623304
py3: convert kwargs' keys' to str using pycompat.strkwargs()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31238
diff
changeset
|
27 pycompat, |
25974
241a1324a180
simplemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22056
diff
changeset
|
28 util, |
31238
35284f933518
vfs: use 'vfs' module directly in 'mercurial.simplemerge'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31216
diff
changeset
|
29 vfs as vfsmod, |
25974
241a1324a180
simplemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22056
diff
changeset
|
30 ) |
4363
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
31 |
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
32 class CantReprocessAndShowBase(Exception): |
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
33 pass |
5081
ea7b982b6c08
Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4408
diff
changeset
|
34 |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
35 def intersect(ra, rb): |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
36 """Given two ranges return the range where they intersect or None. |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
37 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
38 >>> intersect((0, 10), (0, 6)) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
39 (0, 6) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
40 >>> intersect((0, 10), (5, 15)) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
41 (5, 10) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
42 >>> intersect((0, 10), (10, 15)) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
43 >>> intersect((0, 9), (10, 15)) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
44 >>> intersect((0, 9), (7, 15)) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
45 (7, 9) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
46 """ |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
47 assert ra[0] <= ra[1] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
48 assert rb[0] <= rb[1] |
5081
ea7b982b6c08
Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4408
diff
changeset
|
49 |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
50 sa = max(ra[0], rb[0]) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
51 sb = min(ra[1], rb[1]) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
52 if sa < sb: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
53 return sa, sb |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
54 else: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
55 return None |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
56 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
57 def compare_range(a, astart, aend, b, bstart, bend): |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
58 """Compare a[astart:aend] == b[bstart:bend], without slicing. |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
59 """ |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
8312
diff
changeset
|
60 if (aend - astart) != (bend - bstart): |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
61 return False |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
62 for ia, ib in zip(xrange(astart, aend), xrange(bstart, bend)): |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
63 if a[ia] != b[ib]: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
64 return False |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
65 else: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
66 return True |
5081
ea7b982b6c08
Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4408
diff
changeset
|
67 |
4363
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
68 class Merge3Text(object): |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
69 """3-way merge of texts. |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
70 |
4363
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
71 Given strings BASE, OTHER, THIS, tries to produce a combined text |
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
72 incorporating the changes from both BASE->OTHER and BASE->THIS.""" |
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
73 def __init__(self, basetext, atext, btext, base=None, a=None, b=None): |
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
74 self.basetext = basetext |
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
75 self.atext = atext |
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
76 self.btext = btext |
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
77 if base is None: |
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
78 base = mdiff.splitnewlines(basetext) |
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
79 if a is None: |
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
80 a = mdiff.splitnewlines(atext) |
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
81 if b is None: |
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
82 b = mdiff.splitnewlines(btext) |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
83 self.base = base |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
84 self.a = a |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
85 self.b = b |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
86 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
87 def merge_lines(self, |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
88 name_a=None, |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
89 name_b=None, |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
90 name_base=None, |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
91 start_marker='<<<<<<<', |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
92 mid_marker='=======', |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
93 end_marker='>>>>>>>', |
26223
ed12abab068e
simplemerge: enable option to resolve conflicts one way
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26069
diff
changeset
|
94 base_marker=None, |
28072
c3e9269d9602
merge: minimize conflicts when common base is not shown (issue4447)
Ryan McElroy <rmcelroy@fb.com>
parents:
28071
diff
changeset
|
95 localorother=None, |
c3e9269d9602
merge: minimize conflicts when common base is not shown (issue4447)
Ryan McElroy <rmcelroy@fb.com>
parents:
28071
diff
changeset
|
96 minimize=False): |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
97 """Return merge in cvs-like form. |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
98 """ |
4364
d5c3a70f8422
polish the simplemerge command; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4363
diff
changeset
|
99 self.conflicts = False |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
100 newline = '\n' |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
101 if len(self.a) > 0: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
102 if self.a[0].endswith('\r\n'): |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
103 newline = '\r\n' |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
104 elif self.a[0].endswith('\r'): |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
105 newline = '\r' |
26069
09d6725cbc60
simplemerge: add 'mode' kwarg which - when 'union' - suppresses markers
Erik Huelsmann <ehuels@gmail.com>
parents:
25974
diff
changeset
|
106 if name_a and start_marker: |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
107 start_marker = start_marker + ' ' + name_a |
26069
09d6725cbc60
simplemerge: add 'mode' kwarg which - when 'union' - suppresses markers
Erik Huelsmann <ehuels@gmail.com>
parents:
25974
diff
changeset
|
108 if name_b and end_marker: |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
109 end_marker = end_marker + ' ' + name_b |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
110 if name_base and base_marker: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
111 base_marker = base_marker + ' ' + name_base |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
112 merge_regions = self.merge_regions() |
28072
c3e9269d9602
merge: minimize conflicts when common base is not shown (issue4447)
Ryan McElroy <rmcelroy@fb.com>
parents:
28071
diff
changeset
|
113 if minimize: |
c3e9269d9602
merge: minimize conflicts when common base is not shown (issue4447)
Ryan McElroy <rmcelroy@fb.com>
parents:
28071
diff
changeset
|
114 merge_regions = self.minimize(merge_regions) |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
115 for t in merge_regions: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
116 what = t[0] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
117 if what == 'unchanged': |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
118 for i in range(t[1], t[2]): |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
119 yield self.base[i] |
12401
4cdaf1adafc8
backout most of 4f8067c94729
Matt Mackall <mpm@selenic.com>
parents:
12387
diff
changeset
|
120 elif what == 'a' or what == 'same': |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
121 for i in range(t[1], t[2]): |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
122 yield self.a[i] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
123 elif what == 'b': |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
124 for i in range(t[1], t[2]): |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
125 yield self.b[i] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
126 elif what == 'conflict': |
26223
ed12abab068e
simplemerge: enable option to resolve conflicts one way
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26069
diff
changeset
|
127 if localorother == 'local': |
ed12abab068e
simplemerge: enable option to resolve conflicts one way
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26069
diff
changeset
|
128 for i in range(t[3], t[4]): |
ed12abab068e
simplemerge: enable option to resolve conflicts one way
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26069
diff
changeset
|
129 yield self.a[i] |
ed12abab068e
simplemerge: enable option to resolve conflicts one way
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26069
diff
changeset
|
130 elif localorother == 'other': |
ed12abab068e
simplemerge: enable option to resolve conflicts one way
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26069
diff
changeset
|
131 for i in range(t[5], t[6]): |
ed12abab068e
simplemerge: enable option to resolve conflicts one way
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26069
diff
changeset
|
132 yield self.b[i] |
ed12abab068e
simplemerge: enable option to resolve conflicts one way
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26069
diff
changeset
|
133 else: |
ed12abab068e
simplemerge: enable option to resolve conflicts one way
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26069
diff
changeset
|
134 self.conflicts = True |
ed12abab068e
simplemerge: enable option to resolve conflicts one way
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26069
diff
changeset
|
135 if start_marker is not None: |
ed12abab068e
simplemerge: enable option to resolve conflicts one way
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26069
diff
changeset
|
136 yield start_marker + newline |
ed12abab068e
simplemerge: enable option to resolve conflicts one way
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26069
diff
changeset
|
137 for i in range(t[3], t[4]): |
ed12abab068e
simplemerge: enable option to resolve conflicts one way
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26069
diff
changeset
|
138 yield self.a[i] |
ed12abab068e
simplemerge: enable option to resolve conflicts one way
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26069
diff
changeset
|
139 if base_marker is not None: |
ed12abab068e
simplemerge: enable option to resolve conflicts one way
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26069
diff
changeset
|
140 yield base_marker + newline |
ed12abab068e
simplemerge: enable option to resolve conflicts one way
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26069
diff
changeset
|
141 for i in range(t[1], t[2]): |
ed12abab068e
simplemerge: enable option to resolve conflicts one way
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26069
diff
changeset
|
142 yield self.base[i] |
ed12abab068e
simplemerge: enable option to resolve conflicts one way
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26069
diff
changeset
|
143 if mid_marker is not None: |
ed12abab068e
simplemerge: enable option to resolve conflicts one way
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26069
diff
changeset
|
144 yield mid_marker + newline |
ed12abab068e
simplemerge: enable option to resolve conflicts one way
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26069
diff
changeset
|
145 for i in range(t[5], t[6]): |
ed12abab068e
simplemerge: enable option to resolve conflicts one way
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26069
diff
changeset
|
146 yield self.b[i] |
ed12abab068e
simplemerge: enable option to resolve conflicts one way
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26069
diff
changeset
|
147 if end_marker is not None: |
ed12abab068e
simplemerge: enable option to resolve conflicts one way
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26069
diff
changeset
|
148 yield end_marker + newline |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
149 else: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
150 raise ValueError(what) |
5081
ea7b982b6c08
Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4408
diff
changeset
|
151 |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
152 def merge_groups(self): |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
153 """Yield sequence of line groups. Each one is a tuple: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
154 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
155 'unchanged', lines |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
156 Lines unchanged from base |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
157 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
158 'a', lines |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
159 Lines taken from a |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
160 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
161 'same', lines |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
162 Lines taken from a (and equal to b) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
163 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
164 'b', lines |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
165 Lines taken from b |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
166 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
167 'conflict', base_lines, a_lines, b_lines |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
168 Lines from base were changed to either a or b and conflict. |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
169 """ |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
170 for t in self.merge_regions(): |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
171 what = t[0] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
172 if what == 'unchanged': |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
173 yield what, self.base[t[1]:t[2]] |
12401
4cdaf1adafc8
backout most of 4f8067c94729
Matt Mackall <mpm@selenic.com>
parents:
12387
diff
changeset
|
174 elif what == 'a' or what == 'same': |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
175 yield what, self.a[t[1]:t[2]] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
176 elif what == 'b': |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
177 yield what, self.b[t[1]:t[2]] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
178 elif what == 'conflict': |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
179 yield (what, |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
180 self.base[t[1]:t[2]], |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
181 self.a[t[3]:t[4]], |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
182 self.b[t[5]:t[6]]) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
183 else: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
184 raise ValueError(what) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
185 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
186 def merge_regions(self): |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
187 """Return sequences of matching and conflicting regions. |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
188 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
189 This returns tuples, where the first value says what kind we |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
190 have: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
191 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
192 'unchanged', start, end |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
193 Take a region of base[start:end] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
194 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
195 'same', astart, aend |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
196 b and a are different from base but give the same result |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
197 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
198 'a', start, end |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
199 Non-clashing insertion from a[start:end] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
200 |
28070
a504794cee29
merge: add some useful documentation
Ryan McElroy <rmcelroy@fb.com>
parents:
26614
diff
changeset
|
201 'conflict', zstart, zend, astart, aend, bstart, bend |
a504794cee29
merge: add some useful documentation
Ryan McElroy <rmcelroy@fb.com>
parents:
26614
diff
changeset
|
202 Conflict between a and b, with z as common ancestor |
a504794cee29
merge: add some useful documentation
Ryan McElroy <rmcelroy@fb.com>
parents:
26614
diff
changeset
|
203 |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
204 Method is as follows: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
205 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
206 The two sequences align only on regions which match the base |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14329
diff
changeset
|
207 and both descendants. These are found by doing a two-way diff |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
208 of each one against the base, and then finding the |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
209 intersections between those regions. These "sync regions" |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
210 are by definition unchanged in both and easily dealt with. |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
211 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
212 The regions in between can be in any of three cases: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
213 conflicted, or changed on only one side. |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
214 """ |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
215 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
216 # section a[0:ia] has been disposed of, etc |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
217 iz = ia = ib = 0 |
5081
ea7b982b6c08
Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4408
diff
changeset
|
218 |
16683 | 219 for region in self.find_sync_regions(): |
220 zmatch, zend, amatch, aend, bmatch, bend = region | |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
221 #print 'match base [%d:%d]' % (zmatch, zend) |
5081
ea7b982b6c08
Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4408
diff
changeset
|
222 |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
223 matchlen = zend - zmatch |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
224 assert matchlen >= 0 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
225 assert matchlen == (aend - amatch) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
226 assert matchlen == (bend - bmatch) |
5081
ea7b982b6c08
Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4408
diff
changeset
|
227 |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
228 len_a = amatch - ia |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
229 len_b = bmatch - ib |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
230 len_base = zmatch - iz |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
231 assert len_a >= 0 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
232 assert len_b >= 0 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
233 assert len_base >= 0 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
234 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
235 #print 'unmatched a=%d, b=%d' % (len_a, len_b) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
236 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
237 if len_a or len_b: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
238 # try to avoid actually slicing the lists |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
239 equal_a = compare_range(self.a, ia, amatch, |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
240 self.base, iz, zmatch) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
241 equal_b = compare_range(self.b, ib, bmatch, |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
242 self.base, iz, zmatch) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
243 same = compare_range(self.a, ia, amatch, |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
244 self.b, ib, bmatch) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
245 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
246 if same: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
247 yield 'same', ia, amatch |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
248 elif equal_a and not equal_b: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
249 yield 'b', ib, bmatch |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
250 elif equal_b and not equal_a: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
251 yield 'a', ia, amatch |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
252 elif not equal_a and not equal_b: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
253 yield 'conflict', iz, zmatch, ia, amatch, ib, bmatch |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
254 else: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
255 raise AssertionError("can't handle a=b=base but unmatched") |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
256 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
257 ia = amatch |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
258 ib = bmatch |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
259 iz = zmatch |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
260 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
261 # if the same part of the base was deleted on both sides |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
262 # that's OK, we can just skip it. |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
263 |
5081
ea7b982b6c08
Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4408
diff
changeset
|
264 |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
265 if matchlen > 0: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
266 assert ia == amatch |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
267 assert ib == bmatch |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
268 assert iz == zmatch |
5081
ea7b982b6c08
Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4408
diff
changeset
|
269 |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
270 yield 'unchanged', zmatch, zend |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
271 iz = zend |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
272 ia = aend |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
273 ib = bend |
5081
ea7b982b6c08
Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4408
diff
changeset
|
274 |
28071
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
275 def minimize(self, merge_regions): |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
276 """Trim conflict regions of lines where A and B sides match. |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
277 |
30332
318a24b52eeb
spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents:
30323
diff
changeset
|
278 Lines where both A and B have made the same changes at the beginning |
28071
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
279 or the end of each merge region are eliminated from the conflict |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
280 region and are instead considered the same. |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
281 """ |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
282 for region in merge_regions: |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
283 if region[0] != "conflict": |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
284 yield region |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
285 continue |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
286 issue, z1, z2, a1, a2, b1, b2 = region |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
287 alen = a2 - a1 |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
288 blen = b2 - b1 |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
289 |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
290 # find matches at the front |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
291 ii = 0 |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
292 while ii < alen and ii < blen and \ |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
293 self.a[a1 + ii] == self.b[b1 + ii]: |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
294 ii += 1 |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
295 startmatches = ii |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
296 |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
297 # find matches at the end |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
298 ii = 0 |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
299 while ii < alen and ii < blen and \ |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
300 self.a[a2 - ii - 1] == self.b[b2 - ii - 1]: |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
301 ii += 1 |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
302 endmatches = ii |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
303 |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
304 if startmatches > 0: |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
305 yield 'same', a1, a1 + startmatches |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
306 |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
307 yield ('conflict', z1, z2, |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
308 a1 + startmatches, a2 - endmatches, |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
309 b1 + startmatches, b2 - endmatches) |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
310 |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
311 if endmatches > 0: |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
312 yield 'same', a2 - endmatches, a2 |
261324dd5f5b
merge: introduce method to minimize merge regions
Ryan McElroy <rmcelroy@fb.com>
parents:
28070
diff
changeset
|
313 |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
314 def find_sync_regions(self): |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14329
diff
changeset
|
315 """Return a list of sync regions, where both descendants match the base. |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
316 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
317 Generates a list of (base1, base2, a1, a2, b1, b2). There is |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
318 always a zero-length sync region at the end of all the files. |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
319 """ |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
320 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
321 ia = ib = 0 |
4363
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
322 amatches = mdiff.get_matching_blocks(self.basetext, self.atext) |
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
323 bmatches = mdiff.get_matching_blocks(self.basetext, self.btext) |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
324 len_a = len(amatches) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
325 len_b = len(bmatches) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
326 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
327 sl = [] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
328 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
329 while ia < len_a and ib < len_b: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
330 abase, amatch, alen = amatches[ia] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
331 bbase, bmatch, blen = bmatches[ib] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
332 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
333 # there is an unconflicted block at i; how long does it |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
334 # extend? until whichever one ends earlier. |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
8312
diff
changeset
|
335 i = intersect((abase, abase + alen), (bbase, bbase + blen)) |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
336 if i: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
337 intbase = i[0] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
338 intend = i[1] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
339 intlen = intend - intbase |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
340 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
341 # found a match of base[i[0], i[1]]; this may be less than |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
342 # the region that matches in either one |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
343 assert intlen <= alen |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
344 assert intlen <= blen |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
345 assert abase <= intbase |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
346 assert bbase <= intbase |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
347 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
348 asub = amatch + (intbase - abase) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
349 bsub = bmatch + (intbase - bbase) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
350 aend = asub + intlen |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
351 bend = bsub + intlen |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
352 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
353 assert self.base[intbase:intend] == self.a[asub:aend], \ |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
354 (self.base[intbase:intend], self.a[asub:aend]) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
355 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
356 assert self.base[intbase:intend] == self.b[bsub:bend] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
357 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
358 sl.append((intbase, intend, |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
359 asub, aend, |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
360 bsub, bend)) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
361 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
362 # advance whichever one ends first in the base text |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
363 if (abase + alen) < (bbase + blen): |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
364 ia += 1 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
365 else: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
366 ib += 1 |
5081
ea7b982b6c08
Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4408
diff
changeset
|
367 |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
368 intbase = len(self.base) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
369 abase = len(self.a) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
370 bbase = len(self.b) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
371 sl.append((intbase, intbase, abase, abase, bbase, bbase)) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
372 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
373 return sl |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
374 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
375 def find_unconflicted(self): |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
376 """Return a list of ranges in base that are not conflicted.""" |
4363
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
377 am = mdiff.get_matching_blocks(self.basetext, self.atext) |
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
378 bm = mdiff.get_matching_blocks(self.basetext, self.btext) |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
379 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
380 unc = [] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
381 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
382 while am and bm: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
383 # there is an unconflicted block at i; how long does it |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
384 # extend? until whichever one ends earlier. |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
385 a1 = am[0][0] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
386 a2 = a1 + am[0][2] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
387 b1 = bm[0][0] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
388 b2 = b1 + bm[0][2] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
389 i = intersect((a1, a2), (b1, b2)) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
390 if i: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
391 unc.append(i) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
392 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
393 if a2 < b2: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
394 del am[0] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
395 else: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
396 del bm[0] |
5081
ea7b982b6c08
Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4408
diff
changeset
|
397 |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
398 return unc |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
399 |
33825
de573184686e
simplemerge: extract verifytext as a helper function
Phil Cohen <phillco@fb.com>
parents:
33017
diff
changeset
|
400 def _verifytext(text, path, ui, opts): |
de573184686e
simplemerge: extract verifytext as a helper function
Phil Cohen <phillco@fb.com>
parents:
33017
diff
changeset
|
401 """verifies that text is non-binary (unless opts[text] is passed, |
de573184686e
simplemerge: extract verifytext as a helper function
Phil Cohen <phillco@fb.com>
parents:
33017
diff
changeset
|
402 then we just warn)""" |
de573184686e
simplemerge: extract verifytext as a helper function
Phil Cohen <phillco@fb.com>
parents:
33017
diff
changeset
|
403 if util.binary(text): |
de573184686e
simplemerge: extract verifytext as a helper function
Phil Cohen <phillco@fb.com>
parents:
33017
diff
changeset
|
404 msg = _("%s looks like a binary file.") % path |
de573184686e
simplemerge: extract verifytext as a helper function
Phil Cohen <phillco@fb.com>
parents:
33017
diff
changeset
|
405 if not opts.get('quiet'): |
de573184686e
simplemerge: extract verifytext as a helper function
Phil Cohen <phillco@fb.com>
parents:
33017
diff
changeset
|
406 ui.warn(_('warning: %s\n') % msg) |
de573184686e
simplemerge: extract verifytext as a helper function
Phil Cohen <phillco@fb.com>
parents:
33017
diff
changeset
|
407 if not opts.get('text'): |
de573184686e
simplemerge: extract verifytext as a helper function
Phil Cohen <phillco@fb.com>
parents:
33017
diff
changeset
|
408 raise error.Abort(msg) |
de573184686e
simplemerge: extract verifytext as a helper function
Phil Cohen <phillco@fb.com>
parents:
33017
diff
changeset
|
409 return text |
de573184686e
simplemerge: extract verifytext as a helper function
Phil Cohen <phillco@fb.com>
parents:
33017
diff
changeset
|
410 |
33830
aa6c290a77fa
filemerge: extract `_picklabels` as a helper function
Phil Cohen <phillco@fb.com>
parents:
33829
diff
changeset
|
411 def _picklabels(defaults, overrides): |
aa6c290a77fa
filemerge: extract `_picklabels` as a helper function
Phil Cohen <phillco@fb.com>
parents:
33829
diff
changeset
|
412 name_a, name_b, name_base = defaults |
aa6c290a77fa
filemerge: extract `_picklabels` as a helper function
Phil Cohen <phillco@fb.com>
parents:
33829
diff
changeset
|
413 |
aa6c290a77fa
filemerge: extract `_picklabels` as a helper function
Phil Cohen <phillco@fb.com>
parents:
33829
diff
changeset
|
414 if len(overrides) > 0: |
aa6c290a77fa
filemerge: extract `_picklabels` as a helper function
Phil Cohen <phillco@fb.com>
parents:
33829
diff
changeset
|
415 name_a = overrides[0] |
aa6c290a77fa
filemerge: extract `_picklabels` as a helper function
Phil Cohen <phillco@fb.com>
parents:
33829
diff
changeset
|
416 if len(overrides) > 1: |
aa6c290a77fa
filemerge: extract `_picklabels` as a helper function
Phil Cohen <phillco@fb.com>
parents:
33829
diff
changeset
|
417 name_b = overrides[1] |
aa6c290a77fa
filemerge: extract `_picklabels` as a helper function
Phil Cohen <phillco@fb.com>
parents:
33829
diff
changeset
|
418 if len(overrides) > 2: |
aa6c290a77fa
filemerge: extract `_picklabels` as a helper function
Phil Cohen <phillco@fb.com>
parents:
33829
diff
changeset
|
419 name_base = overrides[2] |
aa6c290a77fa
filemerge: extract `_picklabels` as a helper function
Phil Cohen <phillco@fb.com>
parents:
33829
diff
changeset
|
420 if len(overrides) > 3: |
aa6c290a77fa
filemerge: extract `_picklabels` as a helper function
Phil Cohen <phillco@fb.com>
parents:
33829
diff
changeset
|
421 raise error.Abort(_("can only specify three labels.")) |
aa6c290a77fa
filemerge: extract `_picklabels` as a helper function
Phil Cohen <phillco@fb.com>
parents:
33829
diff
changeset
|
422 |
aa6c290a77fa
filemerge: extract `_picklabels` as a helper function
Phil Cohen <phillco@fb.com>
parents:
33829
diff
changeset
|
423 return [name_a, name_b, name_base] |
aa6c290a77fa
filemerge: extract `_picklabels` as a helper function
Phil Cohen <phillco@fb.com>
parents:
33829
diff
changeset
|
424 |
33826
b3571dc0e6b8
simplemerge: add optional context parameters to simplemerge
Phil Cohen <phillco@fb.com>
parents:
33825
diff
changeset
|
425 def simplemerge(ui, localfile, basefile, otherfile, |
b3571dc0e6b8
simplemerge: add optional context parameters to simplemerge
Phil Cohen <phillco@fb.com>
parents:
33825
diff
changeset
|
426 localctx=None, basectx=None, otherctx=None, repo=None, **opts): |
33828
8b91a4ff23ad
simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents:
33826
diff
changeset
|
427 """Performs the simplemerge algorithm. |
8b91a4ff23ad
simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents:
33826
diff
changeset
|
428 |
8b91a4ff23ad
simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents:
33826
diff
changeset
|
429 {local|base|other}ctx are optional. If passed, they (local/base/other) will |
33829
b86fc43e4b73
simplemerge: write merge result to the localctx, if passed
Phil Cohen <phillco@fb.com>
parents:
33828
diff
changeset
|
430 be read from and the merge result written to (local). You should pass |
b86fc43e4b73
simplemerge: write merge result to the localctx, if passed
Phil Cohen <phillco@fb.com>
parents:
33828
diff
changeset
|
431 explicit labels in this mode since the default is to use the file paths.""" |
4364
d5c3a70f8422
polish the simplemerge command; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4363
diff
changeset
|
432 def readfile(filename): |
d5c3a70f8422
polish the simplemerge command; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4363
diff
changeset
|
433 f = open(filename, "rb") |
d5c3a70f8422
polish the simplemerge command; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4363
diff
changeset
|
434 text = f.read() |
d5c3a70f8422
polish the simplemerge command; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4363
diff
changeset
|
435 f.close() |
33825
de573184686e
simplemerge: extract verifytext as a helper function
Phil Cohen <phillco@fb.com>
parents:
33017
diff
changeset
|
436 return _verifytext(text, filename, ui, opts) |
4364
d5c3a70f8422
polish the simplemerge command; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4363
diff
changeset
|
437 |
33828
8b91a4ff23ad
simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents:
33826
diff
changeset
|
438 def readctx(ctx): |
8b91a4ff23ad
simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents:
33826
diff
changeset
|
439 if not ctx: |
8b91a4ff23ad
simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents:
33826
diff
changeset
|
440 return None |
8b91a4ff23ad
simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents:
33826
diff
changeset
|
441 if not repo: |
8b91a4ff23ad
simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents:
33826
diff
changeset
|
442 raise error.ProgrammingError('simplemerge: repo must be passed if ' |
8b91a4ff23ad
simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents:
33826
diff
changeset
|
443 'using contexts') |
8b91a4ff23ad
simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents:
33826
diff
changeset
|
444 # `wwritedata` is used to get the post-filter data from `ctx` (i.e., |
8b91a4ff23ad
simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents:
33826
diff
changeset
|
445 # what would have been in the working copy). Since merges were run in |
8b91a4ff23ad
simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents:
33826
diff
changeset
|
446 # the working copy, and thus used post-filter data, we do the same to |
8b91a4ff23ad
simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents:
33826
diff
changeset
|
447 # maintain behavior. |
8b91a4ff23ad
simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents:
33826
diff
changeset
|
448 return repo.wwritedata(ctx.path(), |
8b91a4ff23ad
simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents:
33826
diff
changeset
|
449 _verifytext(ctx.data(), ctx.path(), ui, opts)) |
8b91a4ff23ad
simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents:
33826
diff
changeset
|
450 |
33829
b86fc43e4b73
simplemerge: write merge result to the localctx, if passed
Phil Cohen <phillco@fb.com>
parents:
33828
diff
changeset
|
451 class ctxwriter(object): |
b86fc43e4b73
simplemerge: write merge result to the localctx, if passed
Phil Cohen <phillco@fb.com>
parents:
33828
diff
changeset
|
452 def __init__(self, ctx): |
b86fc43e4b73
simplemerge: write merge result to the localctx, if passed
Phil Cohen <phillco@fb.com>
parents:
33828
diff
changeset
|
453 self.ctx = ctx |
b86fc43e4b73
simplemerge: write merge result to the localctx, if passed
Phil Cohen <phillco@fb.com>
parents:
33828
diff
changeset
|
454 self.text = "" |
b86fc43e4b73
simplemerge: write merge result to the localctx, if passed
Phil Cohen <phillco@fb.com>
parents:
33828
diff
changeset
|
455 |
b86fc43e4b73
simplemerge: write merge result to the localctx, if passed
Phil Cohen <phillco@fb.com>
parents:
33828
diff
changeset
|
456 def write(self, text): |
b86fc43e4b73
simplemerge: write merge result to the localctx, if passed
Phil Cohen <phillco@fb.com>
parents:
33828
diff
changeset
|
457 self.text += text |
b86fc43e4b73
simplemerge: write merge result to the localctx, if passed
Phil Cohen <phillco@fb.com>
parents:
33828
diff
changeset
|
458 |
b86fc43e4b73
simplemerge: write merge result to the localctx, if passed
Phil Cohen <phillco@fb.com>
parents:
33828
diff
changeset
|
459 def close(self): |
b86fc43e4b73
simplemerge: write merge result to the localctx, if passed
Phil Cohen <phillco@fb.com>
parents:
33828
diff
changeset
|
460 self.ctx.write(self.text, self.ctx.flags()) |
b86fc43e4b73
simplemerge: write merge result to the localctx, if passed
Phil Cohen <phillco@fb.com>
parents:
33828
diff
changeset
|
461 |
26069
09d6725cbc60
simplemerge: add 'mode' kwarg which - when 'union' - suppresses markers
Erik Huelsmann <ehuels@gmail.com>
parents:
25974
diff
changeset
|
462 mode = opts.get('mode','merge') |
33830
aa6c290a77fa
filemerge: extract `_picklabels` as a helper function
Phil Cohen <phillco@fb.com>
parents:
33829
diff
changeset
|
463 name_a, name_b, name_base = None, None, None |
aa6c290a77fa
filemerge: extract `_picklabels` as a helper function
Phil Cohen <phillco@fb.com>
parents:
33829
diff
changeset
|
464 if mode != 'union': |
aa6c290a77fa
filemerge: extract `_picklabels` as a helper function
Phil Cohen <phillco@fb.com>
parents:
33829
diff
changeset
|
465 name_a, name_b, name_base = _picklabels([localfile, |
aa6c290a77fa
filemerge: extract `_picklabels` as a helper function
Phil Cohen <phillco@fb.com>
parents:
33829
diff
changeset
|
466 otherfile, None], |
aa6c290a77fa
filemerge: extract `_picklabels` as a helper function
Phil Cohen <phillco@fb.com>
parents:
33829
diff
changeset
|
467 opts.get('label', [])) |
4364
d5c3a70f8422
polish the simplemerge command; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4363
diff
changeset
|
468 |
14328
3c65cdcf3ba6
simplemerge: do not allow binary files to abort an entire merge
Steve Borho <steve@borho.org>
parents:
12401
diff
changeset
|
469 try: |
33828
8b91a4ff23ad
simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents:
33826
diff
changeset
|
470 localtext = readctx(localctx) if localctx else readfile(localfile) |
8b91a4ff23ad
simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents:
33826
diff
changeset
|
471 basetext = readctx(basectx) if basectx else readfile(basefile) |
8b91a4ff23ad
simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents:
33826
diff
changeset
|
472 othertext = readctx(otherctx) if otherctx else readfile(otherfile) |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26223
diff
changeset
|
473 except error.Abort: |
14328
3c65cdcf3ba6
simplemerge: do not allow binary files to abort an entire merge
Steve Borho <steve@borho.org>
parents:
12401
diff
changeset
|
474 return 1 |
4364
d5c3a70f8422
polish the simplemerge command; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4363
diff
changeset
|
475 |
33829
b86fc43e4b73
simplemerge: write merge result to the localctx, if passed
Phil Cohen <phillco@fb.com>
parents:
33828
diff
changeset
|
476 if opts.get('print'): |
b86fc43e4b73
simplemerge: write merge result to the localctx, if passed
Phil Cohen <phillco@fb.com>
parents:
33828
diff
changeset
|
477 out = ui.fout |
b86fc43e4b73
simplemerge: write merge result to the localctx, if passed
Phil Cohen <phillco@fb.com>
parents:
33828
diff
changeset
|
478 elif localctx: |
b86fc43e4b73
simplemerge: write merge result to the localctx, if passed
Phil Cohen <phillco@fb.com>
parents:
33828
diff
changeset
|
479 out = ctxwriter(localctx) |
b86fc43e4b73
simplemerge: write merge result to the localctx, if passed
Phil Cohen <phillco@fb.com>
parents:
33828
diff
changeset
|
480 else: |
b86fc43e4b73
simplemerge: write merge result to the localctx, if passed
Phil Cohen <phillco@fb.com>
parents:
33828
diff
changeset
|
481 localfile = os.path.realpath(localfile) |
33826
b3571dc0e6b8
simplemerge: add optional context parameters to simplemerge
Phil Cohen <phillco@fb.com>
parents:
33825
diff
changeset
|
482 opener = vfsmod.vfs(os.path.dirname(localfile)) |
b3571dc0e6b8
simplemerge: add optional context parameters to simplemerge
Phil Cohen <phillco@fb.com>
parents:
33825
diff
changeset
|
483 out = opener(os.path.basename(localfile), "w", atomictemp=True) |
4364
d5c3a70f8422
polish the simplemerge command; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4363
diff
changeset
|
484 |
d5c3a70f8422
polish the simplemerge command; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4363
diff
changeset
|
485 m3 = Merge3Text(basetext, localtext, othertext) |
28072
c3e9269d9602
merge: minimize conflicts when common base is not shown (issue4447)
Ryan McElroy <rmcelroy@fb.com>
parents:
28071
diff
changeset
|
486 extrakwargs = { |
c3e9269d9602
merge: minimize conflicts when common base is not shown (issue4447)
Ryan McElroy <rmcelroy@fb.com>
parents:
28071
diff
changeset
|
487 "localorother": opts.get("localorother", None), |
c3e9269d9602
merge: minimize conflicts when common base is not shown (issue4447)
Ryan McElroy <rmcelroy@fb.com>
parents:
28071
diff
changeset
|
488 'minimize': True, |
c3e9269d9602
merge: minimize conflicts when common base is not shown (issue4447)
Ryan McElroy <rmcelroy@fb.com>
parents:
28071
diff
changeset
|
489 } |
26069
09d6725cbc60
simplemerge: add 'mode' kwarg which - when 'union' - suppresses markers
Erik Huelsmann <ehuels@gmail.com>
parents:
25974
diff
changeset
|
490 if mode == 'union': |
09d6725cbc60
simplemerge: add 'mode' kwarg which - when 'union' - suppresses markers
Erik Huelsmann <ehuels@gmail.com>
parents:
25974
diff
changeset
|
491 extrakwargs['start_marker'] = None |
09d6725cbc60
simplemerge: add 'mode' kwarg which - when 'union' - suppresses markers
Erik Huelsmann <ehuels@gmail.com>
parents:
25974
diff
changeset
|
492 extrakwargs['mid_marker'] = None |
09d6725cbc60
simplemerge: add 'mode' kwarg which - when 'union' - suppresses markers
Erik Huelsmann <ehuels@gmail.com>
parents:
25974
diff
changeset
|
493 extrakwargs['end_marker'] = None |
09d6725cbc60
simplemerge: add 'mode' kwarg which - when 'union' - suppresses markers
Erik Huelsmann <ehuels@gmail.com>
parents:
25974
diff
changeset
|
494 elif name_base is not None: |
22024
372ae2745acf
simplemerge: support three labels when merging
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22023
diff
changeset
|
495 extrakwargs['base_marker'] = '|||||||' |
372ae2745acf
simplemerge: support three labels when merging
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22023
diff
changeset
|
496 extrakwargs['name_base'] = name_base |
28072
c3e9269d9602
merge: minimize conflicts when common base is not shown (issue4447)
Ryan McElroy <rmcelroy@fb.com>
parents:
28071
diff
changeset
|
497 extrakwargs['minimize'] = False |
33017
c31d45623304
py3: convert kwargs' keys' to str using pycompat.strkwargs()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31238
diff
changeset
|
498 for line in m3.merge_lines(name_a=name_a, name_b=name_b, |
c31d45623304
py3: convert kwargs' keys' to str using pycompat.strkwargs()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31238
diff
changeset
|
499 **pycompat.strkwargs(extrakwargs)): |
4364
d5c3a70f8422
polish the simplemerge command; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4363
diff
changeset
|
500 out.write(line) |
d5c3a70f8422
polish the simplemerge command; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4363
diff
changeset
|
501 |
d5c3a70f8422
polish the simplemerge command; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4363
diff
changeset
|
502 if not opts.get('print'): |
15057
774da7121fc9
atomictempfile: make close() consistent with other file-like objects.
Greg Ward <greg@gerg.ca>
parents:
14549
diff
changeset
|
503 out.close() |
4364
d5c3a70f8422
polish the simplemerge command; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4363
diff
changeset
|
504 |
26069
09d6725cbc60
simplemerge: add 'mode' kwarg which - when 'union' - suppresses markers
Erik Huelsmann <ehuels@gmail.com>
parents:
25974
diff
changeset
|
505 if m3.conflicts and not mode == 'union': |
4364
d5c3a70f8422
polish the simplemerge command; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4363
diff
changeset
|
506 return 1 |