Mercurial > hg
annotate mercurial/filemerge.py @ 45059:79f6f9fa18c1
documentation: add some internals documentation about bid merge
This is an important algorithm that was only documented on the wiki so far.
Some update to the algorithm (and associated doc) is to expected in the future
since the bid merge algorithm is bug-ridden when it comes to file deletion comes
to play.
Differential Revision: https://phab.mercurial-scm.org/D8711
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Mon, 22 Jun 2020 13:32:20 +0200 |
parents | aa790f7c967a |
children | 40411ad2f5d2 |
rev | line source |
---|---|
6003
7855b88ba838
filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1 # filemerge.py - file-level merge handling for Mercurial |
7855b88ba838
filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
2 # |
7855b88ba838
filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
3 # Copyright 2006, 2007, 2008 Matt Mackall <mpm@selenic.com> |
7855b88ba838
filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
4 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8209
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
10263 | 6 # GNU General Public License version 2 or any later version. |
6003
7855b88ba838
filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
7 |
25949
80aba76e29c1
filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25835
diff
changeset
|
8 from __future__ import absolute_import |
80aba76e29c1
filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25835
diff
changeset
|
9 |
36998
3723b42ff953
filemerge: move temp file unlinks to _maketempfiles
Kyle Lippincott <spectral@google.com>
parents:
36988
diff
changeset
|
10 import contextlib |
25949
80aba76e29c1
filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25835
diff
changeset
|
11 import os |
80aba76e29c1
filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25835
diff
changeset
|
12 import re |
36999
e349ad5cbb71
filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents:
36998
diff
changeset
|
13 import shutil |
25949
80aba76e29c1
filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25835
diff
changeset
|
14 |
80aba76e29c1
filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25835
diff
changeset
|
15 from .i18n import _ |
40478
86dfae98a3a2
merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents:
39359
diff
changeset
|
16 from .node import ( |
86dfae98a3a2
merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents:
39359
diff
changeset
|
17 hex, |
86dfae98a3a2
merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents:
39359
diff
changeset
|
18 nullid, |
86dfae98a3a2
merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents:
39359
diff
changeset
|
19 short, |
86dfae98a3a2
merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents:
39359
diff
changeset
|
20 ) |
43089
c59eb1560c44
py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43085
diff
changeset
|
21 from .pycompat import ( |
c59eb1560c44
py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43085
diff
changeset
|
22 getattr, |
c59eb1560c44
py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43085
diff
changeset
|
23 open, |
c59eb1560c44
py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43085
diff
changeset
|
24 ) |
25949
80aba76e29c1
filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25835
diff
changeset
|
25 |
80aba76e29c1
filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25835
diff
changeset
|
26 from . import ( |
30636
f1c9fafcbf46
py3: replace os.environ with encoding.environ (part 3 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30538
diff
changeset
|
27 encoding, |
25949
80aba76e29c1
filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25835
diff
changeset
|
28 error, |
28955
78759f78a44e
templater: factor out function that creates templater from string template
Yuya Nishihara <yuya@tcha.org>
parents:
28954
diff
changeset
|
29 formatter, |
25949
80aba76e29c1
filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25835
diff
changeset
|
30 match, |
30073
aa23c93e636d
py3: make format strings unicodes and not bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29775
diff
changeset
|
31 pycompat, |
33699
50c44dee741a
filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33523
diff
changeset
|
32 registrar, |
27651
07fc2f2134ba
origpath: move from cmdutil to scmutil
Siddharth Agarwal <sid0@fb.com>
parents:
27599
diff
changeset
|
33 scmutil, |
25949
80aba76e29c1
filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25835
diff
changeset
|
34 simplemerge, |
80aba76e29c1
filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25835
diff
changeset
|
35 tagmerge, |
80aba76e29c1
filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25835
diff
changeset
|
36 templatekw, |
80aba76e29c1
filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25835
diff
changeset
|
37 templater, |
40478
86dfae98a3a2
merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents:
39359
diff
changeset
|
38 templateutil, |
25949
80aba76e29c1
filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25835
diff
changeset
|
39 util, |
80aba76e29c1
filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25835
diff
changeset
|
40 ) |
6004
5af5f0f9d724
merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents:
6003
diff
changeset
|
41 |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37077
diff
changeset
|
42 from .utils import ( |
37120
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37084
diff
changeset
|
43 procutil, |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37077
diff
changeset
|
44 stringutil, |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37077
diff
changeset
|
45 ) |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37077
diff
changeset
|
46 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
47 |
34826
18a3274ed675
configitems: register the full 'merge-tools' config and sub-options
Boris Feld <boris.feld@octobus.net>
parents:
34797
diff
changeset
|
48 def _toolstr(ui, tool, part, *args): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
49 return ui.config(b"merge-tools", tool + b"." + part, *args) |
6004
5af5f0f9d724
merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents:
6003
diff
changeset
|
50 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
51 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
52 def _toolbool(ui, tool, part, *args): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
53 return ui.configbool(b"merge-tools", tool + b"." + part, *args) |
6004
5af5f0f9d724
merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents:
6003
diff
changeset
|
54 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
55 |
34826
18a3274ed675
configitems: register the full 'merge-tools' config and sub-options
Boris Feld <boris.feld@octobus.net>
parents:
34797
diff
changeset
|
56 def _toollist(ui, tool, part): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
57 return ui.configlist(b"merge-tools", tool + b"." + part) |
11148
a912f26777d3
merge: introduce tool.check parameter
David Champion <dgc@uchicago.edu>
parents:
11146
diff
changeset
|
58 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
59 |
16126
0c4bec9596d8
filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16125
diff
changeset
|
60 internals = {} |
24099
be83fd9d46d5
help.merge-tools: do not double document merge tools
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23270
diff
changeset
|
61 # Merge tools to document. |
be83fd9d46d5
help.merge-tools: do not double document merge tools
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23270
diff
changeset
|
62 internalsdoc = {} |
16125
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
63 |
33699
50c44dee741a
filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33523
diff
changeset
|
64 internaltool = registrar.internalmerge() |
50c44dee741a
filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33523
diff
changeset
|
65 |
26525
abc2327e382a
filemerge: add some merge types
Siddharth Agarwal <sid0@fb.com>
parents:
26519
diff
changeset
|
66 # internal tool merge types |
33699
50c44dee741a
filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33523
diff
changeset
|
67 nomerge = internaltool.nomerge |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
68 mergeonly = internaltool.mergeonly # just the full merge, no premerge |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
69 fullmerge = internaltool.fullmerge # both premerge and merge |
26525
abc2327e382a
filemerge: add some merge types
Siddharth Agarwal <sid0@fb.com>
parents:
26519
diff
changeset
|
70 |
42565
4764e8436b2a
filemerge: make last line of prompts <40 english chars (issue6158)
Kyle Lippincott <spectral@google.com>
parents:
41600
diff
changeset
|
71 # IMPORTANT: keep the last line of this prompt very short ("What do you want to |
4764e8436b2a
filemerge: make last line of prompts <40 english chars (issue6158)
Kyle Lippincott <spectral@google.com>
parents:
41600
diff
changeset
|
72 # do?") because of issue6158, ideally to <40 English characters (to allow other |
4764e8436b2a
filemerge: make last line of prompts <40 english chars (issue6158)
Kyle Lippincott <spectral@google.com>
parents:
41600
diff
changeset
|
73 # languages that may take more columns to still have a chance to fit in an |
4764e8436b2a
filemerge: make last line of prompts <40 english chars (issue6158)
Kyle Lippincott <spectral@google.com>
parents:
41600
diff
changeset
|
74 # 80-column screen). |
32317
6587427b2018
filemerge: store error messages in module variables
Stanislau Hlebik <stash@fb.com>
parents:
32255
diff
changeset
|
75 _localchangedotherdeletedmsg = _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
76 b"file '%(fd)s' was deleted in other%(o)s but was modified in local%(l)s.\n" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
77 b"You can use (c)hanged version, (d)elete, or leave (u)nresolved.\n" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
78 b"What do you want to do?" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
79 b"$$ &Changed $$ &Delete $$ &Unresolved" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
80 ) |
32317
6587427b2018
filemerge: store error messages in module variables
Stanislau Hlebik <stash@fb.com>
parents:
32255
diff
changeset
|
81 |
6587427b2018
filemerge: store error messages in module variables
Stanislau Hlebik <stash@fb.com>
parents:
32255
diff
changeset
|
82 _otherchangedlocaldeletedmsg = _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
83 b"file '%(fd)s' was deleted in local%(l)s but was modified in other%(o)s.\n" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
84 b"You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.\n" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
85 b"What do you want to do?" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
86 b"$$ &Changed $$ &Deleted $$ &Unresolved" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
87 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
88 |
32317
6587427b2018
filemerge: store error messages in module variables
Stanislau Hlebik <stash@fb.com>
parents:
32255
diff
changeset
|
89 |
26979
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
90 class absentfilectx(object): |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
91 """Represents a file that's ostensibly in a context but is actually not |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
92 present in it. |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
93 |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
94 This is here because it's very specific to the filemerge code for now -- |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
95 other code is likely going to break with the values this returns.""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
96 |
26979
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
97 def __init__(self, ctx, f): |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
98 self._ctx = ctx |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
99 self._f = f |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
100 |
44872
aa790f7c967a
filemerge: add __bytes__ for absentfilectx
Augie Fackler <augie@google.com>
parents:
43846
diff
changeset
|
101 def __bytes__(self): |
aa790f7c967a
filemerge: add __bytes__ for absentfilectx
Augie Fackler <augie@google.com>
parents:
43846
diff
changeset
|
102 return b'absent file %s@%s' % (self._f, self._ctx) |
aa790f7c967a
filemerge: add __bytes__ for absentfilectx
Augie Fackler <augie@google.com>
parents:
43846
diff
changeset
|
103 |
26979
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
104 def path(self): |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
105 return self._f |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
106 |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
107 def size(self): |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
108 return None |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
109 |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
110 def data(self): |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
111 return None |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
112 |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
113 def filenode(self): |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
114 return nullid |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
115 |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
116 _customcmp = True |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
117 |
26979
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
118 def cmp(self, fctx): |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
119 """compare with other file context |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
120 |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
121 returns True if different from fctx. |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
122 """ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
123 return not ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
124 fctx.isabsent() |
43846
d5ce99a6db52
filemerge: fix a missing attribute usage
Matt Harbison <matt_harbison@yahoo.com>
parents:
43845
diff
changeset
|
125 and fctx.changectx() == self.changectx() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
126 and fctx.path() == self.path() |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
127 ) |
26979
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
128 |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
129 def flags(self): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
130 return b'' |
26979
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
131 |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
132 def changectx(self): |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
133 return self._ctx |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
134 |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
135 def isbinary(self): |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
136 return False |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
137 |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
138 def isabsent(self): |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
139 return True |
7b038ec6c5fd
filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents:
26967
diff
changeset
|
140 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
141 |
6004
5af5f0f9d724
merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents:
6003
diff
changeset
|
142 def _findtool(ui, tool): |
16126
0c4bec9596d8
filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16125
diff
changeset
|
143 if tool in internals: |
6522
2b181fb3a70a
use internal merge tool when specified for a merge-pattern in hgrc
Dov Feldstern <dfeldstern@fastimap.com>
parents:
6212
diff
changeset
|
144 return tool |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
145 cmd = _toolstr(ui, tool, b"executable", tool) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
146 if cmd.startswith(b'python:'): |
38041
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
147 return cmd |
23148
b405dd6c90bf
filemerge: split the logic for finding an external tool to its own function
Matt Harbison <matt_harbison@yahoo.com>
parents:
22707
diff
changeset
|
148 return findexternaltool(ui, tool) |
b405dd6c90bf
filemerge: split the logic for finding an external tool to its own function
Matt Harbison <matt_harbison@yahoo.com>
parents:
22707
diff
changeset
|
149 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
150 |
38041
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
151 def _quotetoolpath(cmd): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
152 if cmd.startswith(b'python:'): |
38041
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
153 return cmd |
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
154 return procutil.shellquote(cmd) |
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
155 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
156 |
23148
b405dd6c90bf
filemerge: split the logic for finding an external tool to its own function
Matt Harbison <matt_harbison@yahoo.com>
parents:
22707
diff
changeset
|
157 def findexternaltool(ui, tool): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
158 for kn in (b"regkey", b"regkeyalt"): |
13565
984175605311
filemerge: introduce a 'regkeyalt' merge tool variable
Steve Borho <steve@borho.org>
parents:
12788
diff
changeset
|
159 k = _toolstr(ui, tool, kn) |
984175605311
filemerge: introduce a 'regkeyalt' merge tool variable
Steve Borho <steve@borho.org>
parents:
12788
diff
changeset
|
160 if not k: |
984175605311
filemerge: introduce a 'regkeyalt' merge tool variable
Steve Borho <steve@borho.org>
parents:
12788
diff
changeset
|
161 continue |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
162 p = util.lookupreg(k, _toolstr(ui, tool, b"regname")) |
6006
3c9dbb743d20
merge: add registry look up bits to tool search
Matt Mackall <mpm@selenic.com>
parents:
6005
diff
changeset
|
163 if p: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
164 p = procutil.findexe(p + _toolstr(ui, tool, b"regappend", b"")) |
6006
3c9dbb743d20
merge: add registry look up bits to tool search
Matt Mackall <mpm@selenic.com>
parents:
6005
diff
changeset
|
165 if p: |
3c9dbb743d20
merge: add registry look up bits to tool search
Matt Mackall <mpm@selenic.com>
parents:
6005
diff
changeset
|
166 return p |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
167 exe = _toolstr(ui, tool, b"executable", tool) |
37120
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37084
diff
changeset
|
168 return procutil.findexe(util.expandpath(exe)) |
6004
5af5f0f9d724
merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents:
6003
diff
changeset
|
169 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
170 |
27039
d7517deedf86
filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27038
diff
changeset
|
171 def _picktool(repo, ui, path, binary, symlink, changedelete): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
172 strictcheck = ui.configbool(b'merge', b'strict-capability-check') |
39125
cded904f7acc
filemerge: add config knob to check capabilities of internal merge tools
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
39124
diff
changeset
|
173 |
39123
4d7b11877dd0
filemerge: add the function to examine a capability of a internal tool
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
39122
diff
changeset
|
174 def hascapability(tool, capability, strict=False): |
39266
82555d7186d0
filemerge: make capability check for internal tools ignore merge-tools section
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
39126
diff
changeset
|
175 if tool in internals: |
82555d7186d0
filemerge: make capability check for internal tools ignore merge-tools section
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
39126
diff
changeset
|
176 return strict and internals[tool].capabilities.get(capability) |
39123
4d7b11877dd0
filemerge: add the function to examine a capability of a internal tool
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
39122
diff
changeset
|
177 return _toolbool(ui, tool, capability) |
4d7b11877dd0
filemerge: add the function to examine a capability of a internal tool
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
39122
diff
changeset
|
178 |
27039
d7517deedf86
filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27038
diff
changeset
|
179 def supportscd(tool): |
d7517deedf86
filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27038
diff
changeset
|
180 return tool in internals and internals[tool].mergetype == nomerge |
d7517deedf86
filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27038
diff
changeset
|
181 |
d7517deedf86
filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27038
diff
changeset
|
182 def check(tool, pat, symlink, binary, changedelete): |
6004
5af5f0f9d724
merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents:
6003
diff
changeset
|
183 tmsg = tool |
5af5f0f9d724
merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents:
6003
diff
changeset
|
184 if pat: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
185 tmsg = _(b"%s (for pattern %s)") % (tool, pat) |
7397
4c92d8971809
More verbose logging when filemerge searches for merge-tool
Mads Kiilerich <mads@kiilerich.com>
parents:
6762
diff
changeset
|
186 if not _findtool(ui, tool): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
187 if pat: # explicitly requested tool deserves a warning |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
188 ui.warn(_(b"couldn't find merge tool %s\n") % tmsg) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
189 else: # configured but non-existing tools are more silent |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
190 ui.note(_(b"couldn't find merge tool %s\n") % tmsg) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
191 elif symlink and not hascapability(tool, b"symlink", strictcheck): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
192 ui.warn(_(b"tool %s can't handle symlinks\n") % tmsg) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
193 elif binary and not hascapability(tool, b"binary", strictcheck): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
194 ui.warn(_(b"tool %s can't handle binary\n") % tmsg) |
27039
d7517deedf86
filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27038
diff
changeset
|
195 elif changedelete and not supportscd(tool): |
d7517deedf86
filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27038
diff
changeset
|
196 # the nomerge tools are the only tools that support change/delete |
d7517deedf86
filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27038
diff
changeset
|
197 # conflicts |
d7517deedf86
filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27038
diff
changeset
|
198 pass |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
199 elif not procutil.gui() and _toolbool(ui, tool, b"gui"): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
200 ui.warn(_(b"tool %s requires a GUI\n") % tmsg) |
6004
5af5f0f9d724
merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents:
6003
diff
changeset
|
201 else: |
5af5f0f9d724
merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents:
6003
diff
changeset
|
202 return True |
5af5f0f9d724
merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents:
6003
diff
changeset
|
203 return False |
5af5f0f9d724
merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents:
6003
diff
changeset
|
204 |
25835
34ffe4c29782
filemerge: mark internal-only config option
Matt Mackall <mpm@selenic.com>
parents:
24987
diff
changeset
|
205 # internal config: ui.forcemerge |
12788
de793925862e
merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents:
12047
diff
changeset
|
206 # forcemerge comes from command line arguments, highest priority |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
207 force = ui.config(b'ui', b'forcemerge') |
12788
de793925862e
merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents:
12047
diff
changeset
|
208 if force: |
de793925862e
merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents:
12047
diff
changeset
|
209 toolpath = _findtool(ui, force) |
27039
d7517deedf86
filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27038
diff
changeset
|
210 if changedelete and not supportscd(toolpath): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
211 return b":prompt", None |
12788
de793925862e
merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents:
12047
diff
changeset
|
212 else: |
27039
d7517deedf86
filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27038
diff
changeset
|
213 if toolpath: |
38041
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
214 return (force, _quotetoolpath(toolpath)) |
27039
d7517deedf86
filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27038
diff
changeset
|
215 else: |
d7517deedf86
filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27038
diff
changeset
|
216 # mimic HGMERGE if given tool not found |
d7517deedf86
filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27038
diff
changeset
|
217 return (force, force) |
12788
de793925862e
merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents:
12047
diff
changeset
|
218 |
de793925862e
merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents:
12047
diff
changeset
|
219 # HGMERGE takes next precedence |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
220 hgmerge = encoding.environ.get(b"HGMERGE") |
6025
f2335246e5c7
filemerge: wrap quotes around tool path
Steve Borho <steve@borho.org>
parents:
6016
diff
changeset
|
221 if hgmerge: |
27039
d7517deedf86
filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27038
diff
changeset
|
222 if changedelete and not supportscd(hgmerge): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
223 return b":prompt", None |
27039
d7517deedf86
filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27038
diff
changeset
|
224 else: |
d7517deedf86
filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27038
diff
changeset
|
225 return (hgmerge, hgmerge) |
6004
5af5f0f9d724
merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents:
6003
diff
changeset
|
226 |
5af5f0f9d724
merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents:
6003
diff
changeset
|
227 # then patterns |
39125
cded904f7acc
filemerge: add config knob to check capabilities of internal merge tools
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
39124
diff
changeset
|
228 |
cded904f7acc
filemerge: add config knob to check capabilities of internal merge tools
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
39124
diff
changeset
|
229 # whether binary capability should be checked strictly |
cded904f7acc
filemerge: add config knob to check capabilities of internal merge tools
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
39124
diff
changeset
|
230 binarycap = binary and strictcheck |
cded904f7acc
filemerge: add config knob to check capabilities of internal merge tools
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
39124
diff
changeset
|
231 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
232 for pat, tool in ui.configitems(b"merge-patterns"): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
233 mf = match.match(repo.root, b'', [pat]) |
39125
cded904f7acc
filemerge: add config knob to check capabilities of internal merge tools
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
39124
diff
changeset
|
234 if mf(path) and check(tool, pat, symlink, binarycap, changedelete): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
235 if binary and not hascapability(tool, b"binary", strict=True): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
236 ui.warn( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
237 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
238 b"warning: check merge-patterns configurations," |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
239 b" if %r for binary file %r is unintentional\n" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
240 b"(see 'hg help merge-tools'" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
241 b" for binary files capability)\n" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
242 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
243 % (pycompat.bytestr(tool), pycompat.bytestr(path)) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
244 ) |
10339
23e608f42f2c
fix spaces/identation issues
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10282
diff
changeset
|
245 toolpath = _findtool(ui, tool) |
38041
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
246 return (tool, _quotetoolpath(toolpath)) |
6004
5af5f0f9d724
merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents:
6003
diff
changeset
|
247 |
5af5f0f9d724
merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents:
6003
diff
changeset
|
248 # then merge tools |
5af5f0f9d724
merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents:
6003
diff
changeset
|
249 tools = {} |
26730
a1e43e85d294
merge-tools: allow marking a mergetool as completely disabled
Augie Fackler <augie@google.com>
parents:
26614
diff
changeset
|
250 disabled = set() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
251 for k, v in ui.configitems(b"merge-tools"): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
252 t = k.split(b'.')[0] |
6004
5af5f0f9d724
merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents:
6003
diff
changeset
|
253 if t not in tools: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
254 tools[t] = int(_toolstr(ui, t, b"priority")) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
255 if _toolbool(ui, t, b"disabled"): |
26730
a1e43e85d294
merge-tools: allow marking a mergetool as completely disabled
Augie Fackler <augie@google.com>
parents:
26614
diff
changeset
|
256 disabled.add(t) |
6076
0ee885fea464
filemerge: more backwards compatible behavior for ui.merge
Steve Borho <steve@borho.org>
parents:
6075
diff
changeset
|
257 names = tools.keys() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
258 tools = sorted( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
259 [(-p, tool) for tool, p in tools.items() if tool not in disabled] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
260 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
261 uimerge = ui.config(b"ui", b"merge") |
6076
0ee885fea464
filemerge: more backwards compatible behavior for ui.merge
Steve Borho <steve@borho.org>
parents:
6075
diff
changeset
|
262 if uimerge: |
27039
d7517deedf86
filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27038
diff
changeset
|
263 # external tools defined in uimerge won't be able to handle |
d7517deedf86
filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27038
diff
changeset
|
264 # change/delete conflicts |
38952
0e58c5b20745
mergetool: warn if ui.merge points to nonexistent tool
Martin von Zweigbergk <martinvonz@google.com>
parents:
38793
diff
changeset
|
265 if check(uimerge, path, symlink, binary, changedelete): |
0e58c5b20745
mergetool: warn if ui.merge points to nonexistent tool
Martin von Zweigbergk <martinvonz@google.com>
parents:
38793
diff
changeset
|
266 if uimerge not in names and not changedelete: |
0e58c5b20745
mergetool: warn if ui.merge points to nonexistent tool
Martin von Zweigbergk <martinvonz@google.com>
parents:
38793
diff
changeset
|
267 return (uimerge, uimerge) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
268 tools.insert(0, (None, uimerge)) # highest priority |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
269 tools.append((None, b"hgmerge")) # the old default, if found |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
270 for p, t in tools: |
27039
d7517deedf86
filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27038
diff
changeset
|
271 if check(t, None, symlink, binary, changedelete): |
7397
4c92d8971809
More verbose logging when filemerge searches for merge-tool
Mads Kiilerich <mads@kiilerich.com>
parents:
6762
diff
changeset
|
272 toolpath = _findtool(ui, t) |
38041
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
273 return (t, _quotetoolpath(toolpath)) |
16254
c7eef052c9e3
filemerge: restore default prompt for binary/symlink lost in 83925d3a4559
Matt Mackall <mpm@selenic.com>
parents:
16205
diff
changeset
|
274 |
c7eef052c9e3
filemerge: restore default prompt for binary/symlink lost in 83925d3a4559
Matt Mackall <mpm@selenic.com>
parents:
16205
diff
changeset
|
275 # internal merge or prompt as last resort |
27039
d7517deedf86
filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27038
diff
changeset
|
276 if symlink or binary or changedelete: |
32253
7d4ce4b567c5
filemerge: show warning about choice of :prompt only at an actual fallback
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32047
diff
changeset
|
277 if not changedelete and len(tools): |
7d4ce4b567c5
filemerge: show warning about choice of :prompt only at an actual fallback
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32047
diff
changeset
|
278 # any tool is rejected by capability for symlink or binary |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
279 ui.warn(_(b"no tool found to merge %s\n") % path) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
280 return b":prompt", None |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
281 return b":merge", None |
6003
7855b88ba838
filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
282 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
283 |
6005
3c33032d8906
merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents:
6004
diff
changeset
|
284 def _eoltype(data): |
43787
be8552f25cab
cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents:
43503
diff
changeset
|
285 """Guess the EOL type of a file""" |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
286 if b'\0' in data: # binary |
6005
3c33032d8906
merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents:
6004
diff
changeset
|
287 return None |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
288 if b'\r\n' in data: # Windows |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
289 return b'\r\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
290 if b'\r' in data: # Old Mac |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
291 return b'\r' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
292 if b'\n' in data: # UNIX |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
293 return b'\n' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
294 return None # unknown |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
295 |
6005
3c33032d8906
merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents:
6004
diff
changeset
|
296 |
34782
f21eecc64ace
filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents:
34506
diff
changeset
|
297 def _matcheol(file, back): |
43787
be8552f25cab
cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents:
43503
diff
changeset
|
298 """Convert EOL markers in a file to match origfile""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
299 tostyle = _eoltype(back.data()) # No repo.wread filters? |
6005
3c33032d8906
merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents:
6004
diff
changeset
|
300 if tostyle: |
14168
135e244776f0
prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13565
diff
changeset
|
301 data = util.readfile(file) |
6005
3c33032d8906
merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents:
6004
diff
changeset
|
302 style = _eoltype(data) |
3c33032d8906
merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents:
6004
diff
changeset
|
303 if style: |
3c33032d8906
merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents:
6004
diff
changeset
|
304 newdata = data.replace(style, tostyle) |
3c33032d8906
merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents:
6004
diff
changeset
|
305 if newdata != data: |
14168
135e244776f0
prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13565
diff
changeset
|
306 util.writefile(file, newdata) |
6005
3c33032d8906
merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents:
6004
diff
changeset
|
307 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
308 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
309 @internaltool(b'prompt', nomerge) |
29774
a7f8939641aa
merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents:
29660
diff
changeset
|
310 def _iprompt(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None): |
28640
4fc640fd0026
filemerge: use revset notation for p1/p2 of local/other descriptions
timeless <timeless@mozdev.org>
parents:
28578
diff
changeset
|
311 """Asks the user which of the local `p1()` or the other `p2()` version to |
4fc640fd0026
filemerge: use revset notation for p1/p2 of local/other descriptions
timeless <timeless@mozdev.org>
parents:
28578
diff
changeset
|
312 keep as the merged version.""" |
16125
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
313 ui = repo.ui |
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
314 fd = fcd.path() |
41510
faa49a5914bb
merge: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents:
41365
diff
changeset
|
315 uipathfn = scmutil.getuipathfn(repo) |
16125
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
316 |
35282
46d7f0713a87
filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents:
35281
diff
changeset
|
317 # Avoid prompting during an in-memory merge since it doesn't support merge |
46d7f0713a87
filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents:
35281
diff
changeset
|
318 # conflicts. |
46d7f0713a87
filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents:
35281
diff
changeset
|
319 if fcd.changectx().isinmemory(): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
320 raise error.InMemoryMergeConflictsError( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43106
diff
changeset
|
321 b'in-memory merge does not support file conflicts' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
322 ) |
35282
46d7f0713a87
filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents:
35281
diff
changeset
|
323 |
29774
a7f8939641aa
merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents:
29660
diff
changeset
|
324 prompts = partextras(labels) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
325 prompts[b'fd'] = uipathfn(fd) |
26898
33eb8a56d0c9
filemerge: treat EOF at prompt as fail, not abort
Siddharth Agarwal <sid0@fb.com>
parents:
26893
diff
changeset
|
326 try: |
27038
58a4eb16e722
filemerge: add support for change/delete conflicts to the ':prompt' tool
Siddharth Agarwal <sid0@fb.com>
parents:
27037
diff
changeset
|
327 if fco.isabsent(): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
328 index = ui.promptchoice(_localchangedotherdeletedmsg % prompts, 2) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
329 choice = [b'local', b'other', b'unresolved'][index] |
27038
58a4eb16e722
filemerge: add support for change/delete conflicts to the ':prompt' tool
Siddharth Agarwal <sid0@fb.com>
parents:
27037
diff
changeset
|
330 elif fcd.isabsent(): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
331 index = ui.promptchoice(_otherchangedlocaldeletedmsg % prompts, 2) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
332 choice = [b'other', b'local', b'unresolved'][index] |
27038
58a4eb16e722
filemerge: add support for change/delete conflicts to the ':prompt' tool
Siddharth Agarwal <sid0@fb.com>
parents:
27037
diff
changeset
|
333 else: |
42565
4764e8436b2a
filemerge: make last line of prompts <40 english chars (issue6158)
Kyle Lippincott <spectral@google.com>
parents:
41600
diff
changeset
|
334 # IMPORTANT: keep the last line of this prompt ("What do you want to |
4764e8436b2a
filemerge: make last line of prompts <40 english chars (issue6158)
Kyle Lippincott <spectral@google.com>
parents:
41600
diff
changeset
|
335 # do?") very short, see comment next to _localchangedotherdeletedmsg |
4764e8436b2a
filemerge: make last line of prompts <40 english chars (issue6158)
Kyle Lippincott <spectral@google.com>
parents:
41600
diff
changeset
|
336 # at the top of the file for details. |
27162
4ab69be0ea15
filemerge: add a 'leave unresolved' option to regular prompts
Siddharth Agarwal <sid0@fb.com>
parents:
27161
diff
changeset
|
337 index = ui.promptchoice( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
338 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
339 b"file '%(fd)s' needs to be resolved.\n" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
340 b"You can keep (l)ocal%(l)s, take (o)ther%(o)s, or leave " |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
341 b"(u)nresolved.\n" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
342 b"What do you want to do?" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
343 b"$$ &Local $$ &Other $$ &Unresolved" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
344 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
345 % prompts, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
346 2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
347 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
348 choice = [b'local', b'other', b'unresolved'][index] |
26851
859f453e8b4e
filemerge.prompt: separate out choice selection and action
Siddharth Agarwal <sid0@fb.com>
parents:
26730
diff
changeset
|
349 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
350 if choice == b'other': |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
351 return _iother(repo, mynode, orig, fcd, fco, fca, toolconf, labels) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
352 elif choice == b'local': |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
353 return _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf, labels) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
354 elif choice == b'unresolved': |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
355 return _ifail(repo, mynode, orig, fcd, fco, fca, toolconf, labels) |
26898
33eb8a56d0c9
filemerge: treat EOF at prompt as fail, not abort
Siddharth Agarwal <sid0@fb.com>
parents:
26893
diff
changeset
|
356 except error.ResponseExpected: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
357 ui.write(b"\n") |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
358 return _ifail(repo, mynode, orig, fcd, fco, fca, toolconf, labels) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
359 |
16125
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
360 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
361 @internaltool(b'local', nomerge) |
29774
a7f8939641aa
merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents:
29660
diff
changeset
|
362 def _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None): |
28640
4fc640fd0026
filemerge: use revset notation for p1/p2 of local/other descriptions
timeless <timeless@mozdev.org>
parents:
28578
diff
changeset
|
363 """Uses the local `p1()` version of files as the merged version.""" |
27036
63d6bc874dea
filemerge: add support for change/delete conflicts to the ':local' merge tool
Siddharth Agarwal <sid0@fb.com>
parents:
27034
diff
changeset
|
364 return 0, fcd.isabsent() |
16125
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
365 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
366 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
367 @internaltool(b'other', nomerge) |
29774
a7f8939641aa
merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents:
29660
diff
changeset
|
368 def _iother(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None): |
28640
4fc640fd0026
filemerge: use revset notation for p1/p2 of local/other descriptions
timeless <timeless@mozdev.org>
parents:
28578
diff
changeset
|
369 """Uses the other `p2()` version of files as the merged version.""" |
27037
a8908c139f2f
filemerge: add support for change/delete conflicts to the ':other' merge tool
Siddharth Agarwal <sid0@fb.com>
parents:
27036
diff
changeset
|
370 if fco.isabsent(): |
a8908c139f2f
filemerge: add support for change/delete conflicts to the ':other' merge tool
Siddharth Agarwal <sid0@fb.com>
parents:
27036
diff
changeset
|
371 # local changed, remote deleted -- 'deleted' picked |
33151
851825214aa3
filemerge: convert a couple of wvfs calls in internal mergetools to contexts
Phil Cohen <phillco@fb.com>
parents:
32873
diff
changeset
|
372 _underlyingfctxifabsent(fcd).remove() |
27037
a8908c139f2f
filemerge: add support for change/delete conflicts to the ':other' merge tool
Siddharth Agarwal <sid0@fb.com>
parents:
27036
diff
changeset
|
373 deleted = True |
a8908c139f2f
filemerge: add support for change/delete conflicts to the ':other' merge tool
Siddharth Agarwal <sid0@fb.com>
parents:
27036
diff
changeset
|
374 else: |
33151
851825214aa3
filemerge: convert a couple of wvfs calls in internal mergetools to contexts
Phil Cohen <phillco@fb.com>
parents:
32873
diff
changeset
|
375 _underlyingfctxifabsent(fcd).write(fco.data(), fco.flags()) |
27037
a8908c139f2f
filemerge: add support for change/delete conflicts to the ':other' merge tool
Siddharth Agarwal <sid0@fb.com>
parents:
27036
diff
changeset
|
376 deleted = False |
a8908c139f2f
filemerge: add support for change/delete conflicts to the ':other' merge tool
Siddharth Agarwal <sid0@fb.com>
parents:
27036
diff
changeset
|
377 return 0, deleted |
16125
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
378 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
379 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
380 @internaltool(b'fail', nomerge) |
29774
a7f8939641aa
merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents:
29660
diff
changeset
|
381 def _ifail(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None): |
16127
14dc2bbba6d2
filemerge: remove some redundancy in decorators/docstrings
Matt Mackall <mpm@selenic.com>
parents:
16126
diff
changeset
|
382 """ |
16126
0c4bec9596d8
filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16125
diff
changeset
|
383 Rather than attempting to merge files that were modified on both |
0c4bec9596d8
filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16125
diff
changeset
|
384 branches, it marks them as unresolved. The resolve command must be |
0c4bec9596d8
filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16125
diff
changeset
|
385 used to resolve these conflicts.""" |
27123
4dc5951df1e4
filemerge: in ':fail' tool, write out other side if local side is deleted
Siddharth Agarwal <sid0@fb.com>
parents:
27047
diff
changeset
|
386 # for change/delete conflicts write out the changed version, then fail |
4dc5951df1e4
filemerge: in ':fail' tool, write out other side if local side is deleted
Siddharth Agarwal <sid0@fb.com>
parents:
27047
diff
changeset
|
387 if fcd.isabsent(): |
33151
851825214aa3
filemerge: convert a couple of wvfs calls in internal mergetools to contexts
Phil Cohen <phillco@fb.com>
parents:
32873
diff
changeset
|
388 _underlyingfctxifabsent(fcd).write(fco.data(), fco.flags()) |
27032
28ee7af4b685
filemerge: return whether the file is deleted for nomerge internal tools
Siddharth Agarwal <sid0@fb.com>
parents:
26979
diff
changeset
|
389 return 1, False |
16125
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
390 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
391 |
33151
851825214aa3
filemerge: convert a couple of wvfs calls in internal mergetools to contexts
Phil Cohen <phillco@fb.com>
parents:
32873
diff
changeset
|
392 def _underlyingfctxifabsent(filectx): |
851825214aa3
filemerge: convert a couple of wvfs calls in internal mergetools to contexts
Phil Cohen <phillco@fb.com>
parents:
32873
diff
changeset
|
393 """Sometimes when resolving, our fcd is actually an absentfilectx, but |
851825214aa3
filemerge: convert a couple of wvfs calls in internal mergetools to contexts
Phil Cohen <phillco@fb.com>
parents:
32873
diff
changeset
|
394 we want to write to it (to do the resolve). This helper returns the |
851825214aa3
filemerge: convert a couple of wvfs calls in internal mergetools to contexts
Phil Cohen <phillco@fb.com>
parents:
32873
diff
changeset
|
395 underyling workingfilectx in that case. |
851825214aa3
filemerge: convert a couple of wvfs calls in internal mergetools to contexts
Phil Cohen <phillco@fb.com>
parents:
32873
diff
changeset
|
396 """ |
851825214aa3
filemerge: convert a couple of wvfs calls in internal mergetools to contexts
Phil Cohen <phillco@fb.com>
parents:
32873
diff
changeset
|
397 if filectx.isabsent(): |
851825214aa3
filemerge: convert a couple of wvfs calls in internal mergetools to contexts
Phil Cohen <phillco@fb.com>
parents:
32873
diff
changeset
|
398 return filectx.changectx()[filectx.path()] |
851825214aa3
filemerge: convert a couple of wvfs calls in internal mergetools to contexts
Phil Cohen <phillco@fb.com>
parents:
32873
diff
changeset
|
399 else: |
851825214aa3
filemerge: convert a couple of wvfs calls in internal mergetools to contexts
Phil Cohen <phillco@fb.com>
parents:
32873
diff
changeset
|
400 return filectx |
851825214aa3
filemerge: convert a couple of wvfs calls in internal mergetools to contexts
Phil Cohen <phillco@fb.com>
parents:
32873
diff
changeset
|
401 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
402 |
27041
0e330f59ef68
filemerge: don't attempt to premerge change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27040
diff
changeset
|
403 def _premerge(repo, fcd, fco, fca, toolconf, files, labels=None): |
38041
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
404 tool, toolpath, binary, symlink, scriptfn = toolconf |
27041
0e330f59ef68
filemerge: don't attempt to premerge change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27040
diff
changeset
|
405 if symlink or fcd.isabsent() or fco.isabsent(): |
18257
a35d0128545e
merge: never do premerge on symlinks
Mads Kiilerich <mads@kiilerich.com>
parents:
18256
diff
changeset
|
406 return 1 |
34032
67cfffbfb6a0
filemerge: eliminate most uses of tempfiles
Phil Cohen <phillco@fb.com>
parents:
34031
diff
changeset
|
407 unused, unused, unused, back = files |
16125
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
408 |
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
409 ui = repo.ui |
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
410 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
411 validkeep = [b'keep', b'keep-merge3'] |
22031
b36c60cfe46f
merge-tools: make premerge valid values extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22028
diff
changeset
|
412 |
16125
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
413 # do we attempt to simplemerge first? |
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
414 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
415 premerge = _toolbool(ui, tool, b"premerge", not binary) |
16125
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
416 except error.ConfigError: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
417 premerge = _toolstr(ui, tool, b"premerge", b"").lower() |
22031
b36c60cfe46f
merge-tools: make premerge valid values extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22028
diff
changeset
|
418 if premerge not in validkeep: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
419 _valid = b', '.join([b"'" + v + b"'" for v in validkeep]) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
420 raise error.ConfigError( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43106
diff
changeset
|
421 _(b"%s.premerge not valid ('%s' is neither boolean nor %s)") |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
422 % (tool, premerge, _valid) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
423 ) |
16125
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
424 |
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
425 if premerge: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
426 if premerge == b'keep-merge3': |
22032
d7f25834ffbb
merge-tools: add a `premerge=keep-merge3` config option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22031
diff
changeset
|
427 if not labels: |
d7f25834ffbb
merge-tools: add a `premerge=keep-merge3` config option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22031
diff
changeset
|
428 labels = _defaultconflictlabels |
d7f25834ffbb
merge-tools: add a `premerge=keep-merge3` config option
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22031
diff
changeset
|
429 if len(labels) < 3: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
430 labels.append(b'base') |
34049
6330df9d6393
simplemerge: remove unused `repo` parameter
Phil Cohen <phillco@fb.com>
parents:
34036
diff
changeset
|
431 r = simplemerge.simplemerge(ui, fcd, fca, fco, quiet=True, label=labels) |
16125
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
432 if not r: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
433 ui.debug(b" premerge successful\n") |
16125
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
434 return 0 |
22031
b36c60cfe46f
merge-tools: make premerge valid values extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22028
diff
changeset
|
435 if premerge not in validkeep: |
34032
67cfffbfb6a0
filemerge: eliminate most uses of tempfiles
Phil Cohen <phillco@fb.com>
parents:
34031
diff
changeset
|
436 # restore from backup and try again |
34036
fe04c018eaac
filemerge: add _restorebackup
Phil Cohen <phillco@fb.com>
parents:
34035
diff
changeset
|
437 _restorebackup(fcd, back) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
438 return 1 # continue merging |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
439 |
16125
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
440 |
26948
067ab07435c9
filemerge: rename _symlinkcheck to _mergecheck
Siddharth Agarwal <sid0@fb.com>
parents:
26941
diff
changeset
|
441 def _mergecheck(repo, mynode, orig, fcd, fco, fca, toolconf): |
38041
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
442 tool, toolpath, binary, symlink, scriptfn = toolconf |
41510
faa49a5914bb
merge: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents:
41365
diff
changeset
|
443 uipathfn = scmutil.getuipathfn(repo) |
26515
0ffa7fe1076b
filemerge: add a precheck for symlinks
Siddharth Agarwal <sid0@fb.com>
parents:
26514
diff
changeset
|
444 if symlink: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
445 repo.ui.warn( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43106
diff
changeset
|
446 _(b'warning: internal %s cannot merge symlinks for %s\n') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
447 % (tool, uipathfn(fcd.path())) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
448 ) |
26515
0ffa7fe1076b
filemerge: add a precheck for symlinks
Siddharth Agarwal <sid0@fb.com>
parents:
26514
diff
changeset
|
449 return False |
27040
1bde66b89bb2
filemerge._mergecheck: add check for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27039
diff
changeset
|
450 if fcd.isabsent() or fco.isabsent(): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
451 repo.ui.warn( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
452 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
453 b'warning: internal %s cannot merge change/delete ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
454 b'conflict for %s\n' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
455 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
456 % (tool, uipathfn(fcd.path())) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
457 ) |
27040
1bde66b89bb2
filemerge._mergecheck: add check for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27039
diff
changeset
|
458 return False |
26515
0ffa7fe1076b
filemerge: add a precheck for symlinks
Siddharth Agarwal <sid0@fb.com>
parents:
26514
diff
changeset
|
459 return True |
0ffa7fe1076b
filemerge: add a precheck for symlinks
Siddharth Agarwal <sid0@fb.com>
parents:
26514
diff
changeset
|
460 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
461 |
26070
e15966216aec
filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents:
25949
diff
changeset
|
462 def _merge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels, mode): |
16127
14dc2bbba6d2
filemerge: remove some redundancy in decorators/docstrings
Matt Mackall <mpm@selenic.com>
parents:
16126
diff
changeset
|
463 """ |
16126
0c4bec9596d8
filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16125
diff
changeset
|
464 Uses the internal non-interactive simple merge algorithm for merging |
0c4bec9596d8
filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16125
diff
changeset
|
465 files. It will fail if there are any conflicts and leave markers in |
22027
b98e5c7afc70
internal:merge: update documentation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22026
diff
changeset
|
466 the partially merged file. Markers will have two sections, one for each side |
26070
e15966216aec
filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents:
25949
diff
changeset
|
467 of merge, unless mode equals 'union' which suppresses the markers.""" |
26572
c7850af6bb75
filemerge._merge: drop no longer necessary 'if r:' check
Siddharth Agarwal <sid0@fb.com>
parents:
26567
diff
changeset
|
468 ui = repo.ui |
16125
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
469 |
34049
6330df9d6393
simplemerge: remove unused `repo` parameter
Phil Cohen <phillco@fb.com>
parents:
34036
diff
changeset
|
470 r = simplemerge.simplemerge(ui, fcd, fca, fco, label=labels, mode=mode) |
27033
089dab8794dc
filemerge: return whether the file is deleted from all other merge tools
Siddharth Agarwal <sid0@fb.com>
parents:
27032
diff
changeset
|
471 return True, r, False |
16125
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
472 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
473 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
474 @internaltool( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
475 b'union', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
476 fullmerge, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
477 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
478 b"warning: conflicts while merging %s! " |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
479 b"(edit, then use 'hg resolve --mark')\n" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
480 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
481 precheck=_mergecheck, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
482 ) |
26071
ff12a6c63c3d
filemerge: add 'union' merge to internal merge tool
Erik Huelsmann <ehuels@gmail.com>
parents:
26070
diff
changeset
|
483 def _iunion(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None): |
ff12a6c63c3d
filemerge: add 'union' merge to internal merge tool
Erik Huelsmann <ehuels@gmail.com>
parents:
26070
diff
changeset
|
484 """ |
ff12a6c63c3d
filemerge: add 'union' merge to internal merge tool
Erik Huelsmann <ehuels@gmail.com>
parents:
26070
diff
changeset
|
485 Uses the internal non-interactive simple merge algorithm for merging |
ff12a6c63c3d
filemerge: add 'union' merge to internal merge tool
Erik Huelsmann <ehuels@gmail.com>
parents:
26070
diff
changeset
|
486 files. It will use both left and right sides for conflict regions. |
ff12a6c63c3d
filemerge: add 'union' merge to internal merge tool
Erik Huelsmann <ehuels@gmail.com>
parents:
26070
diff
changeset
|
487 No markers are inserted.""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
488 return _merge( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
489 repo, mynode, orig, fcd, fco, fca, toolconf, files, labels, b'union' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
490 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
491 |
26071
ff12a6c63c3d
filemerge: add 'union' merge to internal merge tool
Erik Huelsmann <ehuels@gmail.com>
parents:
26070
diff
changeset
|
492 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
493 @internaltool( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
494 b'merge', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
495 fullmerge, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
496 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
497 b"warning: conflicts while merging %s! " |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
498 b"(edit, then use 'hg resolve --mark')\n" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
499 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
500 precheck=_mergecheck, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
501 ) |
26070
e15966216aec
filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents:
25949
diff
changeset
|
502 def _imerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None): |
e15966216aec
filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents:
25949
diff
changeset
|
503 """ |
e15966216aec
filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents:
25949
diff
changeset
|
504 Uses the internal non-interactive simple merge algorithm for merging |
e15966216aec
filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents:
25949
diff
changeset
|
505 files. It will fail if there are any conflicts and leave markers in |
e15966216aec
filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents:
25949
diff
changeset
|
506 the partially merged file. Markers will have two sections, one for each side |
e15966216aec
filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents:
25949
diff
changeset
|
507 of merge.""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
508 return _merge( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
509 repo, mynode, orig, fcd, fco, fca, toolconf, files, labels, b'merge' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
510 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
511 |
26070
e15966216aec
filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents:
25949
diff
changeset
|
512 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
513 @internaltool( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
514 b'merge3', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
515 fullmerge, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
516 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
517 b"warning: conflicts while merging %s! " |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
518 b"(edit, then use 'hg resolve --mark')\n" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
519 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
520 precheck=_mergecheck, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
521 ) |
22028
3d0572ab3b4a
merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
22027
diff
changeset
|
522 def _imerge3(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None): |
3d0572ab3b4a
merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
22027
diff
changeset
|
523 """ |
3d0572ab3b4a
merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
22027
diff
changeset
|
524 Uses the internal non-interactive simple merge algorithm for merging |
3d0572ab3b4a
merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
22027
diff
changeset
|
525 files. It will fail if there are any conflicts and leave markers in |
3d0572ab3b4a
merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
22027
diff
changeset
|
526 the partially merged file. Marker will have three sections, one from each |
3d0572ab3b4a
merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
22027
diff
changeset
|
527 side of the merge and one for the base content.""" |
3d0572ab3b4a
merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
22027
diff
changeset
|
528 if not labels: |
3d0572ab3b4a
merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
22027
diff
changeset
|
529 labels = _defaultconflictlabels |
3d0572ab3b4a
merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
22027
diff
changeset
|
530 if len(labels) < 3: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
531 labels.append(b'base') |
22028
3d0572ab3b4a
merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
22027
diff
changeset
|
532 return _imerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels) |
3d0572ab3b4a
merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
22027
diff
changeset
|
533 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
534 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
535 def _imergeauto( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
536 repo, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
537 mynode, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
538 orig, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
539 fcd, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
540 fco, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
541 fca, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
542 toolconf, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
543 files, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
544 labels=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
545 localorother=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
546 ): |
26224
a4da463df6cf
filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26071
diff
changeset
|
547 """ |
a4da463df6cf
filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26071
diff
changeset
|
548 Generic driver for _imergelocal and _imergeother |
a4da463df6cf
filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26071
diff
changeset
|
549 """ |
a4da463df6cf
filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26071
diff
changeset
|
550 assert localorother is not None |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
551 r = simplemerge.simplemerge( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
552 repo.ui, fcd, fca, fco, label=labels, localorother=localorother |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
553 ) |
26224
a4da463df6cf
filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26071
diff
changeset
|
554 return True, r |
a4da463df6cf
filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26071
diff
changeset
|
555 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
556 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
557 @internaltool(b'merge-local', mergeonly, precheck=_mergecheck) |
26224
a4da463df6cf
filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26071
diff
changeset
|
558 def _imergelocal(*args, **kwargs): |
a4da463df6cf
filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26071
diff
changeset
|
559 """ |
a4da463df6cf
filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26071
diff
changeset
|
560 Like :merge, but resolve all conflicts non-interactively in favor |
28640
4fc640fd0026
filemerge: use revset notation for p1/p2 of local/other descriptions
timeless <timeless@mozdev.org>
parents:
28578
diff
changeset
|
561 of the local `p1()` changes.""" |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
562 success, status = _imergeauto(localorother=b'local', *args, **kwargs) |
27033
089dab8794dc
filemerge: return whether the file is deleted from all other merge tools
Siddharth Agarwal <sid0@fb.com>
parents:
27032
diff
changeset
|
563 return success, status, False |
26224
a4da463df6cf
filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26071
diff
changeset
|
564 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
565 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
566 @internaltool(b'merge-other', mergeonly, precheck=_mergecheck) |
26224
a4da463df6cf
filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26071
diff
changeset
|
567 def _imergeother(*args, **kwargs): |
a4da463df6cf
filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26071
diff
changeset
|
568 """ |
a4da463df6cf
filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26071
diff
changeset
|
569 Like :merge, but resolve all conflicts non-interactively in favor |
28640
4fc640fd0026
filemerge: use revset notation for p1/p2 of local/other descriptions
timeless <timeless@mozdev.org>
parents:
28578
diff
changeset
|
570 of the other `p2()` changes.""" |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
571 success, status = _imergeauto(localorother=b'other', *args, **kwargs) |
27033
089dab8794dc
filemerge: return whether the file is deleted from all other merge tools
Siddharth Agarwal <sid0@fb.com>
parents:
27032
diff
changeset
|
572 return success, status, False |
26224
a4da463df6cf
filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26071
diff
changeset
|
573 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
574 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
575 @internaltool( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
576 b'tagmerge', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
577 mergeonly, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
578 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
579 b"automatic tag merging of %s failed! " |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
580 b"(use 'hg resolve --tool :merge' or another merge " |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
581 b"tool of your choice)\n" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
582 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
583 ) |
21922
50e20154cb68
filemerge: add internal:tagmerge merge tool
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21921
diff
changeset
|
584 def _itagmerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None): |
50e20154cb68
filemerge: add internal:tagmerge merge tool
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21921
diff
changeset
|
585 """ |
50e20154cb68
filemerge: add internal:tagmerge merge tool
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21921
diff
changeset
|
586 Uses the internal tag merge algorithm (experimental). |
50e20154cb68
filemerge: add internal:tagmerge merge tool
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21921
diff
changeset
|
587 """ |
27033
089dab8794dc
filemerge: return whether the file is deleted from all other merge tools
Siddharth Agarwal <sid0@fb.com>
parents:
27032
diff
changeset
|
588 success, status = tagmerge.merge(repo, fcd, fco, fca) |
089dab8794dc
filemerge: return whether the file is deleted from all other merge tools
Siddharth Agarwal <sid0@fb.com>
parents:
27032
diff
changeset
|
589 return success, status, False |
21922
50e20154cb68
filemerge: add internal:tagmerge merge tool
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
21921
diff
changeset
|
590 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
591 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
592 @internaltool(b'dump', fullmerge, binary=True, symlink=True) |
21273
20b8090d8125
merge: define conflict marker labels in filemerge()
Durham Goode <durham@fb.com>
parents:
21100
diff
changeset
|
593 def _idump(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None): |
16127
14dc2bbba6d2
filemerge: remove some redundancy in decorators/docstrings
Matt Mackall <mpm@selenic.com>
parents:
16126
diff
changeset
|
594 """ |
16126
0c4bec9596d8
filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16125
diff
changeset
|
595 Creates three versions of the files to merge, containing the |
0c4bec9596d8
filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16125
diff
changeset
|
596 contents of local, other and base. These files can then be used to |
0c4bec9596d8
filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16125
diff
changeset
|
597 perform a merge manually. If the file to be merged is named |
0c4bec9596d8
filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16125
diff
changeset
|
598 ``a.txt``, these files will accordingly be named ``a.txt.local``, |
0c4bec9596d8
filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16125
diff
changeset
|
599 ``a.txt.other`` and ``a.txt.base`` and they will be placed in the |
32255
7e35d31b41fd
filemerge: add internal merge tool to dump files forcibly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32254
diff
changeset
|
600 same directory as ``a.txt``. |
7e35d31b41fd
filemerge: add internal merge tool to dump files forcibly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32254
diff
changeset
|
601 |
34915
cab34bda259e
help: fix typo in hg merge documentation
Joe Blaylock <jrbl@google.com>
parents:
34826
diff
changeset
|
602 This implies premerge. Therefore, files aren't dumped, if premerge |
32255
7e35d31b41fd
filemerge: add internal merge tool to dump files forcibly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32254
diff
changeset
|
603 runs successfully. Use :forcedump to forcibly write files out. |
7e35d31b41fd
filemerge: add internal merge tool to dump files forcibly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32254
diff
changeset
|
604 """ |
34034
7558917f291e
filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents:
34033
diff
changeset
|
605 a = _workingpath(repo, fcd) |
26573
a875773cf537
filemerge._idump: drop no longer necessary 'if r:' check
Siddharth Agarwal <sid0@fb.com>
parents:
26572
diff
changeset
|
606 fd = fcd.path() |
16125
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
607 |
34785
1af4561b6bfe
filemerge: add a missing flushall()
Phil Cohen <phillco@fb.com>
parents:
34784
diff
changeset
|
608 from . import context |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
609 |
34785
1af4561b6bfe
filemerge: add a missing flushall()
Phil Cohen <phillco@fb.com>
parents:
34784
diff
changeset
|
610 if isinstance(fcd, context.overlayworkingfilectx): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
611 raise error.InMemoryMergeConflictsError( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43106
diff
changeset
|
612 b'in-memory merge does not support the :dump tool.' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
613 ) |
34785
1af4561b6bfe
filemerge: add a missing flushall()
Phil Cohen <phillco@fb.com>
parents:
34784
diff
changeset
|
614 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
615 util.writefile(a + b".local", fcd.decodeddata()) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
616 repo.wwrite(fd + b".other", fco.data(), fco.flags()) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
617 repo.wwrite(fd + b".base", fca.data(), fca.flags()) |
27033
089dab8794dc
filemerge: return whether the file is deleted from all other merge tools
Siddharth Agarwal <sid0@fb.com>
parents:
27032
diff
changeset
|
618 return False, 1, False |
16125
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
619 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
620 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
621 @internaltool(b'forcedump', mergeonly, binary=True, symlink=True) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
622 def _forcedump(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None): |
32255
7e35d31b41fd
filemerge: add internal merge tool to dump files forcibly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32254
diff
changeset
|
623 """ |
7e35d31b41fd
filemerge: add internal merge tool to dump files forcibly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32254
diff
changeset
|
624 Creates three versions of the files as same as :dump, but omits premerge. |
7e35d31b41fd
filemerge: add internal merge tool to dump files forcibly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32254
diff
changeset
|
625 """ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
626 return _idump( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
627 repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=labels |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
628 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
629 |
32255
7e35d31b41fd
filemerge: add internal merge tool to dump files forcibly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32254
diff
changeset
|
630 |
35463
ef7e667a4f7b
filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents:
35282
diff
changeset
|
631 def _xmergeimm(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None): |
ef7e667a4f7b
filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents:
35282
diff
changeset
|
632 # In-memory merge simply raises an exception on all external merge tools, |
ef7e667a4f7b
filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents:
35282
diff
changeset
|
633 # for now. |
ef7e667a4f7b
filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents:
35282
diff
changeset
|
634 # |
ef7e667a4f7b
filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents:
35282
diff
changeset
|
635 # It would be possible to run most tools with temporary files, but this |
ef7e667a4f7b
filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents:
35282
diff
changeset
|
636 # raises the question of what to do if the user only partially resolves the |
ef7e667a4f7b
filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents:
35282
diff
changeset
|
637 # file -- we can't leave a merge state. (Copy to somewhere in the .hg/ |
ef7e667a4f7b
filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents:
35282
diff
changeset
|
638 # directory and tell the user how to get it is my best idea, but it's |
ef7e667a4f7b
filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents:
35282
diff
changeset
|
639 # clunky.) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
640 raise error.InMemoryMergeConflictsError( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43106
diff
changeset
|
641 b'in-memory merge does not support external merge tools' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
642 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
643 |
35463
ef7e667a4f7b
filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents:
35282
diff
changeset
|
644 |
40478
86dfae98a3a2
merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents:
39359
diff
changeset
|
645 def _describemerge(ui, repo, mynode, fcl, fcb, fco, env, toolpath, args): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
646 tmpl = ui.config(b'ui', b'pre-merge-tool-output-template') |
40478
86dfae98a3a2
merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents:
39359
diff
changeset
|
647 if not tmpl: |
86dfae98a3a2
merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents:
39359
diff
changeset
|
648 return |
86dfae98a3a2
merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents:
39359
diff
changeset
|
649 |
86dfae98a3a2
merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents:
39359
diff
changeset
|
650 mappingdict = templateutil.mappingdict |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
651 props = { |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
652 b'ctx': fcl.changectx(), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
653 b'node': hex(mynode), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
654 b'path': fcl.path(), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
655 b'local': mappingdict( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
656 { |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
657 b'ctx': fcl.changectx(), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
658 b'fctx': fcl, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
659 b'node': hex(mynode), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
660 b'name': _(b'local'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
661 b'islink': b'l' in fcl.flags(), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
662 b'label': env[b'HG_MY_LABEL'], |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
663 } |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
664 ), |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
665 b'base': mappingdict( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
666 { |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
667 b'ctx': fcb.changectx(), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
668 b'fctx': fcb, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
669 b'name': _(b'base'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
670 b'islink': b'l' in fcb.flags(), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
671 b'label': env[b'HG_BASE_LABEL'], |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
672 } |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
673 ), |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
674 b'other': mappingdict( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
675 { |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
676 b'ctx': fco.changectx(), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
677 b'fctx': fco, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
678 b'name': _(b'other'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
679 b'islink': b'l' in fco.flags(), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
680 b'label': env[b'HG_OTHER_LABEL'], |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
681 } |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
682 ), |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
683 b'toolpath': toolpath, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
684 b'toolargs': args, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
685 } |
40478
86dfae98a3a2
merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents:
39359
diff
changeset
|
686 |
86dfae98a3a2
merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents:
39359
diff
changeset
|
687 # TODO: make all of this something that can be specified on a per-tool basis |
86dfae98a3a2
merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents:
39359
diff
changeset
|
688 tmpl = templater.unquotestring(tmpl) |
86dfae98a3a2
merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents:
39359
diff
changeset
|
689 |
86dfae98a3a2
merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents:
39359
diff
changeset
|
690 # Not using cmdutil.rendertemplate here since it causes errors importing |
86dfae98a3a2
merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents:
39359
diff
changeset
|
691 # things for us to import cmdutil. |
86dfae98a3a2
merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents:
39359
diff
changeset
|
692 tres = formatter.templateresources(ui, repo) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
693 t = formatter.maketemplater( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
694 ui, tmpl, defaults=templatekw.keywords, resources=tres |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
695 ) |
40478
86dfae98a3a2
merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents:
39359
diff
changeset
|
696 ui.status(t.renderdefault(props)) |
86dfae98a3a2
merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents:
39359
diff
changeset
|
697 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
698 |
43845
1ffbd03c8d75
filemerge: drop a default argument to appease pytype
Matt Harbison <matt_harbison@yahoo.com>
parents:
43787
diff
changeset
|
699 def _xmerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels): |
38041
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
700 tool, toolpath, binary, symlink, scriptfn = toolconf |
41510
faa49a5914bb
merge: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents:
41365
diff
changeset
|
701 uipathfn = scmutil.getuipathfn(repo) |
27042
30b919bc49bf
filemerge: don't try using external tools on change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27041
diff
changeset
|
702 if fcd.isabsent() or fco.isabsent(): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
703 repo.ui.warn( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43106
diff
changeset
|
704 _(b'warning: %s cannot merge change/delete conflict for %s\n') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
705 % (tool, uipathfn(fcd.path())) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
706 ) |
27042
30b919bc49bf
filemerge: don't try using external tools on change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27041
diff
changeset
|
707 return False, 1, None |
34035
96123bdea43e
filemerge: reduce creation of tempfiles until needed
Phil Cohen <phillco@fb.com>
parents:
34034
diff
changeset
|
708 unused, unused, unused, back = files |
36976
a4a95bd7158d
filemerge: give some variables in _xmerge more descriptive names
Kyle Lippincott <spectral@google.com>
parents:
36835
diff
changeset
|
709 localpath = _workingpath(repo, fcd) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
710 args = _toolstr(repo.ui, tool, b"args") |
37077
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
711 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
712 with _maketempfiles( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
713 repo, fco, fca, repo.wvfs.join(back.path()), b"$output" in args |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
714 ) as temppaths: |
37077
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
715 basepath, otherpath, localoutputpath = temppaths |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
716 outpath = b"" |
35907
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
717 mylabel, otherlabel = labels[:2] |
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
718 if len(labels) >= 3: |
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
719 baselabel = labels[2] |
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
720 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
721 baselabel = b'base' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
722 env = { |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
723 b'HG_FILE': fcd.path(), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
724 b'HG_MY_NODE': short(mynode), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
725 b'HG_OTHER_NODE': short(fco.changectx().node()), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
726 b'HG_BASE_NODE': short(fca.changectx().node()), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
727 b'HG_MY_ISLINK': b'l' in fcd.flags(), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
728 b'HG_OTHER_ISLINK': b'l' in fco.flags(), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
729 b'HG_BASE_ISLINK': b'l' in fca.flags(), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
730 b'HG_MY_LABEL': mylabel, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
731 b'HG_OTHER_LABEL': otherlabel, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
732 b'HG_BASE_LABEL': baselabel, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
733 } |
34035
96123bdea43e
filemerge: reduce creation of tempfiles until needed
Phil Cohen <phillco@fb.com>
parents:
34034
diff
changeset
|
734 ui = repo.ui |
16125
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
735 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
736 if b"$output" in args: |
34782
f21eecc64ace
filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents:
34506
diff
changeset
|
737 # read input from backup, write to original |
36976
a4a95bd7158d
filemerge: give some variables in _xmerge more descriptive names
Kyle Lippincott <spectral@google.com>
parents:
36835
diff
changeset
|
738 outpath = localpath |
37077
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
739 localpath = localoutputpath |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
740 replace = { |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
741 b'local': localpath, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
742 b'base': basepath, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
743 b'other': otherpath, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
744 b'output': outpath, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
745 b'labellocal': mylabel, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
746 b'labelother': otherlabel, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
747 b'labelbase': baselabel, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
748 } |
37120
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37084
diff
changeset
|
749 args = util.interpolate( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
750 br'\$', |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
751 replace, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
752 args, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
753 lambda s: procutil.shellquote(util.localpath(s)), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
754 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
755 if _toolbool(ui, tool, b"gui"): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
756 repo.ui.status( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
757 _(b'running merge tool %s for file %s\n') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
758 % (tool, uipathfn(fcd.path())) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
759 ) |
38041
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
760 if scriptfn is None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
761 cmd = toolpath + b' ' + args |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
762 repo.ui.debug(b'launching merge tool: %s\n' % cmd) |
40478
86dfae98a3a2
merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents:
39359
diff
changeset
|
763 _describemerge(ui, repo, mynode, fcd, fca, fco, env, toolpath, args) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
764 r = ui.system( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
765 cmd, cwd=repo.root, environ=env, blockedtag=b'mergetool' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
766 ) |
38041
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
767 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
768 repo.ui.debug( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
769 b'launching python merge script: %s:%s\n' % (toolpath, scriptfn) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
770 ) |
38041
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
771 r = 0 |
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
772 try: |
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
773 # avoid cycle cmdutil->merge->filemerge->extensions->cmdutil |
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
774 from . import extensions |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
775 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
776 mod = extensions.loadpath(toolpath, b'hgmerge.%s' % tool) |
38041
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
777 except Exception: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
778 raise error.Abort( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
779 _(b"loading python merge script failed: %s") % toolpath |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
780 ) |
38041
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
781 mergefn = getattr(mod, scriptfn, None) |
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
782 if mergefn is None: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
783 raise error.Abort( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
784 _(b"%s does not have function: %s") % (toolpath, scriptfn) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
785 ) |
38041
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
786 argslist = procutil.shellsplit(args) |
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
787 # avoid cycle cmdutil->merge->filemerge->hook->extensions->cmdutil |
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
788 from . import hook |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
789 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
790 ret, raised = hook.pythonhook( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
791 ui, repo, b"merge", toolpath, mergefn, {b'args': argslist}, True |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
792 ) |
38041
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
793 if raised: |
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
794 r = 1 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
795 repo.ui.debug(b'merge tool returned: %d\n' % r) |
34035
96123bdea43e
filemerge: reduce creation of tempfiles until needed
Phil Cohen <phillco@fb.com>
parents:
34034
diff
changeset
|
796 return True, r, False |
16125
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
797 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
798 |
35482
c240657febb7
templater: drop unneeded resources from conflict-marker data
Yuya Nishihara <yuya@tcha.org>
parents:
35469
diff
changeset
|
799 def _formatconflictmarker(ctx, template, label, pad): |
21519
25d5a9ecbb85
merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents:
21273
diff
changeset
|
800 """Applies the given template to the ctx, prefixed by the label. |
25d5a9ecbb85
merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents:
21273
diff
changeset
|
801 |
25d5a9ecbb85
merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents:
21273
diff
changeset
|
802 Pad is the minimum width of the label prefix, so that multiple markers |
25d5a9ecbb85
merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents:
21273
diff
changeset
|
803 can have aligned templated parts. |
25d5a9ecbb85
merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents:
21273
diff
changeset
|
804 """ |
25d5a9ecbb85
merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents:
21273
diff
changeset
|
805 if ctx.node() is None: |
25d5a9ecbb85
merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents:
21273
diff
changeset
|
806 ctx = ctx.p1() |
25d5a9ecbb85
merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents:
21273
diff
changeset
|
807 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
808 props = {b'ctx': ctx} |
36988
317382151ac3
templater: rename .render(mapping) to .renderdefault(mapping) (API)
Yuya Nishihara <yuya@tcha.org>
parents:
36976
diff
changeset
|
809 templateresult = template.renderdefault(props) |
21519
25d5a9ecbb85
merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents:
21273
diff
changeset
|
810 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
811 label = (b'%s:' % label).ljust(pad + 1) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
812 mark = b'%s %s' % (label, templateresult) |
21519
25d5a9ecbb85
merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents:
21273
diff
changeset
|
813 |
21864
755bf1bbe0a9
filemerge: use only the first line of the generated conflict marker for safety
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21693
diff
changeset
|
814 if mark: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
815 mark = mark.splitlines()[0] # split for safety |
21864
755bf1bbe0a9
filemerge: use only the first line of the generated conflict marker for safety
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21693
diff
changeset
|
816 |
21865
78e56e70c70a
filemerge: use 'util.ellipsis' to trim custom conflict markers correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21864
diff
changeset
|
817 # 8 for the prefix of conflict marker lines (e.g. '<<<<<<< ') |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37077
diff
changeset
|
818 return stringutil.ellipsis(mark, 80 - 8) |
21519
25d5a9ecbb85
merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents:
21273
diff
changeset
|
819 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
820 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
821 _defaultconflictlabels = [b'local', b'other'] |
21524
47b97d9af27e
merge: add labels parameter from merge.update to filemerge
Durham Goode <durham@fb.com>
parents:
21519
diff
changeset
|
822 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
823 |
35907
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
824 def _formatlabels(repo, fcd, fco, fca, labels, tool=None): |
21519
25d5a9ecbb85
merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents:
21273
diff
changeset
|
825 """Formats the given labels using the conflict marker template. |
25d5a9ecbb85
merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents:
21273
diff
changeset
|
826 |
25d5a9ecbb85
merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents:
21273
diff
changeset
|
827 Returns a list of formatted labels. |
25d5a9ecbb85
merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents:
21273
diff
changeset
|
828 """ |
25d5a9ecbb85
merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents:
21273
diff
changeset
|
829 cd = fcd.changectx() |
25d5a9ecbb85
merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents:
21273
diff
changeset
|
830 co = fco.changectx() |
22026
6966542768ff
filemerge: allow the formatting of three labels instead of two
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22025
diff
changeset
|
831 ca = fca.changectx() |
21519
25d5a9ecbb85
merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents:
21273
diff
changeset
|
832 |
25d5a9ecbb85
merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents:
21273
diff
changeset
|
833 ui = repo.ui |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
834 template = ui.config(b'ui', b'mergemarkertemplate') |
35907
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
835 if tool is not None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
836 template = _toolstr(ui, tool, b'mergemarkertemplate', template) |
32047
458f7294dfee
filemerge: optionally strip quotes from merge marker template (BC)
Yuya Nishihara <yuya@tcha.org>
parents:
31436
diff
changeset
|
837 template = templater.unquotestring(template) |
35469
f1c54d003327
templater: move repo, ui and cache to per-engine resources
Yuya Nishihara <yuya@tcha.org>
parents:
35463
diff
changeset
|
838 tres = formatter.templateresources(ui, repo) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
839 tmpl = formatter.maketemplater( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
840 ui, template, defaults=templatekw.keywords, resources=tres |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
841 ) |
21519
25d5a9ecbb85
merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents:
21273
diff
changeset
|
842 |
22026
6966542768ff
filemerge: allow the formatting of three labels instead of two
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22025
diff
changeset
|
843 pad = max(len(l) for l in labels) |
21519
25d5a9ecbb85
merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents:
21273
diff
changeset
|
844 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
845 newlabels = [ |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
846 _formatconflictmarker(cd, tmpl, labels[0], pad), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
847 _formatconflictmarker(co, tmpl, labels[1], pad), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
848 ] |
22026
6966542768ff
filemerge: allow the formatting of three labels instead of two
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22025
diff
changeset
|
849 if len(labels) > 2: |
35482
c240657febb7
templater: drop unneeded resources from conflict-marker data
Yuya Nishihara <yuya@tcha.org>
parents:
35469
diff
changeset
|
850 newlabels.append(_formatconflictmarker(ca, tmpl, labels[2], pad)) |
22026
6966542768ff
filemerge: allow the formatting of three labels instead of two
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22025
diff
changeset
|
851 return newlabels |
21519
25d5a9ecbb85
merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents:
21273
diff
changeset
|
852 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
853 |
29774
a7f8939641aa
merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents:
29660
diff
changeset
|
854 def partextras(labels): |
a7f8939641aa
merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents:
29660
diff
changeset
|
855 """Return a dictionary of extra labels for use in prompts to the user |
a7f8939641aa
merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents:
29660
diff
changeset
|
856 |
a7f8939641aa
merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents:
29660
diff
changeset
|
857 Intended use is in strings of the form "(l)ocal%(l)s". |
a7f8939641aa
merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents:
29660
diff
changeset
|
858 """ |
a7f8939641aa
merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents:
29660
diff
changeset
|
859 if labels is None: |
a7f8939641aa
merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents:
29660
diff
changeset
|
860 return { |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
861 b"l": b"", |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
862 b"o": b"", |
29774
a7f8939641aa
merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents:
29660
diff
changeset
|
863 } |
a7f8939641aa
merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents:
29660
diff
changeset
|
864 |
a7f8939641aa
merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents:
29660
diff
changeset
|
865 return { |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
866 b"l": b" [%s]" % labels[0], |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
867 b"o": b" [%s]" % labels[1], |
29774
a7f8939641aa
merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents:
29660
diff
changeset
|
868 } |
a7f8939641aa
merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents:
29660
diff
changeset
|
869 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
870 |
34036
fe04c018eaac
filemerge: add _restorebackup
Phil Cohen <phillco@fb.com>
parents:
34035
diff
changeset
|
871 def _restorebackup(fcd, back): |
fe04c018eaac
filemerge: add _restorebackup
Phil Cohen <phillco@fb.com>
parents:
34035
diff
changeset
|
872 # TODO: Add a workingfilectx.write(otherfilectx) path so we can use |
fe04c018eaac
filemerge: add _restorebackup
Phil Cohen <phillco@fb.com>
parents:
34035
diff
changeset
|
873 # util.copy here instead. |
34782
f21eecc64ace
filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents:
34506
diff
changeset
|
874 fcd.write(back.data(), fcd.flags()) |
34036
fe04c018eaac
filemerge: add _restorebackup
Phil Cohen <phillco@fb.com>
parents:
34035
diff
changeset
|
875 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
876 |
34782
f21eecc64ace
filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents:
34506
diff
changeset
|
877 def _makebackup(repo, ui, wctx, fcd, premerge): |
f21eecc64ace
filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents:
34506
diff
changeset
|
878 """Makes and returns a filectx-like object for ``fcd``'s backup file. |
34031
52bd006b4f49
filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents:
33906
diff
changeset
|
879 |
52bd006b4f49
filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents:
33906
diff
changeset
|
880 In addition to preserving the user's pre-existing modifications to `fcd` |
52bd006b4f49
filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents:
33906
diff
changeset
|
881 (if any), the backup is used to undo certain premerges, confirm whether a |
52bd006b4f49
filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents:
33906
diff
changeset
|
882 merge changed anything, and determine what line endings the new file should |
52bd006b4f49
filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents:
33906
diff
changeset
|
883 have. |
35702
c0439e11af16
filemerge: fix backing up an in-memory file to a custom location
Phil Cohen <phillco@fb.com>
parents:
35483
diff
changeset
|
884 |
c0439e11af16
filemerge: fix backing up an in-memory file to a custom location
Phil Cohen <phillco@fb.com>
parents:
35483
diff
changeset
|
885 Backups only need to be written once (right before the premerge) since their |
c0439e11af16
filemerge: fix backing up an in-memory file to a custom location
Phil Cohen <phillco@fb.com>
parents:
35483
diff
changeset
|
886 content doesn't change afterwards. |
34031
52bd006b4f49
filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents:
33906
diff
changeset
|
887 """ |
52bd006b4f49
filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents:
33906
diff
changeset
|
888 if fcd.isabsent(): |
52bd006b4f49
filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents:
33906
diff
changeset
|
889 return None |
34782
f21eecc64ace
filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents:
34506
diff
changeset
|
890 # TODO: Break this import cycle somehow. (filectx -> ctx -> fileset -> |
f21eecc64ace
filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents:
34506
diff
changeset
|
891 # merge -> filemerge). (I suspect the fileset import is the weakest link) |
f21eecc64ace
filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents:
34506
diff
changeset
|
892 from . import context |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
893 |
41600
a8ccd821b7d2
filemerge: migrate to scmutil.backuppath()
Martin von Zweigbergk <martinvonz@google.com>
parents:
41510
diff
changeset
|
894 back = scmutil.backuppath(ui, repo, fcd.path()) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
895 inworkingdir = back.startswith(repo.wvfs.base) and not back.startswith( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
896 repo.vfs.base |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
897 ) |
34784
123a68e6b473
filemerge: store backups in the overlayworkingctx if using imm
Phil Cohen <phillco@fb.com>
parents:
34782
diff
changeset
|
898 if isinstance(fcd, context.overlayworkingfilectx) and inworkingdir: |
123a68e6b473
filemerge: store backups in the overlayworkingctx if using imm
Phil Cohen <phillco@fb.com>
parents:
34782
diff
changeset
|
899 # If the backup file is to be in the working directory, and we're |
123a68e6b473
filemerge: store backups in the overlayworkingctx if using imm
Phil Cohen <phillco@fb.com>
parents:
34782
diff
changeset
|
900 # merging in-memory, we must redirect the backup to the memory context |
123a68e6b473
filemerge: store backups in the overlayworkingctx if using imm
Phil Cohen <phillco@fb.com>
parents:
34782
diff
changeset
|
901 # so we don't disturb the working directory. |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
902 relpath = back[len(repo.wvfs.base) + 1 :] |
35703
9a50ffd15b25
filemerge: only write in-memory backup during premerge
Phil Cohen <phillco@fb.com>
parents:
35702
diff
changeset
|
903 if premerge: |
9a50ffd15b25
filemerge: only write in-memory backup during premerge
Phil Cohen <phillco@fb.com>
parents:
35702
diff
changeset
|
904 wctx[relpath].write(fcd.data(), fcd.flags()) |
34784
123a68e6b473
filemerge: store backups in the overlayworkingctx if using imm
Phil Cohen <phillco@fb.com>
parents:
34782
diff
changeset
|
905 return wctx[relpath] |
123a68e6b473
filemerge: store backups in the overlayworkingctx if using imm
Phil Cohen <phillco@fb.com>
parents:
34782
diff
changeset
|
906 else: |
35702
c0439e11af16
filemerge: fix backing up an in-memory file to a custom location
Phil Cohen <phillco@fb.com>
parents:
35483
diff
changeset
|
907 if premerge: |
c0439e11af16
filemerge: fix backing up an in-memory file to a custom location
Phil Cohen <phillco@fb.com>
parents:
35483
diff
changeset
|
908 # Otherwise, write to wherever path the user specified the backups |
c0439e11af16
filemerge: fix backing up an in-memory file to a custom location
Phil Cohen <phillco@fb.com>
parents:
35483
diff
changeset
|
909 # should go. We still need to switch based on whether the source is |
c0439e11af16
filemerge: fix backing up an in-memory file to a custom location
Phil Cohen <phillco@fb.com>
parents:
35483
diff
changeset
|
910 # in-memory so we can use the fast path of ``util.copy`` if both are |
c0439e11af16
filemerge: fix backing up an in-memory file to a custom location
Phil Cohen <phillco@fb.com>
parents:
35483
diff
changeset
|
911 # on disk. |
c0439e11af16
filemerge: fix backing up an in-memory file to a custom location
Phil Cohen <phillco@fb.com>
parents:
35483
diff
changeset
|
912 if isinstance(fcd, context.overlayworkingfilectx): |
c0439e11af16
filemerge: fix backing up an in-memory file to a custom location
Phil Cohen <phillco@fb.com>
parents:
35483
diff
changeset
|
913 util.writefile(back, fcd.data()) |
c0439e11af16
filemerge: fix backing up an in-memory file to a custom location
Phil Cohen <phillco@fb.com>
parents:
35483
diff
changeset
|
914 else: |
41600
a8ccd821b7d2
filemerge: migrate to scmutil.backuppath()
Martin von Zweigbergk <martinvonz@google.com>
parents:
41510
diff
changeset
|
915 a = _workingpath(repo, fcd) |
35702
c0439e11af16
filemerge: fix backing up an in-memory file to a custom location
Phil Cohen <phillco@fb.com>
parents:
35483
diff
changeset
|
916 util.copyfile(a, back) |
34784
123a68e6b473
filemerge: store backups in the overlayworkingctx if using imm
Phil Cohen <phillco@fb.com>
parents:
34782
diff
changeset
|
917 # A arbitraryfilectx is returned, so we can run the same functions on |
123a68e6b473
filemerge: store backups in the overlayworkingctx if using imm
Phil Cohen <phillco@fb.com>
parents:
34782
diff
changeset
|
918 # the backup context regardless of where it lives. |
123a68e6b473
filemerge: store backups in the overlayworkingctx if using imm
Phil Cohen <phillco@fb.com>
parents:
34782
diff
changeset
|
919 return context.arbitraryfilectx(back, repo=repo) |
34031
52bd006b4f49
filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents:
33906
diff
changeset
|
920 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
921 |
36998
3723b42ff953
filemerge: move temp file unlinks to _maketempfiles
Kyle Lippincott <spectral@google.com>
parents:
36988
diff
changeset
|
922 @contextlib.contextmanager |
37077
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
923 def _maketempfiles(repo, fco, fca, localpath, uselocalpath): |
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
924 """Writes out `fco` and `fca` as temporary files, and (if uselocalpath) |
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
925 copies `localpath` to another temporary file, so an external merge tool may |
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
926 use them. |
34031
52bd006b4f49
filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents:
33906
diff
changeset
|
927 """ |
36999
e349ad5cbb71
filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents:
36998
diff
changeset
|
928 tmproot = None |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
929 tmprootprefix = repo.ui.config(b'experimental', b'mergetempdirprefix') |
36999
e349ad5cbb71
filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents:
36998
diff
changeset
|
930 if tmprootprefix: |
38165
2ce60954b1b7
py3: wrap tempfile.mkdtemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents:
38164
diff
changeset
|
931 tmproot = pycompat.mkdtemp(prefix=tmprootprefix) |
36999
e349ad5cbb71
filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents:
36998
diff
changeset
|
932 |
37077
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
933 def maketempfrompath(prefix, path): |
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
934 fullbase, ext = os.path.splitext(path) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
935 pre = b"%s~%s" % (os.path.basename(fullbase), prefix) |
36999
e349ad5cbb71
filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents:
36998
diff
changeset
|
936 if tmproot: |
e349ad5cbb71
filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents:
36998
diff
changeset
|
937 name = os.path.join(tmproot, pre) |
e349ad5cbb71
filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents:
36998
diff
changeset
|
938 if ext: |
e349ad5cbb71
filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents:
36998
diff
changeset
|
939 name += ext |
43503
313e3a279828
cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents:
43117
diff
changeset
|
940 f = open(name, "wb") |
36999
e349ad5cbb71
filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents:
36998
diff
changeset
|
941 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
942 fd, name = pycompat.mkstemp(prefix=pre + b'.', suffix=ext) |
43503
313e3a279828
cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents:
43117
diff
changeset
|
943 f = os.fdopen(fd, "wb") |
37077
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
944 return f, name |
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
945 |
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
946 def tempfromcontext(prefix, ctx): |
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
947 f, name = maketempfrompath(prefix, ctx.path()) |
34031
52bd006b4f49
filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents:
33906
diff
changeset
|
948 data = repo.wwritedata(ctx.path(), ctx.data()) |
52bd006b4f49
filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents:
33906
diff
changeset
|
949 f.write(data) |
52bd006b4f49
filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents:
33906
diff
changeset
|
950 f.close() |
52bd006b4f49
filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents:
33906
diff
changeset
|
951 return name |
52bd006b4f49
filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents:
33906
diff
changeset
|
952 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
953 b = tempfromcontext(b"base", fca) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
954 c = tempfromcontext(b"other", fco) |
37077
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
955 d = localpath |
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
956 if uselocalpath: |
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
957 # We start off with this being the backup filename, so remove the .orig |
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
958 # to make syntax-highlighting more likely. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
959 if d.endswith(b'.orig'): |
37077
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
960 d, _ = os.path.splitext(d) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
961 f, d = maketempfrompath(b"local", d) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
962 with open(localpath, b'rb') as src: |
37077
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
963 f.write(src.read()) |
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
964 f.close() |
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
965 |
36998
3723b42ff953
filemerge: move temp file unlinks to _maketempfiles
Kyle Lippincott <spectral@google.com>
parents:
36988
diff
changeset
|
966 try: |
37077
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
967 yield b, c, d |
36998
3723b42ff953
filemerge: move temp file unlinks to _maketempfiles
Kyle Lippincott <spectral@google.com>
parents:
36988
diff
changeset
|
968 finally: |
36999
e349ad5cbb71
filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents:
36998
diff
changeset
|
969 if tmproot: |
e349ad5cbb71
filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents:
36998
diff
changeset
|
970 shutil.rmtree(tmproot) |
e349ad5cbb71
filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents:
36998
diff
changeset
|
971 else: |
e349ad5cbb71
filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents:
36998
diff
changeset
|
972 util.unlink(b) |
e349ad5cbb71
filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents:
36998
diff
changeset
|
973 util.unlink(c) |
37077
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
974 # if not uselocalpath, d is the 'orig'/backup file which we |
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
975 # shouldn't delete. |
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
976 if d and uselocalpath: |
1e30a26a65d0
filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents:
36999
diff
changeset
|
977 util.unlink(d) |
34031
52bd006b4f49
filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents:
33906
diff
changeset
|
978 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
979 |
34122
c0ce60459d84
merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents:
34076
diff
changeset
|
980 def _filemerge(premerge, repo, wctx, mynode, orig, fcd, fco, fca, labels=None): |
6003
7855b88ba838
filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
981 """perform a 3-way merge in the working directory |
7855b88ba838
filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
982 |
26607
45a6233d5f50
filemerge: introduce a premerge flag and function
Siddharth Agarwal <sid0@fb.com>
parents:
26606
diff
changeset
|
983 premerge = whether this is a premerge |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6212
diff
changeset
|
984 mynode = parent node before merge |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6212
diff
changeset
|
985 orig = original local filename before merge |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6212
diff
changeset
|
986 fco = other file context |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6212
diff
changeset
|
987 fca = ancestor file context |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6212
diff
changeset
|
988 fcd = local file context for current/destination file |
26606
2a405d307f8c
filemerge: also return whether the merge is complete
Siddharth Agarwal <sid0@fb.com>
parents:
26605
diff
changeset
|
989 |
27034
86ede9eda252
filemerge: return whether the file was deleted
Siddharth Agarwal <sid0@fb.com>
parents:
27033
diff
changeset
|
990 Returns whether the merge is complete, the return value of the merge, and |
86ede9eda252
filemerge: return whether the file was deleted
Siddharth Agarwal <sid0@fb.com>
parents:
27033
diff
changeset
|
991 a boolean indicating whether the file was deleted from disk.""" |
6003
7855b88ba838
filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
992 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
993 if not fco.cmp(fcd): # files identical? |
27034
86ede9eda252
filemerge: return whether the file was deleted
Siddharth Agarwal <sid0@fb.com>
parents:
27033
diff
changeset
|
994 return True, None, False |
26512
4c52dd406adc
filemerge: indent filemerge.filemerge
Siddharth Agarwal <sid0@fb.com>
parents:
26224
diff
changeset
|
995 |
26608
ae5b60d3294f
filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents:
26607
diff
changeset
|
996 ui = repo.ui |
ae5b60d3294f
filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents:
26607
diff
changeset
|
997 fd = fcd.path() |
41510
faa49a5914bb
merge: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents:
41365
diff
changeset
|
998 uipathfn = scmutil.getuipathfn(repo) |
faa49a5914bb
merge: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents:
41365
diff
changeset
|
999 fduipath = uipathfn(fd) |
26608
ae5b60d3294f
filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents:
26607
diff
changeset
|
1000 binary = fcd.isbinary() or fco.isbinary() or fca.isbinary() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1001 symlink = b'l' in fcd.flags() + fco.flags() |
27039
d7517deedf86
filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27038
diff
changeset
|
1002 changedelete = fcd.isabsent() or fco.isabsent() |
d7517deedf86
filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents:
27038
diff
changeset
|
1003 tool, toolpath = _picktool(repo, ui, fd, binary, symlink, changedelete) |
38041
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
1004 scriptfn = None |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1005 if tool in internals and tool.startswith(b'internal:'): |
26608
ae5b60d3294f
filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents:
26607
diff
changeset
|
1006 # normalize to new-style names (':merge' etc) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1007 tool = tool[len(b'internal') :] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1008 if toolpath and toolpath.startswith(b'python:'): |
38041
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
1009 invalidsyntax = False |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1010 if toolpath.count(b':') >= 2: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1011 script, scriptfn = toolpath[7:].rsplit(b':', 1) |
38041
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
1012 if not scriptfn: |
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
1013 invalidsyntax = True |
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
1014 # missing :callable can lead to spliting on windows drive letter |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1015 if b'\\' in scriptfn or b'/' in scriptfn: |
38041
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
1016 invalidsyntax = True |
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
1017 else: |
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
1018 invalidsyntax = True |
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
1019 if invalidsyntax: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1020 raise error.Abort(_(b"invalid 'python:' syntax: %s") % toolpath) |
38041
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
1021 toolpath = script |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1022 ui.debug( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1023 b"picked tool '%s' for %s (binary %s symlink %s changedelete %s)\n" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1024 % ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1025 tool, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1026 fduipath, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1027 pycompat.bytestr(binary), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1028 pycompat.bytestr(symlink), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1029 pycompat.bytestr(changedelete), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1030 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1031 ) |
6003
7855b88ba838
filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1032 |
26608
ae5b60d3294f
filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents:
26607
diff
changeset
|
1033 if tool in internals: |
ae5b60d3294f
filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents:
26607
diff
changeset
|
1034 func = internals[tool] |
ae5b60d3294f
filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents:
26607
diff
changeset
|
1035 mergetype = func.mergetype |
ae5b60d3294f
filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents:
26607
diff
changeset
|
1036 onfailure = func.onfailure |
ae5b60d3294f
filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents:
26607
diff
changeset
|
1037 precheck = func.precheck |
35907
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
1038 isexternal = False |
26608
ae5b60d3294f
filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents:
26607
diff
changeset
|
1039 else: |
35463
ef7e667a4f7b
filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents:
35282
diff
changeset
|
1040 if wctx.isinmemory(): |
ef7e667a4f7b
filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents:
35282
diff
changeset
|
1041 func = _xmergeimm |
ef7e667a4f7b
filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents:
35282
diff
changeset
|
1042 else: |
ef7e667a4f7b
filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents:
35282
diff
changeset
|
1043 func = _xmerge |
26608
ae5b60d3294f
filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents:
26607
diff
changeset
|
1044 mergetype = fullmerge |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1045 onfailure = _(b"merging %s failed!\n") |
26608
ae5b60d3294f
filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents:
26607
diff
changeset
|
1046 precheck = None |
35907
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
1047 isexternal = True |
26512
4c52dd406adc
filemerge: indent filemerge.filemerge
Siddharth Agarwal <sid0@fb.com>
parents:
26224
diff
changeset
|
1048 |
38041
242eb5132203
filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents:
37120
diff
changeset
|
1049 toolconf = tool, toolpath, binary, symlink, scriptfn |
6003
7855b88ba838
filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1050 |
26608
ae5b60d3294f
filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents:
26607
diff
changeset
|
1051 if mergetype == nomerge: |
29774
a7f8939641aa
merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents:
29660
diff
changeset
|
1052 r, deleted = func(repo, mynode, orig, fcd, fco, fca, toolconf, labels) |
27034
86ede9eda252
filemerge: return whether the file was deleted
Siddharth Agarwal <sid0@fb.com>
parents:
27033
diff
changeset
|
1053 return True, r, deleted |
26512
4c52dd406adc
filemerge: indent filemerge.filemerge
Siddharth Agarwal <sid0@fb.com>
parents:
26224
diff
changeset
|
1054 |
26609
47681e77e484
filemerge: only print out "merging f" output at premerge step
Siddharth Agarwal <sid0@fb.com>
parents:
26608
diff
changeset
|
1055 if premerge: |
47681e77e484
filemerge: only print out "merging f" output at premerge step
Siddharth Agarwal <sid0@fb.com>
parents:
26608
diff
changeset
|
1056 if orig != fco.path(): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1057 ui.status( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1058 _(b"merging %s and %s to %s\n") |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1059 % (uipathfn(orig), uipathfn(fco.path()), fduipath) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1060 ) |
26609
47681e77e484
filemerge: only print out "merging f" output at premerge step
Siddharth Agarwal <sid0@fb.com>
parents:
26608
diff
changeset
|
1061 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1062 ui.status(_(b"merging %s\n") % fduipath) |
26528
8bfef5737321
filemerge: move 'merging' output to before file creation
Siddharth Agarwal <sid0@fb.com>
parents:
26527
diff
changeset
|
1063 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1064 ui.debug(b"my %s other %s ancestor %s\n" % (fcd, fco, fca)) |
26528
8bfef5737321
filemerge: move 'merging' output to before file creation
Siddharth Agarwal <sid0@fb.com>
parents:
26527
diff
changeset
|
1065 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1066 if precheck and not precheck(repo, mynode, orig, fcd, fco, fca, toolconf): |
26608
ae5b60d3294f
filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents:
26607
diff
changeset
|
1067 if onfailure: |
35282
46d7f0713a87
filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents:
35281
diff
changeset
|
1068 if wctx.isinmemory(): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1069 raise error.InMemoryMergeConflictsError( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43106
diff
changeset
|
1070 b'in-memory merge does not support merge conflicts' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1071 ) |
41510
faa49a5914bb
merge: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents:
41365
diff
changeset
|
1072 ui.warn(onfailure % fduipath) |
27034
86ede9eda252
filemerge: return whether the file was deleted
Siddharth Agarwal <sid0@fb.com>
parents:
27033
diff
changeset
|
1073 return True, 1, False |
26529
7833b13b001f
filemerge: move precheck to before files are written out
Siddharth Agarwal <sid0@fb.com>
parents:
26528
diff
changeset
|
1074 |
34782
f21eecc64ace
filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents:
34506
diff
changeset
|
1075 back = _makebackup(repo, ui, wctx, fcd, premerge) |
34035
96123bdea43e
filemerge: reduce creation of tempfiles until needed
Phil Cohen <phillco@fb.com>
parents:
34034
diff
changeset
|
1076 files = (None, None, None, back) |
26589
fb388aa26453
filemerge: clean up temp files in a finally block
Siddharth Agarwal <sid0@fb.com>
parents:
26575
diff
changeset
|
1077 r = 1 |
fb388aa26453
filemerge: clean up temp files in a finally block
Siddharth Agarwal <sid0@fb.com>
parents:
26575
diff
changeset
|
1078 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1079 internalmarkerstyle = ui.config(b'ui', b'mergemarkers') |
35907
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
1080 if isexternal: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1081 markerstyle = _toolstr(ui, tool, b'mergemarkers') |
35907
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
1082 else: |
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
1083 markerstyle = internalmarkerstyle |
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
1084 |
26529
7833b13b001f
filemerge: move precheck to before files are written out
Siddharth Agarwal <sid0@fb.com>
parents:
26528
diff
changeset
|
1085 if not labels: |
7833b13b001f
filemerge: move precheck to before files are written out
Siddharth Agarwal <sid0@fb.com>
parents:
26528
diff
changeset
|
1086 labels = _defaultconflictlabels |
35907
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
1087 formattedlabels = labels |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1088 if markerstyle != b'basic': |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1089 formattedlabels = _formatlabels( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1090 repo, fcd, fco, fca, labels, tool=tool |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1091 ) |
6004
5af5f0f9d724
merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents:
6003
diff
changeset
|
1092 |
26607
45a6233d5f50
filemerge: introduce a premerge flag and function
Siddharth Agarwal <sid0@fb.com>
parents:
26606
diff
changeset
|
1093 if premerge and mergetype == fullmerge: |
35907
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
1094 # conflict markers generated by premerge will use 'detailed' |
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
1095 # settings if either ui.mergemarkers or the tool's mergemarkers |
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
1096 # setting is 'detailed'. This way tools can have basic labels in |
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
1097 # space-constrained areas of the UI, but still get full information |
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
1098 # in conflict markers if premerge is 'keep' or 'keep-merge3'. |
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
1099 premergelabels = labels |
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
1100 labeltool = None |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1101 if markerstyle != b'basic': |
35907
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
1102 # respect 'tool's mergemarkertemplate (which defaults to |
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
1103 # ui.mergemarkertemplate) |
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
1104 labeltool = tool |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1105 if internalmarkerstyle != b'basic' or markerstyle != b'basic': |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1106 premergelabels = _formatlabels( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1107 repo, fcd, fco, fca, premergelabels, tool=labeltool |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1108 ) |
35907
9037c29e9f53
filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents:
35829
diff
changeset
|
1109 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1110 r = _premerge( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1111 repo, fcd, fco, fca, toolconf, files, labels=premergelabels |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1112 ) |
26611
a5ff66e6d77a
filemerge: break overall filemerge into separate premerge and merge steps
Siddharth Agarwal <sid0@fb.com>
parents:
26610
diff
changeset
|
1113 # complete if premerge successful (r is 0) |
27034
86ede9eda252
filemerge: return whether the file was deleted
Siddharth Agarwal <sid0@fb.com>
parents:
27033
diff
changeset
|
1114 return not r, r, False |
26567
f18646cf0e93
filemerge: call premerge directly from main merge function
Siddharth Agarwal <sid0@fb.com>
parents:
26529
diff
changeset
|
1115 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1116 needcheck, r, deleted = func( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1117 repo, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1118 mynode, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1119 orig, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1120 fcd, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1121 fco, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1122 fca, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1123 toolconf, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1124 files, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1125 labels=formattedlabels, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1126 ) |
27033
089dab8794dc
filemerge: return whether the file is deleted from all other merge tools
Siddharth Agarwal <sid0@fb.com>
parents:
27032
diff
changeset
|
1127 |
26575
d60815664c34
filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
26574
diff
changeset
|
1128 if needcheck: |
34034
7558917f291e
filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents:
34033
diff
changeset
|
1129 r = _check(repo, r, ui, tool, fcd, files) |
21519
25d5a9ecbb85
merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents:
21273
diff
changeset
|
1130 |
16125
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
1131 if r: |
83925d3a4559
filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15738
diff
changeset
|
1132 if onfailure: |
35282
46d7f0713a87
filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents:
35281
diff
changeset
|
1133 if wctx.isinmemory(): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1134 raise error.InMemoryMergeConflictsError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1135 b'in-memory merge ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1136 b'does not support ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1137 b'merge conflicts' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1138 ) |
41510
faa49a5914bb
merge: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents:
41365
diff
changeset
|
1139 ui.warn(onfailure % fduipath) |
34797
284fa44f7f39
merge: allow user to halt merge on merge-tool failures
Ryan McElroy <rmcelroy@fb.com>
parents:
34796
diff
changeset
|
1140 _onfilemergefailure(ui) |
26589
fb388aa26453
filemerge: clean up temp files in a finally block
Siddharth Agarwal <sid0@fb.com>
parents:
26575
diff
changeset
|
1141 |
27034
86ede9eda252
filemerge: return whether the file was deleted
Siddharth Agarwal <sid0@fb.com>
parents:
27033
diff
changeset
|
1142 return True, r, deleted |
26589
fb388aa26453
filemerge: clean up temp files in a finally block
Siddharth Agarwal <sid0@fb.com>
parents:
26575
diff
changeset
|
1143 finally: |
27047
e1458049dca5
filemerge: don't try to copy files known to be absent
Siddharth Agarwal <sid0@fb.com>
parents:
27042
diff
changeset
|
1144 if not r and back is not None: |
34782
f21eecc64ace
filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents:
34506
diff
changeset
|
1145 back.remove() |
6004
5af5f0f9d724
merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents:
6003
diff
changeset
|
1146 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1147 |
34796
ed91846c29cf
filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents:
34785
diff
changeset
|
1148 def _haltmerge(): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1149 msg = _(b'merge halted after failed merge (see hg resolve)') |
34796
ed91846c29cf
filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents:
34785
diff
changeset
|
1150 raise error.InterventionRequired(msg) |
ed91846c29cf
filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents:
34785
diff
changeset
|
1151 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1152 |
34796
ed91846c29cf
filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents:
34785
diff
changeset
|
1153 def _onfilemergefailure(ui): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1154 action = ui.config(b'merge', b'on-failure') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1155 if action == b'prompt': |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43106
diff
changeset
|
1156 msg = _(b'continue merge operation (yn)?$$ &Yes $$ &No') |
34796
ed91846c29cf
filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents:
34785
diff
changeset
|
1157 if ui.promptchoice(msg, 0) == 1: |
ed91846c29cf
filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents:
34785
diff
changeset
|
1158 _haltmerge() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1159 if action == b'halt': |
34796
ed91846c29cf
filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents:
34785
diff
changeset
|
1160 _haltmerge() |
ed91846c29cf
filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents:
34785
diff
changeset
|
1161 # default action is 'continue', in which case we neither prompt nor halt |
ed91846c29cf
filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents:
34785
diff
changeset
|
1162 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1163 |
38793
6c8e3c847977
resolve: add option to warn/abort on -m with unresolved conflict markers
Kyle Lippincott <spectral@google.com>
parents:
38165
diff
changeset
|
1164 def hasconflictmarkers(data): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1165 return bool( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1166 re.search(b"^(<<<<<<< .*|=======|>>>>>>> .*)$", data, re.MULTILINE) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1167 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1168 |
38793
6c8e3c847977
resolve: add option to warn/abort on -m with unresolved conflict markers
Kyle Lippincott <spectral@google.com>
parents:
38165
diff
changeset
|
1169 |
34034
7558917f291e
filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents:
34033
diff
changeset
|
1170 def _check(repo, r, ui, tool, fcd, files): |
26575
d60815664c34
filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
26574
diff
changeset
|
1171 fd = fcd.path() |
41510
faa49a5914bb
merge: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents:
41365
diff
changeset
|
1172 uipathfn = scmutil.getuipathfn(repo) |
34034
7558917f291e
filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents:
34033
diff
changeset
|
1173 unused, unused, unused, back = files |
26575
d60815664c34
filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
26574
diff
changeset
|
1174 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1175 if not r and ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1176 _toolbool(ui, tool, b"checkconflicts") |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1177 or b'conflicts' in _toollist(ui, tool, b"check") |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1178 ): |
38793
6c8e3c847977
resolve: add option to warn/abort on -m with unresolved conflict markers
Kyle Lippincott <spectral@google.com>
parents:
38165
diff
changeset
|
1179 if hasconflictmarkers(fcd.data()): |
26575
d60815664c34
filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
26574
diff
changeset
|
1180 r = 1 |
d60815664c34
filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
26574
diff
changeset
|
1181 |
d60815664c34
filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
26574
diff
changeset
|
1182 checked = False |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1183 if b'prompt' in _toollist(ui, tool, b"check"): |
26575
d60815664c34
filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
26574
diff
changeset
|
1184 checked = True |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1185 if ui.promptchoice( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43106
diff
changeset
|
1186 _(b"was merge of '%s' successful (yn)?$$ &Yes $$ &No") |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1187 % uipathfn(fd), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1188 1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1189 ): |
26575
d60815664c34
filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
26574
diff
changeset
|
1190 r = 1 |
d60815664c34
filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
26574
diff
changeset
|
1191 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1192 if ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1193 not r |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1194 and not checked |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1195 and ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1196 _toolbool(ui, tool, b"checkchanged") |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1197 or b'changed' in _toollist(ui, tool, b"check") |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1198 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1199 ): |
34782
f21eecc64ace
filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents:
34506
diff
changeset
|
1200 if back is not None and not fcd.cmp(back): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1201 if ui.promptchoice( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1202 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1203 b" output file %s appears unchanged\n" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1204 b"was merge successful (yn)?" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1205 b"$$ &Yes $$ &No" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1206 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1207 % uipathfn(fd), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1208 1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1209 ): |
26575
d60815664c34
filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
26574
diff
changeset
|
1210 r = 1 |
d60815664c34
filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
26574
diff
changeset
|
1211 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1212 if back is not None and _toolbool(ui, tool, b"fixeol"): |
34034
7558917f291e
filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents:
34033
diff
changeset
|
1213 _matcheol(_workingpath(repo, fcd), back) |
26575
d60815664c34
filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
26574
diff
changeset
|
1214 |
d60815664c34
filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
26574
diff
changeset
|
1215 return r |
d60815664c34
filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
26574
diff
changeset
|
1216 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1217 |
34034
7558917f291e
filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents:
34033
diff
changeset
|
1218 def _workingpath(repo, ctx): |
7558917f291e
filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents:
34033
diff
changeset
|
1219 return repo.wjoin(ctx.path()) |
7558917f291e
filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents:
34033
diff
changeset
|
1220 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1221 |
34122
c0ce60459d84
merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents:
34076
diff
changeset
|
1222 def premerge(repo, wctx, mynode, orig, fcd, fco, fca, labels=None): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1223 return _filemerge( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1224 True, repo, wctx, mynode, orig, fcd, fco, fca, labels=labels |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1225 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1226 |
26607
45a6233d5f50
filemerge: introduce a premerge flag and function
Siddharth Agarwal <sid0@fb.com>
parents:
26606
diff
changeset
|
1227 |
34122
c0ce60459d84
merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents:
34076
diff
changeset
|
1228 def filemerge(repo, wctx, mynode, orig, fcd, fco, fca, labels=None): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1229 return _filemerge( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1230 False, repo, wctx, mynode, orig, fcd, fco, fca, labels=labels |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1231 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1232 |
26605
ef21a2c41629
filemerge: add a wrapper around the filemerge function
Siddharth Agarwal <sid0@fb.com>
parents:
26589
diff
changeset
|
1233 |
33699
50c44dee741a
filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33523
diff
changeset
|
1234 def loadinternalmerge(ui, extname, registrarobj): |
50c44dee741a
filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33523
diff
changeset
|
1235 """Load internal merge tool from specified registrarobj |
50c44dee741a
filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33523
diff
changeset
|
1236 """ |
43106
d783f945a701
py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43089
diff
changeset
|
1237 for name, func in pycompat.iteritems(registrarobj._table): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1238 fullname = b':' + name |
33699
50c44dee741a
filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33523
diff
changeset
|
1239 internals[fullname] = func |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1240 internals[b'internal:' + name] = func |
33699
50c44dee741a
filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33523
diff
changeset
|
1241 internalsdoc[fullname] = func |
50c44dee741a
filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33523
diff
changeset
|
1242 |
39126
e09fad982ef5
filemerge: show actual capabilities of internal merge tools
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
39125
diff
changeset
|
1243 capabilities = sorted([k for k, v in func.capabilities.items() if v]) |
e09fad982ef5
filemerge: show actual capabilities of internal merge tools
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
39125
diff
changeset
|
1244 if capabilities: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1245 capdesc = b" (actual capabilities: %s)" % b', '.join( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1246 capabilities |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1247 ) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1248 func.__doc__ = func.__doc__ + pycompat.sysstr(b"\n\n%s" % capdesc) |
39267
88c5a3ef54b1
filemerge: avoid putting translated text into docstring
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
39266
diff
changeset
|
1249 |
88c5a3ef54b1
filemerge: avoid putting translated text into docstring
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
39266
diff
changeset
|
1250 # to put i18n comments into hg.pot for automatically generated texts |
88c5a3ef54b1
filemerge: avoid putting translated text into docstring
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
39266
diff
changeset
|
1251 |
39359
bc0eb1dc6aae
filemerge: fix an i18n comment typo
Matt Harbison <matt_harbison@yahoo.com>
parents:
39285
diff
changeset
|
1252 # i18n: "binary" and "symlink" are keywords |
39267
88c5a3ef54b1
filemerge: avoid putting translated text into docstring
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
39266
diff
changeset
|
1253 # i18n: this text is added automatically |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1254 _(b" (actual capabilities: binary, symlink)") |
39267
88c5a3ef54b1
filemerge: avoid putting translated text into docstring
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
39266
diff
changeset
|
1255 # i18n: "binary" is keyword |
88c5a3ef54b1
filemerge: avoid putting translated text into docstring
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
39266
diff
changeset
|
1256 # i18n: this text is added automatically |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1257 _(b" (actual capabilities: binary)") |
39267
88c5a3ef54b1
filemerge: avoid putting translated text into docstring
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
39266
diff
changeset
|
1258 # i18n: "symlink" is keyword |
88c5a3ef54b1
filemerge: avoid putting translated text into docstring
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
39266
diff
changeset
|
1259 # i18n: this text is added automatically |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1260 _(b" (actual capabilities: symlink)") |
39126
e09fad982ef5
filemerge: show actual capabilities of internal merge tools
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
39125
diff
changeset
|
1261 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42565
diff
changeset
|
1262 |
33699
50c44dee741a
filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33523
diff
changeset
|
1263 # load built-in merge tools explicitly to setup internalsdoc |
50c44dee741a
filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33523
diff
changeset
|
1264 loadinternalmerge(None, None, internaltool) |
50c44dee741a
filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33523
diff
changeset
|
1265 |
16126
0c4bec9596d8
filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16125
diff
changeset
|
1266 # tell hggettext to extract docstrings from these functions: |
0c4bec9596d8
filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16125
diff
changeset
|
1267 i18nfunctions = internals.values() |