Mercurial > hg
annotate mercurial/simplemerge.py @ 49000:dd6b67d5c256 stable
rust: fix unsound `OwningDirstateMap`
As per the previous patch, `OwningDirstateMap` is unsound. Self-referential
structs are difficult to implement correctly in Rust since the compiler is
free to move structs around as much as it wants to. They are also very rarely
needed in practice, so the state-of-the-art on how they should be done within
the Rust rules is still a bit new.
The crate `ouroboros` is an attempt at providing a safe way (in the Rust sense)
of declaring self-referential structs. It is getting a lot attention and was
improved very quickly when soundness issues were found in the past: rather than
relying on our own (limited) review circle, we might as well use the de-facto
common crate to fix this problem. This will give us a much better chance of
finding issues should any new ones be discovered as well as the benefit of
fewer `unsafe` APIs of our own.
I was starting to think about how I would present a safe API to the old struct
but soon realized that the callback-based approach was already done in
`ouroboros`, along with a lot more care towards refusing incorrect structs.
In short: we don't return a mutable reference to the `DirstateMap` anymore, we
expect users of its API to pass a `FnOnce` that takes the map as an argument.
This allows our `OwningDirstateMap` to control the input and output lifetimes
of the code that modifies it to prevent such issues.
Changing to `ouroboros` meant changing every API with it, but it is relatively
low churn in the end. It correctly identified the example buggy modification of
`copy_map_insert` outlined in the previous patch as violating the borrow rules.
Differential Revision: https://phab.mercurial-scm.org/D12429
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Tue, 05 Apr 2022 10:55:28 +0200 |
parents | 7dad4665d223 |
children | 6000f5b25c9b |
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 | 157 for region in self.find_sync_regions(): |
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 |