annotate mercurial/simplemerge.py @ 49241:6b10151b9621 stable 6.1.3

narrow_widen_acl: enforce narrowacl in narrow_widen (SEC) Reviewer note: this was sent by the author as a simple bugfix, but can be considered a security patch, since it allows users to access things outside of the ACL, hence the (SEC) prefix. However, this affects the `narrow` extention which is still marked as experimental and has relatively few users aside from large companies with their own security layers on top from what we can gather. We feel (Alphare: or at least, I feel) like pinging the packaging list is enough in this case.
author Sandu Turcan <idlsoft@gmail.com>
date Tue, 03 May 2022 21:44:30 -0400
parents 7dad4665d223
children 6000f5b25c9b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 from .i18n import _
241a1324a180 simplemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22056
diff changeset
22 from . import (
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26223
diff changeset
23 error,
25974
241a1324a180 simplemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22056
diff changeset
24 mdiff,
33017
c31d45623304 py3: convert kwargs' keys' to str using pycompat.strkwargs()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31238
diff changeset
25 pycompat,
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35368
diff changeset
26 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
27 from .utils import stringutil
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
28
4363
2e3c54fb79a3 actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4362
diff changeset
29
4362
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
30 def intersect(ra, rb):
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
31 """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
32
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
33 >>> intersect((0, 10), (0, 6))
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
34 (0, 6)
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
35 >>> intersect((0, 10), (5, 15))
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
36 (5, 10)
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
37 >>> intersect((0, 10), (10, 15))
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
38 >>> intersect((0, 9), (10, 15))
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
39 >>> intersect((0, 9), (7, 15))
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
40 (7, 9)
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
41 """
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
42 assert ra[0] <= ra[1]
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
43 assert rb[0] <= rb[1]
5081
ea7b982b6c08 Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4408
diff changeset
44
4362
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
45 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
46 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
47 if sa < sb:
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
48 return sa, sb
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
49 else:
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
50 return None
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
51
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
52
4362
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
53 def compare_range(a, astart, aend, b, bstart, bend):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44949
diff changeset
54 """Compare a[astart:aend] == b[bstart:bend], without slicing."""
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 8312
diff changeset
55 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
56 return False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
57 for ia, ib in zip(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
58 pycompat.xrange(astart, aend), pycompat.xrange(bstart, bend)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
59 ):
4362
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
60 if a[ia] != b[ib]:
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 else:
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
63 return True
5081
ea7b982b6c08 Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4408
diff changeset
64
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
65
4363
2e3c54fb79a3 actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4362
diff changeset
66 class Merge3Text(object):
4362
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
67 """3-way merge of texts.
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
68
4363
2e3c54fb79a3 actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4362
diff changeset
69 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
70 incorporating the changes from both BASE->OTHER and BASE->THIS."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
71
4363
2e3c54fb79a3 actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4362
diff changeset
72 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
73 self.basetext = basetext
2e3c54fb79a3 actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4362
diff changeset
74 self.atext = atext
2e3c54fb79a3 actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4362
diff changeset
75 self.btext = btext
2e3c54fb79a3 actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4362
diff changeset
76 if base is None:
2e3c54fb79a3 actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4362
diff changeset
77 base = mdiff.splitnewlines(basetext)
2e3c54fb79a3 actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4362
diff changeset
78 if a is None:
2e3c54fb79a3 actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4362
diff changeset
79 a = mdiff.splitnewlines(atext)
2e3c54fb79a3 actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4362
diff changeset
80 if b is None:
2e3c54fb79a3 actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4362
diff changeset
81 b = mdiff.splitnewlines(btext)
4362
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
82 self.base = base
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
83 self.a = a
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
84 self.b = b
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
85
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
86 def merge_groups(self):
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
87 """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
88
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
89 'unchanged', lines
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
90 Lines unchanged from base
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
91
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
92 'a', lines
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
93 Lines taken from a
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
94
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
95 'same', lines
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
96 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
97
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
98 'b', lines
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
99 Lines taken from b
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
100
48547
374bf34c9ffd simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents: 48516
diff changeset
101 'conflict', (base_lines, a_lines, b_lines)
4362
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
102 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
103 """
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
104 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
105 what = t[0]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
106 if what == b'unchanged':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
107 yield what, self.base[t[1] : t[2]]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
108 elif what == b'a' or what == b'same':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
109 yield what, self.a[t[1] : t[2]]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
110 elif what == b'b':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
111 yield what, self.b[t[1] : t[2]]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
112 elif what == b'conflict':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
113 yield (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
114 what,
48547
374bf34c9ffd simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents: 48516
diff changeset
115 (
374bf34c9ffd simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents: 48516
diff changeset
116 self.base[t[1] : t[2]],
374bf34c9ffd simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents: 48516
diff changeset
117 self.a[t[3] : t[4]],
374bf34c9ffd simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents: 48516
diff changeset
118 self.b[t[5] : t[6]],
374bf34c9ffd simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents: 48516
diff changeset
119 ),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
120 )
4362
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
121 else:
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
122 raise ValueError(what)
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
123
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
124 def merge_regions(self):
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
125 """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
126
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
127 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
128 have:
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
129
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
130 'unchanged', start, end
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
131 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
132
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
133 'same', astart, aend
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
134 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
135
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
136 'a', start, end
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
137 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
138
28070
a504794cee29 merge: add some useful documentation
Ryan McElroy <rmcelroy@fb.com>
parents: 26614
diff changeset
139 'conflict', zstart, zend, astart, aend, bstart, bend
a504794cee29 merge: add some useful documentation
Ryan McElroy <rmcelroy@fb.com>
parents: 26614
diff changeset
140 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
141
4362
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
142 Method is as follows:
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
143
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
144 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
145 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
146 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
147 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
148 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
149
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
150 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
151 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
152 """
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
153
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
154 # 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
155 iz = ia = ib = 0
5081
ea7b982b6c08 Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4408
diff changeset
156
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 15782
diff changeset
157 for region in self.find_sync_regions():
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 15782
diff changeset
158 zmatch, zend, amatch, aend, bmatch, bend = region
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
159 # print 'match base [%d:%d]' % (zmatch, zend)
5081
ea7b982b6c08 Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4408
diff changeset
160
4362
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
161 matchlen = zend - zmatch
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
162 assert matchlen >= 0
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
163 assert matchlen == (aend - amatch)
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
164 assert matchlen == (bend - bmatch)
5081
ea7b982b6c08 Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4408
diff changeset
165
4362
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
166 len_a = amatch - ia
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
167 len_b = bmatch - ib
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
168 len_base = zmatch - iz
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
169 assert len_a >= 0
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
170 assert len_b >= 0
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
171 assert len_base >= 0
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
172
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
173 # print 'unmatched a=%d, b=%d' % (len_a, len_b)
4362
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
174
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
175 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
176 # try to avoid actually slicing the lists
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
177 equal_a = compare_range(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
178 self.a, ia, amatch, self.base, iz, zmatch
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
179 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
180 equal_b = compare_range(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
181 self.b, ib, bmatch, self.base, iz, zmatch
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
182 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
183 same = compare_range(self.a, ia, amatch, self.b, ib, bmatch)
4362
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
184
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
185 if same:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
186 yield b'same', ia, amatch
4362
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
187 elif equal_a and not equal_b:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
188 yield b'b', ib, bmatch
4362
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
189 elif equal_b and not equal_a:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
190 yield b'a', ia, amatch
4362
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
191 elif not equal_a and not equal_b:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
192 yield b'conflict', iz, zmatch, ia, amatch, ib, bmatch
4362
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
193 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
194 raise AssertionError(b"can't handle a=b=base but unmatched")
4362
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
195
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
196 ia = amatch
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
197 ib = bmatch
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
198 iz = zmatch
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
199
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
200 # 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
201 # 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
202
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
203 if matchlen > 0:
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
204 assert ia == amatch
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
205 assert ib == bmatch
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
206 assert iz == zmatch
5081
ea7b982b6c08 Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4408
diff changeset
207
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
208 yield b'unchanged', zmatch, zend
4362
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
209 iz = zend
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
210 ia = aend
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
211 ib = bend
5081
ea7b982b6c08 Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4408
diff changeset
212
4362
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
213 def find_sync_regions(self):
14549
48ec0763afbb check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents: 14329
diff changeset
214 """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
215
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
216 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
217 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
218 """
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
219
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
220 ia = ib = 0
4363
2e3c54fb79a3 actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4362
diff changeset
221 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
222 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
223 len_a = len(amatches)
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
224 len_b = len(bmatches)
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
225
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
226 sl = []
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
227
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
228 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
229 abase, amatch, alen = amatches[ia]
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
230 bbase, bmatch, blen = bmatches[ib]
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
231
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
232 # 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
233 # extend? until whichever one ends earlier.
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 8312
diff changeset
234 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
235 if i:
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
236 intbase = i[0]
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
237 intend = i[1]
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
238 intlen = intend - intbase
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
239
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
240 # 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
241 # 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
242 assert intlen <= alen
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
243 assert intlen <= blen
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
244 assert abase <= intbase
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
245 assert bbase <= intbase
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
246
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
247 asub = amatch + (intbase - abase)
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
248 bsub = bmatch + (intbase - bbase)
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
249 aend = asub + intlen
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
250 bend = bsub + intlen
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
251
41759
aaad36b88298 cleanup: use () to wrap long lines instead of \
Augie Fackler <augie@google.com>
parents: 38783
diff changeset
252 assert self.base[intbase:intend] == self.a[asub:aend], (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
253 self.base[intbase:intend],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
254 self.a[asub:aend],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
255 )
4362
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 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
258
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
259 sl.append((intbase, intend, asub, aend, bsub, bend))
4362
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 # 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
262 if (abase + alen) < (bbase + blen):
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
263 ia += 1
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
264 else:
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
265 ib += 1
5081
ea7b982b6c08 Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4408
diff changeset
266
4362
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
267 intbase = len(self.base)
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
268 abase = len(self.a)
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
269 bbase = len(self.b)
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
270 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
271
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
272 return sl
465b9ea02868 Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff changeset
273
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
274
48754
d9602f0df4f3 simplemerge: remove code for checking binary input now that callers do it
Martin von Zweigbergk <martinvonz@google.com>
parents: 48751
diff changeset
275 def _verifytext(input):
33825
de573184686e simplemerge: extract verifytext as a helper function
Phil Cohen <phillco@fb.com>
parents: 33017
diff changeset
276 """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
277 then we just warn)"""
48754
d9602f0df4f3 simplemerge: remove code for checking binary input now that callers do it
Martin von Zweigbergk <martinvonz@google.com>
parents: 48751
diff changeset
278 if stringutil.binary(input.text()):
d9602f0df4f3 simplemerge: remove code for checking binary input now that callers do it
Martin von Zweigbergk <martinvonz@google.com>
parents: 48751
diff changeset
279 msg = _(b"%s looks like a binary file.") % input.fctx.path()
d9602f0df4f3 simplemerge: remove code for checking binary input now that callers do it
Martin von Zweigbergk <martinvonz@google.com>
parents: 48751
diff changeset
280 raise error.Abort(msg)
33825
de573184686e simplemerge: extract verifytext as a helper function
Phil Cohen <phillco@fb.com>
parents: 33017
diff changeset
281
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
282
48578
77e24ee8994b simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents: 48566
diff changeset
283 def _format_labels(*inputs):
48587
3c8cc987672e simplemerge: take over formatting of label from `filemerge`
Martin von Zweigbergk <martinvonz@google.com>
parents: 48578
diff changeset
284 pad = max(len(input.label) if input.label else 0 for input in inputs)
48578
77e24ee8994b simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents: 48566
diff changeset
285 labels = []
77e24ee8994b simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents: 48566
diff changeset
286 for input in inputs:
77e24ee8994b simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents: 48566
diff changeset
287 if input.label:
48587
3c8cc987672e simplemerge: take over formatting of label from `filemerge`
Martin von Zweigbergk <martinvonz@google.com>
parents: 48578
diff changeset
288 if input.label_detail:
3c8cc987672e simplemerge: take over formatting of label from `filemerge`
Martin von Zweigbergk <martinvonz@google.com>
parents: 48578
diff changeset
289 label = (
3c8cc987672e simplemerge: take over formatting of label from `filemerge`
Martin von Zweigbergk <martinvonz@google.com>
parents: 48578
diff changeset
290 (input.label + b':').ljust(pad + 1)
3c8cc987672e simplemerge: take over formatting of label from `filemerge`
Martin von Zweigbergk <martinvonz@google.com>
parents: 48578
diff changeset
291 + b' '
3c8cc987672e simplemerge: take over formatting of label from `filemerge`
Martin von Zweigbergk <martinvonz@google.com>
parents: 48578
diff changeset
292 + input.label_detail
3c8cc987672e simplemerge: take over formatting of label from `filemerge`
Martin von Zweigbergk <martinvonz@google.com>
parents: 48578
diff changeset
293 )
3c8cc987672e simplemerge: take over formatting of label from `filemerge`
Martin von Zweigbergk <martinvonz@google.com>
parents: 48578
diff changeset
294 else:
3c8cc987672e simplemerge: take over formatting of label from `filemerge`
Martin von Zweigbergk <martinvonz@google.com>
parents: 48578
diff changeset
295 label = input.label
3c8cc987672e simplemerge: take over formatting of label from `filemerge`
Martin von Zweigbergk <martinvonz@google.com>
parents: 48578
diff changeset
296 # 8 for the prefix of conflict marker lines (e.g. '<<<<<<< ')
3c8cc987672e simplemerge: take over formatting of label from `filemerge`
Martin von Zweigbergk <martinvonz@google.com>
parents: 48578
diff changeset
297 labels.append(stringutil.ellipsis(label, 80 - 8))
48578
77e24ee8994b simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents: 48566
diff changeset
298 else:
77e24ee8994b simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents: 48566
diff changeset
299 labels.append(None)
77e24ee8994b simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents: 48566
diff changeset
300 return labels
33830
aa6c290a77fa filemerge: extract `_picklabels` as a helper function
Phil Cohen <phillco@fb.com>
parents: 33829
diff changeset
301
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
302
48559
b5e1283c0475 simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents: 48558
diff changeset
303 def _detect_newline(m3):
b5e1283c0475 simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents: 48558
diff changeset
304 if len(m3.a) > 0:
b5e1283c0475 simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents: 48558
diff changeset
305 if m3.a[0].endswith(b'\r\n'):
b5e1283c0475 simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents: 48558
diff changeset
306 return b'\r\n'
b5e1283c0475 simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents: 48558
diff changeset
307 elif m3.a[0].endswith(b'\r'):
b5e1283c0475 simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents: 48558
diff changeset
308 return b'\r'
b5e1283c0475 simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents: 48558
diff changeset
309 return b'\n'
b5e1283c0475 simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents: 48558
diff changeset
310
b5e1283c0475 simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents: 48558
diff changeset
311
48564
c2537aec3bb6 simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 48563
diff changeset
312 def _minimize(a_lines, b_lines):
48563
ad0c6bf6f02e simplemerge: make minimize() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48562
diff changeset
313 """Trim conflict regions of lines where A and B sides match.
ad0c6bf6f02e simplemerge: make minimize() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48562
diff changeset
314
ad0c6bf6f02e simplemerge: make minimize() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48562
diff changeset
315 Lines where both A and B have made the same changes at the beginning
ad0c6bf6f02e simplemerge: make minimize() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48562
diff changeset
316 or the end of each merge region are eliminated from the conflict
ad0c6bf6f02e simplemerge: make minimize() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48562
diff changeset
317 region and are instead considered the same.
ad0c6bf6f02e simplemerge: make minimize() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48562
diff changeset
318 """
48564
c2537aec3bb6 simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 48563
diff changeset
319 alen = len(a_lines)
c2537aec3bb6 simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 48563
diff changeset
320 blen = len(b_lines)
48563
ad0c6bf6f02e simplemerge: make minimize() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48562
diff changeset
321
48564
c2537aec3bb6 simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 48563
diff changeset
322 # find matches at the front
c2537aec3bb6 simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 48563
diff changeset
323 ii = 0
c2537aec3bb6 simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 48563
diff changeset
324 while ii < alen and ii < blen and a_lines[ii] == b_lines[ii]:
c2537aec3bb6 simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 48563
diff changeset
325 ii += 1
c2537aec3bb6 simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 48563
diff changeset
326 startmatches = ii
48563
ad0c6bf6f02e simplemerge: make minimize() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48562
diff changeset
327
48564
c2537aec3bb6 simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 48563
diff changeset
328 # find matches at the end
c2537aec3bb6 simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 48563
diff changeset
329 ii = 0
c2537aec3bb6 simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 48563
diff changeset
330 while ii < alen and ii < blen and a_lines[-ii - 1] == b_lines[-ii - 1]:
c2537aec3bb6 simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 48563
diff changeset
331 ii += 1
c2537aec3bb6 simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 48563
diff changeset
332 endmatches = ii
48563
ad0c6bf6f02e simplemerge: make minimize() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48562
diff changeset
333
48564
c2537aec3bb6 simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 48563
diff changeset
334 lines_before = a_lines[:startmatches]
c2537aec3bb6 simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 48563
diff changeset
335 new_a_lines = a_lines[startmatches : alen - endmatches]
c2537aec3bb6 simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 48563
diff changeset
336 new_b_lines = b_lines[startmatches : blen - endmatches]
c2537aec3bb6 simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 48563
diff changeset
337 lines_after = a_lines[alen - endmatches :]
c2537aec3bb6 simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 48563
diff changeset
338 return lines_before, new_a_lines, new_b_lines, lines_after
48563
ad0c6bf6f02e simplemerge: make minimize() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48562
diff changeset
339
ad0c6bf6f02e simplemerge: make minimize() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48562
diff changeset
340
48562
12ac4401ff7d simplemerge: simplify and rename `render_markers()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 48561
diff changeset
341 def render_minimized(
48557
c6649c53073f simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48556
diff changeset
342 m3,
c6649c53073f simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48556
diff changeset
343 name_a=None,
c6649c53073f simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48556
diff changeset
344 name_b=None,
c6649c53073f simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48556
diff changeset
345 start_marker=b'<<<<<<<',
c6649c53073f simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48556
diff changeset
346 mid_marker=b'=======',
c6649c53073f simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48556
diff changeset
347 end_marker=b'>>>>>>>',
c6649c53073f simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48556
diff changeset
348 ):
c6649c53073f simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48556
diff changeset
349 """Return merge in cvs-like form."""
48559
b5e1283c0475 simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents: 48558
diff changeset
350 newline = _detect_newline(m3)
48557
c6649c53073f simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48556
diff changeset
351 conflicts = False
48562
12ac4401ff7d simplemerge: simplify and rename `render_markers()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 48561
diff changeset
352 if name_a:
48557
c6649c53073f simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48556
diff changeset
353 start_marker = start_marker + b' ' + name_a
48562
12ac4401ff7d simplemerge: simplify and rename `render_markers()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 48561
diff changeset
354 if name_b:
48557
c6649c53073f simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48556
diff changeset
355 end_marker = end_marker + b' ' + name_b
c6649c53073f simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48556
diff changeset
356 merge_groups = m3.merge_groups()
c6649c53073f simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48556
diff changeset
357 lines = []
c6649c53073f simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48556
diff changeset
358 for what, group_lines in merge_groups:
c6649c53073f simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48556
diff changeset
359 if what == b'conflict':
48564
c2537aec3bb6 simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 48563
diff changeset
360 conflicts = True
48557
c6649c53073f simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48556
diff changeset
361 base_lines, a_lines, b_lines = group_lines
48564
c2537aec3bb6 simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 48563
diff changeset
362 minimized = _minimize(a_lines, b_lines)
c2537aec3bb6 simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 48563
diff changeset
363 lines_before, a_lines, b_lines, lines_after = minimized
c2537aec3bb6 simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 48563
diff changeset
364 lines.extend(lines_before)
48562
12ac4401ff7d simplemerge: simplify and rename `render_markers()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 48561
diff changeset
365 lines.append(start_marker + newline)
48557
c6649c53073f simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48556
diff changeset
366 lines.extend(a_lines)
48562
12ac4401ff7d simplemerge: simplify and rename `render_markers()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 48561
diff changeset
367 lines.append(mid_marker + newline)
48557
c6649c53073f simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48556
diff changeset
368 lines.extend(b_lines)
48562
12ac4401ff7d simplemerge: simplify and rename `render_markers()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 48561
diff changeset
369 lines.append(end_marker + newline)
48564
c2537aec3bb6 simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 48563
diff changeset
370 lines.extend(lines_after)
48557
c6649c53073f simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48556
diff changeset
371 else:
c6649c53073f simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48556
diff changeset
372 lines.extend(group_lines)
c6649c53073f simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48556
diff changeset
373 return lines, conflicts
c6649c53073f simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48556
diff changeset
374
c6649c53073f simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents: 48556
diff changeset
375
48561
69e76b2aad3d simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48560
diff changeset
376 def render_merge3(m3, name_a, name_b, name_base):
69e76b2aad3d simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48560
diff changeset
377 """Render conflicts as 3-way conflict markers."""
69e76b2aad3d simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48560
diff changeset
378 newline = _detect_newline(m3)
69e76b2aad3d simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48560
diff changeset
379 conflicts = False
69e76b2aad3d simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48560
diff changeset
380 lines = []
69e76b2aad3d simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48560
diff changeset
381 for what, group_lines in m3.merge_groups():
69e76b2aad3d simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48560
diff changeset
382 if what == b'conflict':
69e76b2aad3d simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48560
diff changeset
383 base_lines, a_lines, b_lines = group_lines
69e76b2aad3d simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48560
diff changeset
384 conflicts = True
69e76b2aad3d simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48560
diff changeset
385 lines.append(b'<<<<<<< ' + name_a + newline)
69e76b2aad3d simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48560
diff changeset
386 lines.extend(a_lines)
69e76b2aad3d simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48560
diff changeset
387 lines.append(b'||||||| ' + name_base + newline)
69e76b2aad3d simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48560
diff changeset
388 lines.extend(base_lines)
69e76b2aad3d simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48560
diff changeset
389 lines.append(b'=======' + newline)
69e76b2aad3d simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48560
diff changeset
390 lines.extend(b_lines)
69e76b2aad3d simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48560
diff changeset
391 lines.append(b'>>>>>>> ' + name_b + newline)
69e76b2aad3d simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48560
diff changeset
392 else:
69e76b2aad3d simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48560
diff changeset
393 lines.extend(group_lines)
69e76b2aad3d simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48560
diff changeset
394 return lines, conflicts
69e76b2aad3d simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48560
diff changeset
395
69e76b2aad3d simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48560
diff changeset
396
48558
2dbee604a4f0 simplemerge: clarify names of functions that render conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48557
diff changeset
397 def render_mergediff(m3, name_a, name_b, name_base):
48561
69e76b2aad3d simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48560
diff changeset
398 """Render conflicts as conflict markers with one snapshot and one diff."""
48559
b5e1283c0475 simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents: 48558
diff changeset
399 newline = _detect_newline(m3)
46108
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
400 lines = []
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
401 conflicts = False
48547
374bf34c9ffd simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents: 48516
diff changeset
402 for what, group_lines in m3.merge_groups():
374bf34c9ffd simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents: 48516
diff changeset
403 if what == b'conflict':
374bf34c9ffd simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents: 48516
diff changeset
404 base_lines, a_lines, b_lines = group_lines
46108
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
405 base_text = b''.join(base_lines)
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
406 b_blocks = list(
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
407 mdiff.allblocks(
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
408 base_text,
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
409 b''.join(b_lines),
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
410 lines1=base_lines,
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
411 lines2=b_lines,
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
412 )
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
413 )
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
414 a_blocks = list(
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
415 mdiff.allblocks(
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
416 base_text,
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
417 b''.join(a_lines),
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
418 lines1=base_lines,
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
419 lines2=b_lines,
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
420 )
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
421 )
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
422
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
423 def matching_lines(blocks):
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
424 return sum(
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
425 block[1] - block[0]
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
426 for block, kind in blocks
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
427 if kind == b'='
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
428 )
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
429
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
430 def diff_lines(blocks, lines1, lines2):
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
431 for block, kind in blocks:
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
432 if kind == b'=':
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
433 for line in lines1[block[0] : block[1]]:
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
434 yield b' ' + line
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
435 else:
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
436 for line in lines1[block[0] : block[1]]:
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
437 yield b'-' + line
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
438 for line in lines2[block[2] : block[3]]:
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
439 yield b'+' + line
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
440
48559
b5e1283c0475 simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents: 48558
diff changeset
441 lines.append(b"<<<<<<<" + newline)
46108
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
442 if matching_lines(a_blocks) < matching_lines(b_blocks):
48559
b5e1283c0475 simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents: 48558
diff changeset
443 lines.append(b"======= " + name_a + newline)
46108
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
444 lines.extend(a_lines)
48559
b5e1283c0475 simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents: 48558
diff changeset
445 lines.append(b"------- " + name_base + newline)
b5e1283c0475 simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents: 48558
diff changeset
446 lines.append(b"+++++++ " + name_b + newline)
46108
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
447 lines.extend(diff_lines(b_blocks, base_lines, b_lines))
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
448 else:
48559
b5e1283c0475 simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents: 48558
diff changeset
449 lines.append(b"------- " + name_base + newline)
b5e1283c0475 simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents: 48558
diff changeset
450 lines.append(b"+++++++ " + name_a + newline)
46108
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
451 lines.extend(diff_lines(a_blocks, base_lines, a_lines))
48559
b5e1283c0475 simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents: 48558
diff changeset
452 lines.append(b"======= " + name_b + newline)
46108
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
453 lines.extend(b_lines)
48559
b5e1283c0475 simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents: 48558
diff changeset
454 lines.append(b">>>>>>>" + newline)
46108
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
455 conflicts = True
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
456 else:
48547
374bf34c9ffd simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents: 48516
diff changeset
457 lines.extend(group_lines)
46108
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
458 return lines, conflicts
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
459
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
460
48514
fb691fa90807 simplemerge: add a specialized function for "union", "local", "other"
Martin von Zweigbergk <martinvonz@google.com>
parents: 48509
diff changeset
461 def _resolve(m3, sides):
fb691fa90807 simplemerge: add a specialized function for "union", "local", "other"
Martin von Zweigbergk <martinvonz@google.com>
parents: 48509
diff changeset
462 lines = []
48547
374bf34c9ffd simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents: 48516
diff changeset
463 for what, group_lines in m3.merge_groups():
374bf34c9ffd simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents: 48516
diff changeset
464 if what == b'conflict':
48514
fb691fa90807 simplemerge: add a specialized function for "union", "local", "other"
Martin von Zweigbergk <martinvonz@google.com>
parents: 48509
diff changeset
465 for side in sides:
48547
374bf34c9ffd simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents: 48516
diff changeset
466 lines.extend(group_lines[side])
48514
fb691fa90807 simplemerge: add a specialized function for "union", "local", "other"
Martin von Zweigbergk <martinvonz@google.com>
parents: 48509
diff changeset
467 else:
48547
374bf34c9ffd simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents: 48516
diff changeset
468 lines.extend(group_lines)
48514
fb691fa90807 simplemerge: add a specialized function for "union", "local", "other"
Martin von Zweigbergk <martinvonz@google.com>
parents: 48509
diff changeset
469 return lines
fb691fa90807 simplemerge: add a specialized function for "union", "local", "other"
Martin von Zweigbergk <martinvonz@google.com>
parents: 48509
diff changeset
470
fb691fa90807 simplemerge: add a specialized function for "union", "local", "other"
Martin von Zweigbergk <martinvonz@google.com>
parents: 48509
diff changeset
471
48578
77e24ee8994b simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents: 48566
diff changeset
472 class MergeInput(object):
48750
aed8ef33db8b simplemerge: convert MergeInput to regular, non-attr.ib class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48749
diff changeset
473 def __init__(self, fctx, label=None, label_detail=None):
aed8ef33db8b simplemerge: convert MergeInput to regular, non-attr.ib class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48749
diff changeset
474 self.fctx = fctx
aed8ef33db8b simplemerge: convert MergeInput to regular, non-attr.ib class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48749
diff changeset
475 self.label = label
aed8ef33db8b simplemerge: convert MergeInput to regular, non-attr.ib class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48749
diff changeset
476 # If the "detail" part is set, then that is rendered after the label and
aed8ef33db8b simplemerge: convert MergeInput to regular, non-attr.ib class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48749
diff changeset
477 # separated by a ':'. The label is padded to make the ':' aligned among
aed8ef33db8b simplemerge: convert MergeInput to regular, non-attr.ib class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48749
diff changeset
478 # all merge inputs.
aed8ef33db8b simplemerge: convert MergeInput to regular, non-attr.ib class
Martin von Zweigbergk <martinvonz@google.com>
parents: 48749
diff changeset
479 self.label_detail = label_detail
48751
59c6724ddccb simplemerge: store input data in MergeInput
Martin von Zweigbergk <martinvonz@google.com>
parents: 48750
diff changeset
480 self._text = None
59c6724ddccb simplemerge: store input data in MergeInput
Martin von Zweigbergk <martinvonz@google.com>
parents: 48750
diff changeset
481
59c6724ddccb simplemerge: store input data in MergeInput
Martin von Zweigbergk <martinvonz@google.com>
parents: 48750
diff changeset
482 def text(self):
59c6724ddccb simplemerge: store input data in MergeInput
Martin von Zweigbergk <martinvonz@google.com>
parents: 48750
diff changeset
483 if self._text is None:
59c6724ddccb simplemerge: store input data in MergeInput
Martin von Zweigbergk <martinvonz@google.com>
parents: 48750
diff changeset
484 # Merges were always run in the working copy before, which means
59c6724ddccb simplemerge: store input data in MergeInput
Martin von Zweigbergk <martinvonz@google.com>
parents: 48750
diff changeset
485 # they used decoded data, if the user defined any repository
59c6724ddccb simplemerge: store input data in MergeInput
Martin von Zweigbergk <martinvonz@google.com>
parents: 48750
diff changeset
486 # filters.
59c6724ddccb simplemerge: store input data in MergeInput
Martin von Zweigbergk <martinvonz@google.com>
parents: 48750
diff changeset
487 #
59c6724ddccb simplemerge: store input data in MergeInput
Martin von Zweigbergk <martinvonz@google.com>
parents: 48750
diff changeset
488 # Maintain that behavior today for BC, though perhaps in the future
59c6724ddccb simplemerge: store input data in MergeInput
Martin von Zweigbergk <martinvonz@google.com>
parents: 48750
diff changeset
489 # it'd be worth considering whether merging encoded data (what the
59c6724ddccb simplemerge: store input data in MergeInput
Martin von Zweigbergk <martinvonz@google.com>
parents: 48750
diff changeset
490 # repository usually sees) might be more useful.
59c6724ddccb simplemerge: store input data in MergeInput
Martin von Zweigbergk <martinvonz@google.com>
parents: 48750
diff changeset
491 self._text = self.fctx.decodeddata()
59c6724ddccb simplemerge: store input data in MergeInput
Martin von Zweigbergk <martinvonz@google.com>
parents: 48750
diff changeset
492 return self._text
48578
77e24ee8994b simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents: 48566
diff changeset
493
77e24ee8994b simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents: 48566
diff changeset
494
48749
9ee70e175fed simplemerge: replace `**opts` passed to `simplemerge()` by keyword arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 48587
diff changeset
495 def simplemerge(
9ee70e175fed simplemerge: replace `**opts` passed to `simplemerge()` by keyword arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 48587
diff changeset
496 local,
9ee70e175fed simplemerge: replace `**opts` passed to `simplemerge()` by keyword arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 48587
diff changeset
497 base,
9ee70e175fed simplemerge: replace `**opts` passed to `simplemerge()` by keyword arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 48587
diff changeset
498 other,
9ee70e175fed simplemerge: replace `**opts` passed to `simplemerge()` by keyword arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 48587
diff changeset
499 mode=b'merge',
9ee70e175fed simplemerge: replace `**opts` passed to `simplemerge()` by keyword arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 48587
diff changeset
500 allow_binary=False,
9ee70e175fed simplemerge: replace `**opts` passed to `simplemerge()` by keyword arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 48587
diff changeset
501 ):
33828
8b91a4ff23ad simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents: 33826
diff changeset
502 """Performs the simplemerge algorithm.
8b91a4ff23ad simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents: 33826
diff changeset
503
33907
1ad3085239ad simplemerge: make context parameters non-optional
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
504 The merged result is written into `localctx`.
33905
61b267a99fea simplemerge: stop reading from, and writing to, files
Phil Cohen <phillco@fb.com>
parents: 33904
diff changeset
505 """
35368
93c4958d987c py3: handle keyword arguments correctly in simplemerge.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34049
diff changeset
506
48754
d9602f0df4f3 simplemerge: remove code for checking binary input now that callers do it
Martin von Zweigbergk <martinvonz@google.com>
parents: 48751
diff changeset
507 if not allow_binary:
d9602f0df4f3 simplemerge: remove code for checking binary input now that callers do it
Martin von Zweigbergk <martinvonz@google.com>
parents: 48751
diff changeset
508 _verifytext(local)
d9602f0df4f3 simplemerge: remove code for checking binary input now that callers do it
Martin von Zweigbergk <martinvonz@google.com>
parents: 48751
diff changeset
509 _verifytext(base)
d9602f0df4f3 simplemerge: remove code for checking binary input now that callers do it
Martin von Zweigbergk <martinvonz@google.com>
parents: 48751
diff changeset
510 _verifytext(other)
33828
8b91a4ff23ad simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents: 33826
diff changeset
511
48754
d9602f0df4f3 simplemerge: remove code for checking binary input now that callers do it
Martin von Zweigbergk <martinvonz@google.com>
parents: 48751
diff changeset
512 m3 = Merge3Text(base.text(), local.text(), other.text())
48514
fb691fa90807 simplemerge: add a specialized function for "union", "local", "other"
Martin von Zweigbergk <martinvonz@google.com>
parents: 48509
diff changeset
513 conflicts = False
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
514 if mode == b'union':
48514
fb691fa90807 simplemerge: add a specialized function for "union", "local", "other"
Martin von Zweigbergk <martinvonz@google.com>
parents: 48509
diff changeset
515 lines = _resolve(m3, (1, 2))
48509
5151b0f6519e simplemerge: make `localorother` a "mode" instead of a separate thing
Martin von Zweigbergk <martinvonz@google.com>
parents: 48508
diff changeset
516 elif mode == b'local':
48514
fb691fa90807 simplemerge: add a specialized function for "union", "local", "other"
Martin von Zweigbergk <martinvonz@google.com>
parents: 48509
diff changeset
517 lines = _resolve(m3, (1,))
48509
5151b0f6519e simplemerge: make `localorother` a "mode" instead of a separate thing
Martin von Zweigbergk <martinvonz@google.com>
parents: 48508
diff changeset
518 elif mode == b'other':
48514
fb691fa90807 simplemerge: add a specialized function for "union", "local", "other"
Martin von Zweigbergk <martinvonz@google.com>
parents: 48509
diff changeset
519 lines = _resolve(m3, (2,))
46108
bdc2bf68f19e mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents: 46100
diff changeset
520 else:
48516
59524cb1cd73 simplemerge: don't calculate conflict labels when resolving automatically
Martin von Zweigbergk <martinvonz@google.com>
parents: 48515
diff changeset
521 if mode == b'mergediff':
48578
77e24ee8994b simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents: 48566
diff changeset
522 labels = _format_labels(local, other, base)
77e24ee8994b simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents: 48566
diff changeset
523 lines, conflicts = render_mergediff(m3, *labels)
48561
69e76b2aad3d simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents: 48560
diff changeset
524 elif mode == b'merge3':
48578
77e24ee8994b simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents: 48566
diff changeset
525 labels = _format_labels(local, other, base)
77e24ee8994b simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents: 48566
diff changeset
526 lines, conflicts = render_merge3(m3, *labels)
48516
59524cb1cd73 simplemerge: don't calculate conflict labels when resolving automatically
Martin von Zweigbergk <martinvonz@google.com>
parents: 48515
diff changeset
527 else:
48578
77e24ee8994b simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents: 48566
diff changeset
528 labels = _format_labels(local, other)
77e24ee8994b simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents: 48566
diff changeset
529 lines, conflicts = render_minimized(m3, *labels)
4364
d5c3a70f8422 polish the simplemerge command; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4363
diff changeset
530
46100
a771ffc378a8 simplemerge: write output only once it's complete
Martin von Zweigbergk <martinvonz@google.com>
parents: 46099
diff changeset
531 mergedtext = b''.join(lines)
48755
6ae3c97a0919 simplemerge: move printing of merge result to extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 48754
diff changeset
532 return mergedtext, conflicts