Mercurial > public > mercurial-scm > hg-stable
annotate mercurial/simplemerge.py @ 49060:f3aafd785e65
filemerge: add support for partial conflict resolution by external tool
A common class of merge conflicts is in imports/#includes/etc. It's
relatively easy to write a tool that can resolve these conflicts,
perhaps by naively just unioning the statements and leaving any
cleanup to other tools to do later [1]. Such specialized tools cannot
generally resolve all conflicts in a file, of course. Let's therefore
call them "partial merge tools". Note that the internal simplemerge
algorithm is such a partial merge tool - one that only resolves
trivial "conflicts" where one side is unchanged or both sides change
in the same way.
One can also imagine having smarter language-aware partial tools that
merge the AST. It may be useful for such tools to interactively let
the user resolve any conflicts it can't resolve itself. However,
having the option of implementing it as a partial merge tool means
that the developer doesn't *need* to create a UI for it. Instead, the
user can resolve any remaining conflicts with their regular merge tool
(e.g. `:merge3` or `meld).
We don't currently have a way to let the user define such partial
merge tools. That's what this patch addresses. It lets the user
configure partial merge tools to run. Each tool can be configured to
run only on files matching certain patterns (e.g. "*.py"). The tool
takes three inputs (local, base, other) and resolves conflicts by
updating these in place. For example, let's say the inputs are these:
base:
```
import sys
def main():
print('Hello')
```
local:
```
import os
import sys
def main():
print('Hi')
```
other:
```
import re
import sys
def main():
print('Howdy')
```
A partial merge tool could now resolve the conflicting imports by
replacing the import statements in *all* files by the following
snippet, while leaving the remainder of the files unchanged.
```
import os
import re
import sys
```
As a result, simplemerge and any regular merge tool that runs after
the partial merge tool(s) will consider the imports to be
non-conflicting and will only present the conflict in `main()` to the
user.
Differential Revision: https://phab.mercurial-scm.org/D12356
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Tue, 18 Jan 2022 13:05:21 -0800 |
parents | 642e31cb55f0 |
children | d44e3c45f0e4 |
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 |
241a1324a180
simplemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22056
diff
changeset
|
20 from .i18n import _ |
241a1324a180
simplemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22056
diff
changeset
|
21 from . import ( |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26223
diff
changeset
|
22 error, |
25974
241a1324a180
simplemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22056
diff
changeset
|
23 mdiff, |
33033
c31d45623304
py3: convert kwargs' keys' to str using pycompat.strkwargs()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31248
diff
changeset
|
24 pycompat, |
37087
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
35377
diff
changeset
|
25 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
26 from .utils import stringutil |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
27 |
4363
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
28 |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
29 def intersect(ra, rb): |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
30 """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
|
31 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
32 >>> intersect((0, 10), (0, 6)) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
33 (0, 6) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
34 >>> intersect((0, 10), (5, 15)) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
35 (5, 10) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
36 >>> intersect((0, 10), (10, 15)) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
37 >>> intersect((0, 9), (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), (7, 15)) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
39 (7, 9) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
40 """ |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
41 assert ra[0] <= ra[1] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
42 assert rb[0] <= rb[1] |
5081
ea7b982b6c08
Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4408
diff
changeset
|
43 |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
44 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
|
45 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
|
46 if sa < sb: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
47 return sa, sb |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
48 else: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
49 return None |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
50 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
51 |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
52 def compare_range(a, astart, aend, b, bstart, bend): |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
44990
diff
changeset
|
53 """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
|
54 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
|
55 return False |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
56 for ia, ib in zip( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
57 pycompat.xrange(astart, aend), pycompat.xrange(bstart, bend) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
58 ): |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
59 if a[ia] != b[ib]: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
60 return False |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
61 else: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
62 return True |
5081
ea7b982b6c08
Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4408
diff
changeset
|
63 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
64 |
49037
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
65 class Merge3Text: |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
66 """3-way merge of texts. |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
67 |
4363
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
68 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
|
69 incorporating the changes from both BASE->OTHER and BASE->THIS.""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
70 |
4363
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
71 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
|
72 self.basetext = basetext |
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
73 self.atext = atext |
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
74 self.btext = btext |
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
75 if base is None: |
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
76 base = mdiff.splitnewlines(basetext) |
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
77 if a is None: |
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
78 a = mdiff.splitnewlines(atext) |
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
79 if b is None: |
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
80 b = mdiff.splitnewlines(btext) |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
81 self.base = base |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
82 self.a = a |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
83 self.b = b |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
84 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
85 def merge_groups(self): |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
86 """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
|
87 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
88 'unchanged', lines |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
89 Lines unchanged from base |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
90 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
91 'a', lines |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
92 Lines taken from a |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
93 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
94 'same', lines |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
95 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
|
96 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
97 'b', lines |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
98 Lines taken from b |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
99 |
48576
374bf34c9ffd
simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents:
48553
diff
changeset
|
100 '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
|
101 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
|
102 """ |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
103 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
|
104 what = t[0] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
105 if what == b'unchanged': |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
106 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
|
107 elif what == b'a' or what == b'same': |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
108 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
|
109 elif what == b'b': |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
110 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
|
111 elif what == b'conflict': |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
112 yield ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
113 what, |
48576
374bf34c9ffd
simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents:
48553
diff
changeset
|
114 ( |
374bf34c9ffd
simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents:
48553
diff
changeset
|
115 self.base[t[1] : t[2]], |
374bf34c9ffd
simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents:
48553
diff
changeset
|
116 self.a[t[3] : t[4]], |
374bf34c9ffd
simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents:
48553
diff
changeset
|
117 self.b[t[5] : t[6]], |
374bf34c9ffd
simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents:
48553
diff
changeset
|
118 ), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
119 ) |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
120 else: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
121 raise ValueError(what) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
122 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
123 def merge_regions(self): |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
124 """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
|
125 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
126 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
|
127 have: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
128 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
129 'unchanged', start, end |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
130 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
|
131 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
132 'same', astart, aend |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
133 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
|
134 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
135 'a', start, end |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
136 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
|
137 |
28070
a504794cee29
merge: add some useful documentation
Ryan McElroy <rmcelroy@fb.com>
parents:
26614
diff
changeset
|
138 'conflict', zstart, zend, astart, aend, bstart, bend |
a504794cee29
merge: add some useful documentation
Ryan McElroy <rmcelroy@fb.com>
parents:
26614
diff
changeset
|
139 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
|
140 |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
141 Method is as follows: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
142 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
143 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
|
144 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
|
145 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
|
146 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
|
147 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
|
148 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
149 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
|
150 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
|
151 """ |
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 # 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
|
154 iz = ia = ib = 0 |
5081
ea7b982b6c08
Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4408
diff
changeset
|
155 |
16683 | 156 for region in self.find_sync_regions(): |
157 zmatch, zend, amatch, aend, bmatch, bend = region | |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
158 # print 'match base [%d:%d]' % (zmatch, zend) |
5081
ea7b982b6c08
Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4408
diff
changeset
|
159 |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
160 matchlen = zend - zmatch |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
161 assert matchlen >= 0 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
162 assert matchlen == (aend - amatch) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
163 assert matchlen == (bend - bmatch) |
5081
ea7b982b6c08
Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4408
diff
changeset
|
164 |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
165 len_a = amatch - ia |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
166 len_b = bmatch - ib |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
167 len_base = zmatch - iz |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
168 assert len_a >= 0 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
169 assert len_b >= 0 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
170 assert len_base >= 0 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
171 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
172 # 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
|
173 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
174 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
|
175 # try to avoid actually slicing the lists |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
176 equal_a = compare_range( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
177 self.a, ia, amatch, self.base, iz, zmatch |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
178 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
179 equal_b = compare_range( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
180 self.b, ib, bmatch, self.base, iz, zmatch |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
181 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
182 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
|
183 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
184 if same: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
185 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
|
186 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
|
187 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
|
188 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
|
189 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
|
190 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
|
191 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
|
192 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
193 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
|
194 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
195 ia = amatch |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
196 ib = bmatch |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
197 iz = zmatch |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
198 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
199 # 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
|
200 # 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
|
201 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
202 if matchlen > 0: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
203 assert ia == amatch |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
204 assert ib == bmatch |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
205 assert iz == zmatch |
5081
ea7b982b6c08
Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4408
diff
changeset
|
206 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
207 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
|
208 iz = zend |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
209 ia = aend |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
210 ib = bend |
5081
ea7b982b6c08
Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4408
diff
changeset
|
211 |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
212 def find_sync_regions(self): |
14549
48ec0763afbb
check-code: catch misspellings of descendant
Matt Mackall <mpm@selenic.com>
parents:
14329
diff
changeset
|
213 """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
|
214 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
215 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
|
216 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
|
217 """ |
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 ia = ib = 0 |
4363
2e3c54fb79a3
actually port simplemerge to hg
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4362
diff
changeset
|
220 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
|
221 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
|
222 len_a = len(amatches) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
223 len_b = len(bmatches) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
224 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
225 sl = [] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
226 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
227 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
|
228 abase, amatch, alen = amatches[ia] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
229 bbase, bmatch, blen = bmatches[ib] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
230 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
231 # 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
|
232 # extend? until whichever one ends earlier. |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
8312
diff
changeset
|
233 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
|
234 if i: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
235 intbase = i[0] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
236 intend = i[1] |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
237 intlen = intend - intbase |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
238 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
239 # 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
|
240 # 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
|
241 assert intlen <= alen |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
242 assert intlen <= blen |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
243 assert abase <= intbase |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
244 assert bbase <= intbase |
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 asub = amatch + (intbase - abase) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
247 bsub = bmatch + (intbase - bbase) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
248 aend = asub + intlen |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
249 bend = bsub + intlen |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
250 |
41768
aaad36b88298
cleanup: use () to wrap long lines instead of \
Augie Fackler <augie@google.com>
parents:
38823
diff
changeset
|
251 assert self.base[intbase:intend] == self.a[asub:aend], ( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
252 self.base[intbase:intend], |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
253 self.a[asub:aend], |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
254 ) |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
255 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
256 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
|
257 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
258 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
|
259 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
260 # 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
|
261 if (abase + alen) < (bbase + blen): |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
262 ia += 1 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
263 else: |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
264 ib += 1 |
5081
ea7b982b6c08
Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4408
diff
changeset
|
265 |
4362
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
266 intbase = len(self.base) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
267 abase = len(self.a) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
268 bbase = len(self.b) |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
269 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
|
270 |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
271 return sl |
465b9ea02868
Import 3-way merge code from bzr
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
diff
changeset
|
272 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
273 |
48757
d9602f0df4f3
simplemerge: remove code for checking binary input now that callers do it
Martin von Zweigbergk <martinvonz@google.com>
parents:
48754
diff
changeset
|
274 def _verifytext(input): |
33846
de573184686e
simplemerge: extract verifytext as a helper function
Phil Cohen <phillco@fb.com>
parents:
33033
diff
changeset
|
275 """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:
33033
diff
changeset
|
276 then we just warn)""" |
48757
d9602f0df4f3
simplemerge: remove code for checking binary input now that callers do it
Martin von Zweigbergk <martinvonz@google.com>
parents:
48754
diff
changeset
|
277 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:
48754
diff
changeset
|
278 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:
48754
diff
changeset
|
279 raise error.Abort(msg) |
33846
de573184686e
simplemerge: extract verifytext as a helper function
Phil Cohen <phillco@fb.com>
parents:
33033
diff
changeset
|
280 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
281 |
48603
77e24ee8994b
simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents:
48594
diff
changeset
|
282 def _format_labels(*inputs): |
48609
3c8cc987672e
simplemerge: take over formatting of label from `filemerge`
Martin von Zweigbergk <martinvonz@google.com>
parents:
48603
diff
changeset
|
283 pad = max(len(input.label) if input.label else 0 for input in inputs) |
48603
77e24ee8994b
simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents:
48594
diff
changeset
|
284 labels = [] |
77e24ee8994b
simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents:
48594
diff
changeset
|
285 for input in inputs: |
77e24ee8994b
simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents:
48594
diff
changeset
|
286 if input.label: |
48609
3c8cc987672e
simplemerge: take over formatting of label from `filemerge`
Martin von Zweigbergk <martinvonz@google.com>
parents:
48603
diff
changeset
|
287 if input.label_detail: |
3c8cc987672e
simplemerge: take over formatting of label from `filemerge`
Martin von Zweigbergk <martinvonz@google.com>
parents:
48603
diff
changeset
|
288 label = ( |
3c8cc987672e
simplemerge: take over formatting of label from `filemerge`
Martin von Zweigbergk <martinvonz@google.com>
parents:
48603
diff
changeset
|
289 (input.label + b':').ljust(pad + 1) |
3c8cc987672e
simplemerge: take over formatting of label from `filemerge`
Martin von Zweigbergk <martinvonz@google.com>
parents:
48603
diff
changeset
|
290 + b' ' |
3c8cc987672e
simplemerge: take over formatting of label from `filemerge`
Martin von Zweigbergk <martinvonz@google.com>
parents:
48603
diff
changeset
|
291 + input.label_detail |
3c8cc987672e
simplemerge: take over formatting of label from `filemerge`
Martin von Zweigbergk <martinvonz@google.com>
parents:
48603
diff
changeset
|
292 ) |
3c8cc987672e
simplemerge: take over formatting of label from `filemerge`
Martin von Zweigbergk <martinvonz@google.com>
parents:
48603
diff
changeset
|
293 else: |
3c8cc987672e
simplemerge: take over formatting of label from `filemerge`
Martin von Zweigbergk <martinvonz@google.com>
parents:
48603
diff
changeset
|
294 label = input.label |
3c8cc987672e
simplemerge: take over formatting of label from `filemerge`
Martin von Zweigbergk <martinvonz@google.com>
parents:
48603
diff
changeset
|
295 # 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:
48603
diff
changeset
|
296 labels.append(stringutil.ellipsis(label, 80 - 8)) |
48603
77e24ee8994b
simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents:
48594
diff
changeset
|
297 else: |
77e24ee8994b
simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents:
48594
diff
changeset
|
298 labels.append(None) |
77e24ee8994b
simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents:
48594
diff
changeset
|
299 return labels |
33851
aa6c290a77fa
filemerge: extract `_picklabels` as a helper function
Phil Cohen <phillco@fb.com>
parents:
33850
diff
changeset
|
300 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41768
diff
changeset
|
301 |
48587
b5e1283c0475
simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents:
48586
diff
changeset
|
302 def _detect_newline(m3): |
b5e1283c0475
simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents:
48586
diff
changeset
|
303 if len(m3.a) > 0: |
b5e1283c0475
simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents:
48586
diff
changeset
|
304 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:
48586
diff
changeset
|
305 return b'\r\n' |
b5e1283c0475
simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents:
48586
diff
changeset
|
306 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:
48586
diff
changeset
|
307 return b'\r' |
b5e1283c0475
simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents:
48586
diff
changeset
|
308 return b'\n' |
b5e1283c0475
simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents:
48586
diff
changeset
|
309 |
b5e1283c0475
simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents:
48586
diff
changeset
|
310 |
48592
c2537aec3bb6
simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents:
48591
diff
changeset
|
311 def _minimize(a_lines, b_lines): |
48591
ad0c6bf6f02e
simplemerge: make minimize() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48590
diff
changeset
|
312 """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:
48590
diff
changeset
|
313 |
ad0c6bf6f02e
simplemerge: make minimize() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48590
diff
changeset
|
314 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:
48590
diff
changeset
|
315 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:
48590
diff
changeset
|
316 region and are instead considered the same. |
ad0c6bf6f02e
simplemerge: make minimize() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48590
diff
changeset
|
317 """ |
48592
c2537aec3bb6
simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents:
48591
diff
changeset
|
318 alen = len(a_lines) |
c2537aec3bb6
simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents:
48591
diff
changeset
|
319 blen = len(b_lines) |
48591
ad0c6bf6f02e
simplemerge: make minimize() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48590
diff
changeset
|
320 |
48592
c2537aec3bb6
simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents:
48591
diff
changeset
|
321 # find matches at the front |
c2537aec3bb6
simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents:
48591
diff
changeset
|
322 ii = 0 |
c2537aec3bb6
simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents:
48591
diff
changeset
|
323 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:
48591
diff
changeset
|
324 ii += 1 |
c2537aec3bb6
simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents:
48591
diff
changeset
|
325 startmatches = ii |
48591
ad0c6bf6f02e
simplemerge: make minimize() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48590
diff
changeset
|
326 |
48592
c2537aec3bb6
simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents:
48591
diff
changeset
|
327 # find matches at the end |
c2537aec3bb6
simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents:
48591
diff
changeset
|
328 ii = 0 |
c2537aec3bb6
simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents:
48591
diff
changeset
|
329 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:
48591
diff
changeset
|
330 ii += 1 |
c2537aec3bb6
simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents:
48591
diff
changeset
|
331 endmatches = ii |
48591
ad0c6bf6f02e
simplemerge: make minimize() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48590
diff
changeset
|
332 |
48592
c2537aec3bb6
simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents:
48591
diff
changeset
|
333 lines_before = a_lines[:startmatches] |
c2537aec3bb6
simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents:
48591
diff
changeset
|
334 new_a_lines = a_lines[startmatches : alen - endmatches] |
c2537aec3bb6
simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents:
48591
diff
changeset
|
335 new_b_lines = b_lines[startmatches : blen - endmatches] |
c2537aec3bb6
simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents:
48591
diff
changeset
|
336 lines_after = a_lines[alen - endmatches :] |
c2537aec3bb6
simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents:
48591
diff
changeset
|
337 return lines_before, new_a_lines, new_b_lines, lines_after |
48591
ad0c6bf6f02e
simplemerge: make minimize() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48590
diff
changeset
|
338 |
ad0c6bf6f02e
simplemerge: make minimize() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48590
diff
changeset
|
339 |
48590
12ac4401ff7d
simplemerge: simplify and rename `render_markers()`
Martin von Zweigbergk <martinvonz@google.com>
parents:
48589
diff
changeset
|
340 def render_minimized( |
48585
c6649c53073f
simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48584
diff
changeset
|
341 m3, |
c6649c53073f
simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48584
diff
changeset
|
342 name_a=None, |
c6649c53073f
simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48584
diff
changeset
|
343 name_b=None, |
c6649c53073f
simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48584
diff
changeset
|
344 start_marker=b'<<<<<<<', |
c6649c53073f
simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48584
diff
changeset
|
345 mid_marker=b'=======', |
c6649c53073f
simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48584
diff
changeset
|
346 end_marker=b'>>>>>>>', |
c6649c53073f
simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48584
diff
changeset
|
347 ): |
c6649c53073f
simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48584
diff
changeset
|
348 """Return merge in cvs-like form.""" |
48587
b5e1283c0475
simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents:
48586
diff
changeset
|
349 newline = _detect_newline(m3) |
48585
c6649c53073f
simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48584
diff
changeset
|
350 conflicts = False |
48590
12ac4401ff7d
simplemerge: simplify and rename `render_markers()`
Martin von Zweigbergk <martinvonz@google.com>
parents:
48589
diff
changeset
|
351 if name_a: |
48585
c6649c53073f
simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48584
diff
changeset
|
352 start_marker = start_marker + b' ' + name_a |
48590
12ac4401ff7d
simplemerge: simplify and rename `render_markers()`
Martin von Zweigbergk <martinvonz@google.com>
parents:
48589
diff
changeset
|
353 if name_b: |
48585
c6649c53073f
simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48584
diff
changeset
|
354 end_marker = end_marker + b' ' + name_b |
c6649c53073f
simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48584
diff
changeset
|
355 merge_groups = m3.merge_groups() |
c6649c53073f
simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48584
diff
changeset
|
356 lines = [] |
c6649c53073f
simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48584
diff
changeset
|
357 for what, group_lines in merge_groups: |
c6649c53073f
simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48584
diff
changeset
|
358 if what == b'conflict': |
48592
c2537aec3bb6
simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents:
48591
diff
changeset
|
359 conflicts = True |
48585
c6649c53073f
simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48584
diff
changeset
|
360 base_lines, a_lines, b_lines = group_lines |
48592
c2537aec3bb6
simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents:
48591
diff
changeset
|
361 minimized = _minimize(a_lines, b_lines) |
c2537aec3bb6
simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents:
48591
diff
changeset
|
362 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:
48591
diff
changeset
|
363 lines.extend(lines_before) |
48590
12ac4401ff7d
simplemerge: simplify and rename `render_markers()`
Martin von Zweigbergk <martinvonz@google.com>
parents:
48589
diff
changeset
|
364 lines.append(start_marker + newline) |
48585
c6649c53073f
simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48584
diff
changeset
|
365 lines.extend(a_lines) |
48590
12ac4401ff7d
simplemerge: simplify and rename `render_markers()`
Martin von Zweigbergk <martinvonz@google.com>
parents:
48589
diff
changeset
|
366 lines.append(mid_marker + newline) |
48585
c6649c53073f
simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48584
diff
changeset
|
367 lines.extend(b_lines) |
48590
12ac4401ff7d
simplemerge: simplify and rename `render_markers()`
Martin von Zweigbergk <martinvonz@google.com>
parents:
48589
diff
changeset
|
368 lines.append(end_marker + newline) |
48592
c2537aec3bb6
simplemerge: change _minimize() to minimize a single conflict
Martin von Zweigbergk <martinvonz@google.com>
parents:
48591
diff
changeset
|
369 lines.extend(lines_after) |
48585
c6649c53073f
simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48584
diff
changeset
|
370 else: |
c6649c53073f
simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48584
diff
changeset
|
371 lines.extend(group_lines) |
c6649c53073f
simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48584
diff
changeset
|
372 return lines, conflicts |
c6649c53073f
simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48584
diff
changeset
|
373 |
c6649c53073f
simplemerge: make merge_lines() a free function
Martin von Zweigbergk <martinvonz@google.com>
parents:
48584
diff
changeset
|
374 |
48589
69e76b2aad3d
simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents:
48588
diff
changeset
|
375 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:
48588
diff
changeset
|
376 """Render conflicts as 3-way conflict markers.""" |
69e76b2aad3d
simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents:
48588
diff
changeset
|
377 newline = _detect_newline(m3) |
69e76b2aad3d
simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents:
48588
diff
changeset
|
378 conflicts = False |
69e76b2aad3d
simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents:
48588
diff
changeset
|
379 lines = [] |
69e76b2aad3d
simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents:
48588
diff
changeset
|
380 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:
48588
diff
changeset
|
381 if what == b'conflict': |
69e76b2aad3d
simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents:
48588
diff
changeset
|
382 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:
48588
diff
changeset
|
383 conflicts = True |
69e76b2aad3d
simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents:
48588
diff
changeset
|
384 lines.append(b'<<<<<<< ' + name_a + newline) |
69e76b2aad3d
simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents:
48588
diff
changeset
|
385 lines.extend(a_lines) |
69e76b2aad3d
simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents:
48588
diff
changeset
|
386 lines.append(b'||||||| ' + name_base + newline) |
69e76b2aad3d
simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents:
48588
diff
changeset
|
387 lines.extend(base_lines) |
69e76b2aad3d
simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents:
48588
diff
changeset
|
388 lines.append(b'=======' + newline) |
69e76b2aad3d
simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents:
48588
diff
changeset
|
389 lines.extend(b_lines) |
69e76b2aad3d
simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents:
48588
diff
changeset
|
390 lines.append(b'>>>>>>> ' + name_b + newline) |
69e76b2aad3d
simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents:
48588
diff
changeset
|
391 else: |
69e76b2aad3d
simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents:
48588
diff
changeset
|
392 lines.extend(group_lines) |
69e76b2aad3d
simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents:
48588
diff
changeset
|
393 return lines, conflicts |
69e76b2aad3d
simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents:
48588
diff
changeset
|
394 |
69e76b2aad3d
simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents:
48588
diff
changeset
|
395 |
48586
2dbee604a4f0
simplemerge: clarify names of functions that render conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents:
48585
diff
changeset
|
396 def render_mergediff(m3, name_a, name_b, name_base): |
48589
69e76b2aad3d
simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents:
48588
diff
changeset
|
397 """Render conflicts as conflict markers with one snapshot and one diff.""" |
48587
b5e1283c0475
simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents:
48586
diff
changeset
|
398 newline = _detect_newline(m3) |
46109
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
399 lines = [] |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
400 conflicts = False |
48576
374bf34c9ffd
simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents:
48553
diff
changeset
|
401 for what, group_lines in m3.merge_groups(): |
374bf34c9ffd
simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents:
48553
diff
changeset
|
402 if what == b'conflict': |
374bf34c9ffd
simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents:
48553
diff
changeset
|
403 base_lines, a_lines, b_lines = group_lines |
46109
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
404 base_text = b''.join(base_lines) |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
405 b_blocks = list( |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
406 mdiff.allblocks( |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
407 base_text, |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
408 b''.join(b_lines), |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
409 lines1=base_lines, |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
410 lines2=b_lines, |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
411 ) |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
412 ) |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
413 a_blocks = list( |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
414 mdiff.allblocks( |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
415 base_text, |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
416 b''.join(a_lines), |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
417 lines1=base_lines, |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
418 lines2=b_lines, |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
419 ) |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
420 ) |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
421 |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
422 def matching_lines(blocks): |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
423 return sum( |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
424 block[1] - block[0] |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
425 for block, kind in blocks |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
426 if kind == b'=' |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
427 ) |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
428 |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
429 def diff_lines(blocks, lines1, lines2): |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
430 for block, kind in blocks: |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
431 if kind == b'=': |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
432 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:
46101
diff
changeset
|
433 yield b' ' + line |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
434 else: |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
435 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:
46101
diff
changeset
|
436 yield b'-' + line |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
437 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:
46101
diff
changeset
|
438 yield b'+' + line |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
439 |
48587
b5e1283c0475
simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents:
48586
diff
changeset
|
440 lines.append(b"<<<<<<<" + newline) |
46109
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
441 if matching_lines(a_blocks) < matching_lines(b_blocks): |
48587
b5e1283c0475
simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents:
48586
diff
changeset
|
442 lines.append(b"======= " + name_a + newline) |
46109
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
443 lines.extend(a_lines) |
48587
b5e1283c0475
simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents:
48586
diff
changeset
|
444 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:
48586
diff
changeset
|
445 lines.append(b"+++++++ " + name_b + newline) |
46109
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
446 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:
46101
diff
changeset
|
447 else: |
48587
b5e1283c0475
simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents:
48586
diff
changeset
|
448 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:
48586
diff
changeset
|
449 lines.append(b"+++++++ " + name_a + newline) |
46109
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
450 lines.extend(diff_lines(a_blocks, base_lines, a_lines)) |
48587
b5e1283c0475
simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents:
48586
diff
changeset
|
451 lines.append(b"======= " + name_b + newline) |
46109
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
452 lines.extend(b_lines) |
48587
b5e1283c0475
simplemerge: use same newline detection for :mergediff as for :merge[3]
Martin von Zweigbergk <martinvonz@google.com>
parents:
48586
diff
changeset
|
453 lines.append(b">>>>>>>" + newline) |
46109
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
454 conflicts = True |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
455 else: |
48576
374bf34c9ffd
simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents:
48553
diff
changeset
|
456 lines.extend(group_lines) |
46109
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
457 return lines, conflicts |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
458 |
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
459 |
48551
fb691fa90807
simplemerge: add a specialized function for "union", "local", "other"
Martin von Zweigbergk <martinvonz@google.com>
parents:
48546
diff
changeset
|
460 def _resolve(m3, sides): |
fb691fa90807
simplemerge: add a specialized function for "union", "local", "other"
Martin von Zweigbergk <martinvonz@google.com>
parents:
48546
diff
changeset
|
461 lines = [] |
48576
374bf34c9ffd
simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents:
48553
diff
changeset
|
462 for what, group_lines in m3.merge_groups(): |
374bf34c9ffd
simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents:
48553
diff
changeset
|
463 if what == b'conflict': |
48551
fb691fa90807
simplemerge: add a specialized function for "union", "local", "other"
Martin von Zweigbergk <martinvonz@google.com>
parents:
48546
diff
changeset
|
464 for side in sides: |
48576
374bf34c9ffd
simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents:
48553
diff
changeset
|
465 lines.extend(group_lines[side]) |
48551
fb691fa90807
simplemerge: add a specialized function for "union", "local", "other"
Martin von Zweigbergk <martinvonz@google.com>
parents:
48546
diff
changeset
|
466 else: |
48576
374bf34c9ffd
simplemerge: make merge_groups() yield only 2-tuples
Martin von Zweigbergk <martinvonz@google.com>
parents:
48553
diff
changeset
|
467 lines.extend(group_lines) |
48551
fb691fa90807
simplemerge: add a specialized function for "union", "local", "other"
Martin von Zweigbergk <martinvonz@google.com>
parents:
48546
diff
changeset
|
468 return lines |
fb691fa90807
simplemerge: add a specialized function for "union", "local", "other"
Martin von Zweigbergk <martinvonz@google.com>
parents:
48546
diff
changeset
|
469 |
fb691fa90807
simplemerge: add a specialized function for "union", "local", "other"
Martin von Zweigbergk <martinvonz@google.com>
parents:
48546
diff
changeset
|
470 |
49037
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
471 class MergeInput: |
48753
aed8ef33db8b
simplemerge: convert MergeInput to regular, non-attr.ib class
Martin von Zweigbergk <martinvonz@google.com>
parents:
48752
diff
changeset
|
472 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:
48752
diff
changeset
|
473 self.fctx = fctx |
aed8ef33db8b
simplemerge: convert MergeInput to regular, non-attr.ib class
Martin von Zweigbergk <martinvonz@google.com>
parents:
48752
diff
changeset
|
474 self.label = label |
aed8ef33db8b
simplemerge: convert MergeInput to regular, non-attr.ib class
Martin von Zweigbergk <martinvonz@google.com>
parents:
48752
diff
changeset
|
475 # 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:
48752
diff
changeset
|
476 # 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:
48752
diff
changeset
|
477 # all merge inputs. |
aed8ef33db8b
simplemerge: convert MergeInput to regular, non-attr.ib class
Martin von Zweigbergk <martinvonz@google.com>
parents:
48752
diff
changeset
|
478 self.label_detail = label_detail |
48754
59c6724ddccb
simplemerge: store input data in MergeInput
Martin von Zweigbergk <martinvonz@google.com>
parents:
48753
diff
changeset
|
479 self._text = None |
59c6724ddccb
simplemerge: store input data in MergeInput
Martin von Zweigbergk <martinvonz@google.com>
parents:
48753
diff
changeset
|
480 |
59c6724ddccb
simplemerge: store input data in MergeInput
Martin von Zweigbergk <martinvonz@google.com>
parents:
48753
diff
changeset
|
481 def text(self): |
59c6724ddccb
simplemerge: store input data in MergeInput
Martin von Zweigbergk <martinvonz@google.com>
parents:
48753
diff
changeset
|
482 if self._text is None: |
59c6724ddccb
simplemerge: store input data in MergeInput
Martin von Zweigbergk <martinvonz@google.com>
parents:
48753
diff
changeset
|
483 # 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:
48753
diff
changeset
|
484 # they used decoded data, if the user defined any repository |
59c6724ddccb
simplemerge: store input data in MergeInput
Martin von Zweigbergk <martinvonz@google.com>
parents:
48753
diff
changeset
|
485 # filters. |
59c6724ddccb
simplemerge: store input data in MergeInput
Martin von Zweigbergk <martinvonz@google.com>
parents:
48753
diff
changeset
|
486 # |
59c6724ddccb
simplemerge: store input data in MergeInput
Martin von Zweigbergk <martinvonz@google.com>
parents:
48753
diff
changeset
|
487 # 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:
48753
diff
changeset
|
488 # 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:
48753
diff
changeset
|
489 # repository usually sees) might be more useful. |
59c6724ddccb
simplemerge: store input data in MergeInput
Martin von Zweigbergk <martinvonz@google.com>
parents:
48753
diff
changeset
|
490 self._text = self.fctx.decodeddata() |
59c6724ddccb
simplemerge: store input data in MergeInput
Martin von Zweigbergk <martinvonz@google.com>
parents:
48753
diff
changeset
|
491 return self._text |
48603
77e24ee8994b
simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents:
48594
diff
changeset
|
492 |
49060
f3aafd785e65
filemerge: add support for partial conflict resolution by external tool
Martin von Zweigbergk <martinvonz@google.com>
parents:
49037
diff
changeset
|
493 def set_text(self, text): |
f3aafd785e65
filemerge: add support for partial conflict resolution by external tool
Martin von Zweigbergk <martinvonz@google.com>
parents:
49037
diff
changeset
|
494 self._text = text |
f3aafd785e65
filemerge: add support for partial conflict resolution by external tool
Martin von Zweigbergk <martinvonz@google.com>
parents:
49037
diff
changeset
|
495 |
48603
77e24ee8994b
simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents:
48594
diff
changeset
|
496 |
48752
9ee70e175fed
simplemerge: replace `**opts` passed to `simplemerge()` by keyword arguments
Martin von Zweigbergk <martinvonz@google.com>
parents:
48609
diff
changeset
|
497 def simplemerge( |
9ee70e175fed
simplemerge: replace `**opts` passed to `simplemerge()` by keyword arguments
Martin von Zweigbergk <martinvonz@google.com>
parents:
48609
diff
changeset
|
498 local, |
9ee70e175fed
simplemerge: replace `**opts` passed to `simplemerge()` by keyword arguments
Martin von Zweigbergk <martinvonz@google.com>
parents:
48609
diff
changeset
|
499 base, |
9ee70e175fed
simplemerge: replace `**opts` passed to `simplemerge()` by keyword arguments
Martin von Zweigbergk <martinvonz@google.com>
parents:
48609
diff
changeset
|
500 other, |
9ee70e175fed
simplemerge: replace `**opts` passed to `simplemerge()` by keyword arguments
Martin von Zweigbergk <martinvonz@google.com>
parents:
48609
diff
changeset
|
501 mode=b'merge', |
9ee70e175fed
simplemerge: replace `**opts` passed to `simplemerge()` by keyword arguments
Martin von Zweigbergk <martinvonz@google.com>
parents:
48609
diff
changeset
|
502 allow_binary=False, |
9ee70e175fed
simplemerge: replace `**opts` passed to `simplemerge()` by keyword arguments
Martin von Zweigbergk <martinvonz@google.com>
parents:
48609
diff
changeset
|
503 ): |
33849
8b91a4ff23ad
simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents:
33847
diff
changeset
|
504 """Performs the simplemerge algorithm. |
8b91a4ff23ad
simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents:
33847
diff
changeset
|
505 |
33925
1ad3085239ad
simplemerge: make context parameters non-optional
Phil Cohen <phillco@fb.com>
parents:
33924
diff
changeset
|
506 The merged result is written into `localctx`. |
33923
61b267a99fea
simplemerge: stop reading from, and writing to, files
Phil Cohen <phillco@fb.com>
parents:
33922
diff
changeset
|
507 """ |
35377
93c4958d987c
py3: handle keyword arguments correctly in simplemerge.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34066
diff
changeset
|
508 |
48757
d9602f0df4f3
simplemerge: remove code for checking binary input now that callers do it
Martin von Zweigbergk <martinvonz@google.com>
parents:
48754
diff
changeset
|
509 if not allow_binary: |
d9602f0df4f3
simplemerge: remove code for checking binary input now that callers do it
Martin von Zweigbergk <martinvonz@google.com>
parents:
48754
diff
changeset
|
510 _verifytext(local) |
d9602f0df4f3
simplemerge: remove code for checking binary input now that callers do it
Martin von Zweigbergk <martinvonz@google.com>
parents:
48754
diff
changeset
|
511 _verifytext(base) |
d9602f0df4f3
simplemerge: remove code for checking binary input now that callers do it
Martin von Zweigbergk <martinvonz@google.com>
parents:
48754
diff
changeset
|
512 _verifytext(other) |
33849
8b91a4ff23ad
simplemerge: use contexts to read file data from, if passed
Phil Cohen <phillco@fb.com>
parents:
33847
diff
changeset
|
513 |
48757
d9602f0df4f3
simplemerge: remove code for checking binary input now that callers do it
Martin von Zweigbergk <martinvonz@google.com>
parents:
48754
diff
changeset
|
514 m3 = Merge3Text(base.text(), local.text(), other.text()) |
48551
fb691fa90807
simplemerge: add a specialized function for "union", "local", "other"
Martin von Zweigbergk <martinvonz@google.com>
parents:
48546
diff
changeset
|
515 conflicts = False |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
516 if mode == b'union': |
48551
fb691fa90807
simplemerge: add a specialized function for "union", "local", "other"
Martin von Zweigbergk <martinvonz@google.com>
parents:
48546
diff
changeset
|
517 lines = _resolve(m3, (1, 2)) |
48546
5151b0f6519e
simplemerge: make `localorother` a "mode" instead of a separate thing
Martin von Zweigbergk <martinvonz@google.com>
parents:
48545
diff
changeset
|
518 elif mode == b'local': |
48551
fb691fa90807
simplemerge: add a specialized function for "union", "local", "other"
Martin von Zweigbergk <martinvonz@google.com>
parents:
48546
diff
changeset
|
519 lines = _resolve(m3, (1,)) |
48546
5151b0f6519e
simplemerge: make `localorother` a "mode" instead of a separate thing
Martin von Zweigbergk <martinvonz@google.com>
parents:
48545
diff
changeset
|
520 elif mode == b'other': |
48551
fb691fa90807
simplemerge: add a specialized function for "union", "local", "other"
Martin von Zweigbergk <martinvonz@google.com>
parents:
48546
diff
changeset
|
521 lines = _resolve(m3, (2,)) |
46109
bdc2bf68f19e
mergetools: add new conflict marker format with diffs in
Martin von Zweigbergk <martinvonz@google.com>
parents:
46101
diff
changeset
|
522 else: |
48553
59524cb1cd73
simplemerge: don't calculate conflict labels when resolving automatically
Martin von Zweigbergk <martinvonz@google.com>
parents:
48552
diff
changeset
|
523 if mode == b'mergediff': |
48603
77e24ee8994b
simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents:
48594
diff
changeset
|
524 labels = _format_labels(local, other, base) |
77e24ee8994b
simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents:
48594
diff
changeset
|
525 lines, conflicts = render_mergediff(m3, *labels) |
48589
69e76b2aad3d
simplemerge: split out function for rendering :merge3 conflict markers
Martin von Zweigbergk <martinvonz@google.com>
parents:
48588
diff
changeset
|
526 elif mode == b'merge3': |
48603
77e24ee8994b
simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents:
48594
diff
changeset
|
527 labels = _format_labels(local, other, base) |
77e24ee8994b
simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents:
48594
diff
changeset
|
528 lines, conflicts = render_merge3(m3, *labels) |
48553
59524cb1cd73
simplemerge: don't calculate conflict labels when resolving automatically
Martin von Zweigbergk <martinvonz@google.com>
parents:
48552
diff
changeset
|
529 else: |
48603
77e24ee8994b
simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents:
48594
diff
changeset
|
530 labels = _format_labels(local, other) |
77e24ee8994b
simplemerge: take arguments as annotated context objects
Martin von Zweigbergk <martinvonz@google.com>
parents:
48594
diff
changeset
|
531 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
|
532 |
46101
a771ffc378a8
simplemerge: write output only once it's complete
Martin von Zweigbergk <martinvonz@google.com>
parents:
46100
diff
changeset
|
533 mergedtext = b''.join(lines) |
48758
6ae3c97a0919
simplemerge: move printing of merge result to extension
Martin von Zweigbergk <martinvonz@google.com>
parents:
48757
diff
changeset
|
534 return mergedtext, conflicts |