annotate mercurial/filemerge.py @ 43299:83bb1e89ab9b

copies: compute the exact set of revision to walk This change make the code clearer by removing the revision queue. It comes without very noticeable performance impact. However the simpler code will be easier to update in later changesets. revision: large amount; added files: large amount; rename small amount; c3b14617fbd7 9ba6ab77fd29 before: ! wall 1.430082 comb 1.430000 user 1.390000 sys 0.040000 (median of 10) after: ! wall 1.405192 comb 1.410000 user 1.390000 sys 0.020000 (median of 10) revision: large amount; added files: small amount; rename small amount; c3b14617fbd7 f650a9b140d2 before: ! wall 1.971366 comb 1.970000 user 1.950000 sys 0.020000 (median of 10) after: ! wall 1.892541 comb 1.890000 user 1.870000 sys 0.020000 (median of 10) revision: large amount; added files: large amount; rename large amount; 08ea3258278e d9fa043f30c0 before: ! wall 0.252594 comb 0.250000 user 0.240000 sys 0.010000 (median of 38) after: ! wall 0.240075 comb 0.240000 user 0.240000 sys 0.000000 (median of 40) revision: small amount; added files: large amount; rename large amount; df6f7a526b60 a83dc6a2d56f before: ! wall 0.013100 comb 0.010000 user 0.010000 sys 0.000000 (median of 226) after: ! wall 0.013247 comb 0.010000 user 0.010000 sys 0.000000 (median of 223) revision: small amount; added files: large amount; rename small amount; 4aa4e1f8e19a 169138063d63 before: ! wall 0.001633 comb 0.000000 user 0.000000 sys 0.000000 (median of 1000) after: ! wall 0.001670 comb 0.000000 user 0.000000 sys 0.000000 (median of 1000) revision: small amount; added files: small amount; rename small amount; 4bc173b045a6 964879152e2e before: ! wall 0.000078 comb 0.000000 user 0.000000 sys 0.000000 (median of 11984) after: ! wall 0.000119 comb 0.000000 user 0.000000 sys 0.000000 (median of 7982) revision: medium amount; added files: large amount; rename medium amount; c95f1ced15f2 2c68e87c3efe before: ! wall 0.207093 comb 0.210000 user 0.210000 sys 0.000000 (median of 47) after: ! wall 0.201551 comb 0.200000 user 0.200000 sys 0.000000 (median of 48) revision: medium amount; added files: medium amount; rename small amount; d343da0c55a8 d7746d32bf9d before: ! wall 0.038462 comb 0.040000 user 0.040000 sys 0.000000 (median of 100) after: ! wall 0.036578 comb 0.030000 user 0.030000 sys 0.000000 (median of 100) Differential Revision: https://phab.mercurial-scm.org/D7076
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Sat, 12 Oct 2019 18:35:14 +0200
parents 8ff1ecfadcd1
children 313e3a279828
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9709
diff changeset
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
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
101 def path(self):
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
102 return self._f
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
103
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
104 def size(self):
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
105 return None
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 data(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 filenode(self):
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
111 return nullid
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 _customcmp = True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
114
26979
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
115 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
116 """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
117
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
118 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
119 """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
120 return not (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
121 fctx.isabsent()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
122 and fctx.ctx() == self.ctx()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
123 and fctx.path() == self.path()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
124 )
26979
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
125
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
126 def flags(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
127 return b''
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 changectx(self):
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
130 return self._ctx
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 isbinary(self):
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
133 return False
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 isabsent(self):
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
136 return True
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
137
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
138
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
139 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
140 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
141 return tool
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
142 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
143 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
144 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
145 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
146
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
147
38041
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
148 def _quotetoolpath(cmd):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
149 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
150 return cmd
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
151 return procutil.shellquote(cmd)
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
152
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
153
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
154 def findexternaltool(ui, tool):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
155 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
156 k = _toolstr(ui, tool, kn)
984175605311 filemerge: introduce a 'regkeyalt' merge tool variable
Steve Borho <steve@borho.org>
parents: 12788
diff changeset
157 if not k:
984175605311 filemerge: introduce a 'regkeyalt' merge tool variable
Steve Borho <steve@borho.org>
parents: 12788
diff changeset
158 continue
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
159 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
160 if p:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
161 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
162 if p:
3c9dbb743d20 merge: add registry look up bits to tool search
Matt Mackall <mpm@selenic.com>
parents: 6005
diff changeset
163 return p
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
164 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
165 return procutil.findexe(util.expandpath(exe))
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
166
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
167
27039
d7517deedf86 filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27038
diff changeset
168 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
169 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
170
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
171 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
172 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
173 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
174 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
175
27039
d7517deedf86 filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27038
diff changeset
176 def supportscd(tool):
d7517deedf86 filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27038
diff changeset
177 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
178
d7517deedf86 filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27038
diff changeset
179 def check(tool, pat, symlink, binary, changedelete):
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
180 tmsg = tool
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
181 if pat:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
182 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
183 if not _findtool(ui, tool):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
184 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
185 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
186 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
187 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
188 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
189 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
190 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
191 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
192 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
193 # 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
194 # conflicts
d7517deedf86 filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27038
diff changeset
195 pass
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
196 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
197 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
198 else:
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
199 return True
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
200 return False
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
201
25835
34ffe4c29782 filemerge: mark internal-only config option
Matt Mackall <mpm@selenic.com>
parents: 24987
diff changeset
202 # internal config: ui.forcemerge
12788
de793925862e merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents: 12047
diff changeset
203 # 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
204 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
205 if force:
de793925862e merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents: 12047
diff changeset
206 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
207 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
208 return b":prompt", None
12788
de793925862e merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents: 12047
diff changeset
209 else:
27039
d7517deedf86 filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27038
diff changeset
210 if toolpath:
38041
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
211 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
212 else:
d7517deedf86 filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27038
diff changeset
213 # 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
214 return (force, force)
12788
de793925862e merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents: 12047
diff changeset
215
de793925862e merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents: 12047
diff changeset
216 # HGMERGE takes next precedence
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
217 hgmerge = encoding.environ.get(b"HGMERGE")
6025
f2335246e5c7 filemerge: wrap quotes around tool path
Steve Borho <steve@borho.org>
parents: 6016
diff changeset
218 if hgmerge:
27039
d7517deedf86 filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27038
diff changeset
219 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
220 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
221 else:
d7517deedf86 filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27038
diff changeset
222 return (hgmerge, hgmerge)
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
223
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
224 # 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
225
cded904f7acc filemerge: add config knob to check capabilities of internal merge tools
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39124
diff changeset
226 # 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
227 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
228
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
229 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
230 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
231 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
232 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
233 ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
234 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
235 b"warning: check merge-patterns configurations,"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
236 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
237 b"(see 'hg help merge-tools'"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
238 b" for binary files capability)\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
239 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
240 % (pycompat.bytestr(tool), pycompat.bytestr(path))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
241 )
10339
23e608f42f2c fix spaces/identation issues
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10282
diff changeset
242 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
243 return (tool, _quotetoolpath(toolpath))
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
244
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
245 # then merge tools
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
246 tools = {}
26730
a1e43e85d294 merge-tools: allow marking a mergetool as completely disabled
Augie Fackler <augie@google.com>
parents: 26614
diff changeset
247 disabled = set()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
248 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
249 t = k.split(b'.')[0]
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
250 if t not in tools:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
251 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
252 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
253 disabled.add(t)
6076
0ee885fea464 filemerge: more backwards compatible behavior for ui.merge
Steve Borho <steve@borho.org>
parents: 6075
diff changeset
254 names = tools.keys()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
255 tools = sorted(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
256 [(-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
257 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
258 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
259 if uimerge:
27039
d7517deedf86 filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27038
diff changeset
260 # 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
261 # change/delete conflicts
38952
0e58c5b20745 mergetool: warn if ui.merge points to nonexistent tool
Martin von Zweigbergk <martinvonz@google.com>
parents: 38793
diff changeset
262 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
263 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
264 return (uimerge, uimerge)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
265 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
266 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
267 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
268 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
269 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
270 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
271
c7eef052c9e3 filemerge: restore default prompt for binary/symlink lost in 83925d3a4559
Matt Mackall <mpm@selenic.com>
parents: 16205
diff changeset
272 # 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
273 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
274 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
275 # 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
276 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
277 return b":prompt", None
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
278 return b":merge", None
6003
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
279
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
280
6005
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
281 def _eoltype(data):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
282 b"Guess the EOL type of a file"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
283 if b'\0' in data: # binary
6005
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
284 return None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
285 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
286 return b'\r\n'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
287 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
288 return b'\r'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
289 if b'\n' in data: # UNIX
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
290 return b'\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
291 return None # unknown
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
292
6005
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
293
34782
f21eecc64ace filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents: 34506
diff changeset
294 def _matcheol(file, back):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
295 b"Convert EOL markers in a file to match origfile"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
296 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
297 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
298 data = util.readfile(file)
6005
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
299 style = _eoltype(data)
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
300 if style:
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
301 newdata = data.replace(style, tostyle)
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
302 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
303 util.writefile(file, newdata)
6005
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
304
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
305
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
306 @internaltool(b'prompt', nomerge)
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
307 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
308 """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
309 keep as the merged version."""
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
310 ui = repo.ui
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
311 fd = fcd.path()
41510
faa49a5914bb merge: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41365
diff changeset
312 uipathfn = scmutil.getuipathfn(repo)
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
313
35282
46d7f0713a87 filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents: 35281
diff changeset
314 # 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
315 # conflicts.
46d7f0713a87 filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents: 35281
diff changeset
316 if fcd.changectx().isinmemory():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
317 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
318 b'in-memory merge does not support file conflicts'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
319 )
35282
46d7f0713a87 filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents: 35281
diff changeset
320
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
321 prompts = partextras(labels)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
322 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
323 try:
27038
58a4eb16e722 filemerge: add support for change/delete conflicts to the ':prompt' tool
Siddharth Agarwal <sid0@fb.com>
parents: 27037
diff changeset
324 if fco.isabsent():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
325 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
326 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
327 elif fcd.isabsent():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
328 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
329 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
330 else:
42565
4764e8436b2a filemerge: make last line of prompts <40 english chars (issue6158)
Kyle Lippincott <spectral@google.com>
parents: 41600
diff changeset
331 # 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
332 # 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
333 # 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
334 index = ui.promptchoice(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
335 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
336 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
337 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
338 b"(u)nresolved.\n"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
339 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
340 b"$$ &Local $$ &Other $$ &Unresolved"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
341 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
342 % prompts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
343 2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
344 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
345 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
346
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
347 if choice == b'other':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
348 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
349 elif choice == b'local':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
350 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
351 elif choice == b'unresolved':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
352 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
353 except error.ResponseExpected:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
354 ui.write(b"\n")
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)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
356
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
357
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
358 @internaltool(b'local', nomerge)
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
359 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
360 """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
361 return 0, fcd.isabsent()
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
362
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
363
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
364 @internaltool(b'other', nomerge)
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
365 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
366 """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
367 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
368 # 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
369 _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
370 deleted = True
a8908c139f2f filemerge: add support for change/delete conflicts to the ':other' merge tool
Siddharth Agarwal <sid0@fb.com>
parents: 27036
diff changeset
371 else:
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).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
373 deleted = False
a8908c139f2f filemerge: add support for change/delete conflicts to the ':other' merge tool
Siddharth Agarwal <sid0@fb.com>
parents: 27036
diff changeset
374 return 0, deleted
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
375
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
376
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
377 @internaltool(b'fail', nomerge)
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
378 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
379 """
16126
0c4bec9596d8 filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16125
diff changeset
380 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
381 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
382 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
383 # 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
384 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
385 _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
386 return 1, False
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
387
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
388
33151
851825214aa3 filemerge: convert a couple of wvfs calls in internal mergetools to contexts
Phil Cohen <phillco@fb.com>
parents: 32873
diff changeset
389 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
390 """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
391 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
392 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
393 """
851825214aa3 filemerge: convert a couple of wvfs calls in internal mergetools to contexts
Phil Cohen <phillco@fb.com>
parents: 32873
diff changeset
394 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
395 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
396 else:
851825214aa3 filemerge: convert a couple of wvfs calls in internal mergetools to contexts
Phil Cohen <phillco@fb.com>
parents: 32873
diff changeset
397 return filectx
851825214aa3 filemerge: convert a couple of wvfs calls in internal mergetools to contexts
Phil Cohen <phillco@fb.com>
parents: 32873
diff changeset
398
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
399
27041
0e330f59ef68 filemerge: don't attempt to premerge change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27040
diff changeset
400 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
401 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
402 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
403 return 1
34032
67cfffbfb6a0 filemerge: eliminate most uses of tempfiles
Phil Cohen <phillco@fb.com>
parents: 34031
diff changeset
404 unused, unused, unused, back = files
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
405
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
406 ui = repo.ui
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
407
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
408 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
409
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
410 # do we attempt to simplemerge first?
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
411 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
412 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
413 except error.ConfigError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
414 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
415 if premerge not in validkeep:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
416 _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
417 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
418 _(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
419 % (tool, premerge, _valid)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
420 )
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
421
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
422 if premerge:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
423 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
424 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
425 labels = _defaultconflictlabels
d7f25834ffbb merge-tools: add a `premerge=keep-merge3` config option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22031
diff changeset
426 if len(labels) < 3:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
427 labels.append(b'base')
34049
6330df9d6393 simplemerge: remove unused `repo` parameter
Phil Cohen <phillco@fb.com>
parents: 34036
diff changeset
428 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
429 if not r:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
430 ui.debug(b" premerge successful\n")
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
431 return 0
22031
b36c60cfe46f merge-tools: make premerge valid values extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22028
diff changeset
432 if premerge not in validkeep:
34032
67cfffbfb6a0 filemerge: eliminate most uses of tempfiles
Phil Cohen <phillco@fb.com>
parents: 34031
diff changeset
433 # restore from backup and try again
34036
fe04c018eaac filemerge: add _restorebackup
Phil Cohen <phillco@fb.com>
parents: 34035
diff changeset
434 _restorebackup(fcd, back)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
435 return 1 # continue merging
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
436
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
437
26948
067ab07435c9 filemerge: rename _symlinkcheck to _mergecheck
Siddharth Agarwal <sid0@fb.com>
parents: 26941
diff changeset
438 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
439 tool, toolpath, binary, symlink, scriptfn = toolconf
41510
faa49a5914bb merge: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41365
diff changeset
440 uipathfn = scmutil.getuipathfn(repo)
26515
0ffa7fe1076b filemerge: add a precheck for symlinks
Siddharth Agarwal <sid0@fb.com>
parents: 26514
diff changeset
441 if symlink:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
442 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
443 _(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
444 % (tool, uipathfn(fcd.path()))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
445 )
26515
0ffa7fe1076b filemerge: add a precheck for symlinks
Siddharth Agarwal <sid0@fb.com>
parents: 26514
diff changeset
446 return False
27040
1bde66b89bb2 filemerge._mergecheck: add check for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27039
diff changeset
447 if fcd.isabsent() or fco.isabsent():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
448 repo.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
449 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
450 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
451 b'conflict for %s\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
452 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
453 % (tool, uipathfn(fcd.path()))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
454 )
27040
1bde66b89bb2 filemerge._mergecheck: add check for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27039
diff changeset
455 return False
26515
0ffa7fe1076b filemerge: add a precheck for symlinks
Siddharth Agarwal <sid0@fb.com>
parents: 26514
diff changeset
456 return True
0ffa7fe1076b filemerge: add a precheck for symlinks
Siddharth Agarwal <sid0@fb.com>
parents: 26514
diff changeset
457
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
458
26070
e15966216aec filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents: 25949
diff changeset
459 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
460 """
16126
0c4bec9596d8 filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16125
diff changeset
461 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
462 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
463 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
464 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
465 ui = repo.ui
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
466
34049
6330df9d6393 simplemerge: remove unused `repo` parameter
Phil Cohen <phillco@fb.com>
parents: 34036
diff changeset
467 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
468 return True, r, False
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
469
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
470
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
471 @internaltool(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
472 b'union',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
473 fullmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
474 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
475 b"warning: conflicts while merging %s! "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
476 b"(edit, then use 'hg resolve --mark')\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
477 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
478 precheck=_mergecheck,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
479 )
26071
ff12a6c63c3d filemerge: add 'union' merge to internal merge tool
Erik Huelsmann <ehuels@gmail.com>
parents: 26070
diff changeset
480 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
481 """
ff12a6c63c3d filemerge: add 'union' merge to internal merge tool
Erik Huelsmann <ehuels@gmail.com>
parents: 26070
diff changeset
482 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
483 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
484 No markers are inserted."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
485 return _merge(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
486 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
487 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
488
26071
ff12a6c63c3d filemerge: add 'union' merge to internal merge tool
Erik Huelsmann <ehuels@gmail.com>
parents: 26070
diff changeset
489
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
490 @internaltool(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
491 b'merge',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
492 fullmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
493 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
494 b"warning: conflicts while merging %s! "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
495 b"(edit, then use 'hg resolve --mark')\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
496 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
497 precheck=_mergecheck,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
498 )
26070
e15966216aec filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents: 25949
diff changeset
499 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
500 """
e15966216aec filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents: 25949
diff changeset
501 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
502 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
503 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
504 of merge."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
505 return _merge(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
506 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
507 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
508
26070
e15966216aec filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents: 25949
diff changeset
509
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
510 @internaltool(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
511 b'merge3',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
512 fullmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
513 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
514 b"warning: conflicts while merging %s! "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
515 b"(edit, then use 'hg resolve --mark')\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
516 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
517 precheck=_mergecheck,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
518 )
22028
3d0572ab3b4a merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 22027
diff changeset
519 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
520 """
3d0572ab3b4a merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 22027
diff changeset
521 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
522 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
523 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
524 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
525 if not labels:
3d0572ab3b4a merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 22027
diff changeset
526 labels = _defaultconflictlabels
3d0572ab3b4a merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 22027
diff changeset
527 if len(labels) < 3:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
528 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
529 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
530
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
531
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
532 def _imergeauto(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
533 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
534 mynode,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
535 orig,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
536 fcd,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
537 fco,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
538 fca,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
539 toolconf,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
540 files,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
541 labels=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
542 localorother=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
543 ):
26224
a4da463df6cf filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 26071
diff changeset
544 """
a4da463df6cf filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 26071
diff changeset
545 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
546 """
a4da463df6cf filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 26071
diff changeset
547 assert localorother is not None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
548 r = simplemerge.simplemerge(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
549 repo.ui, fcd, fca, fco, label=labels, localorother=localorother
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
550 )
26224
a4da463df6cf filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 26071
diff changeset
551 return True, r
a4da463df6cf filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 26071
diff changeset
552
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
553
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
554 @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
555 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
556 """
a4da463df6cf filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 26071
diff changeset
557 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
558 of the local `p1()` changes."""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
559 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
560 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
561
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
562
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
563 @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
564 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
565 """
a4da463df6cf filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 26071
diff changeset
566 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
567 of the other `p2()` changes."""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
568 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
569 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
570
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
571
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
572 @internaltool(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
573 b'tagmerge',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
574 mergeonly,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
575 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
576 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
577 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
578 b"tool of your choice)\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
579 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
580 )
21922
50e20154cb68 filemerge: add internal:tagmerge merge tool
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21921
diff changeset
581 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
582 """
50e20154cb68 filemerge: add internal:tagmerge merge tool
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21921
diff changeset
583 Uses the internal tag merge algorithm (experimental).
50e20154cb68 filemerge: add internal:tagmerge merge tool
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21921
diff changeset
584 """
27033
089dab8794dc filemerge: return whether the file is deleted from all other merge tools
Siddharth Agarwal <sid0@fb.com>
parents: 27032
diff changeset
585 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
586 return success, status, False
21922
50e20154cb68 filemerge: add internal:tagmerge merge tool
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21921
diff changeset
587
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
588
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
589 @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
590 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
591 """
16126
0c4bec9596d8 filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16125
diff changeset
592 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
593 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
594 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
595 ``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
596 ``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
597 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
598
34915
cab34bda259e help: fix typo in hg merge documentation
Joe Blaylock <jrbl@google.com>
parents: 34826
diff changeset
599 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
600 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
601 """
34034
7558917f291e filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents: 34033
diff changeset
602 a = _workingpath(repo, fcd)
26573
a875773cf537 filemerge._idump: drop no longer necessary 'if r:' check
Siddharth Agarwal <sid0@fb.com>
parents: 26572
diff changeset
603 fd = fcd.path()
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
604
34785
1af4561b6bfe filemerge: add a missing flushall()
Phil Cohen <phillco@fb.com>
parents: 34784
diff changeset
605 from . import context
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
606
34785
1af4561b6bfe filemerge: add a missing flushall()
Phil Cohen <phillco@fb.com>
parents: 34784
diff changeset
607 if isinstance(fcd, context.overlayworkingfilectx):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
608 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
609 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
610 )
34785
1af4561b6bfe filemerge: add a missing flushall()
Phil Cohen <phillco@fb.com>
parents: 34784
diff changeset
611
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
612 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
613 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
614 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
615 return False, 1, False
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
616
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
617
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
618 @internaltool(b'forcedump', mergeonly, binary=True, symlink=True)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
619 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
620 """
7e35d31b41fd filemerge: add internal merge tool to dump files forcibly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32254
diff changeset
621 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
622 """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
623 return _idump(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
624 repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=labels
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
625 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
626
32255
7e35d31b41fd filemerge: add internal merge tool to dump files forcibly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32254
diff changeset
627
35463
ef7e667a4f7b filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents: 35282
diff changeset
628 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
629 # 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
630 # for now.
ef7e667a4f7b filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents: 35282
diff changeset
631 #
ef7e667a4f7b filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents: 35282
diff changeset
632 # 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
633 # 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
634 # 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
635 # 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
636 # clunky.)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
637 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
638 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
639 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
640
35463
ef7e667a4f7b filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents: 35282
diff changeset
641
40478
86dfae98a3a2 merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents: 39359
diff changeset
642 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
643 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
644 if not tmpl:
86dfae98a3a2 merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents: 39359
diff changeset
645 return
86dfae98a3a2 merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents: 39359
diff changeset
646
86dfae98a3a2 merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents: 39359
diff changeset
647 mappingdict = templateutil.mappingdict
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
648 props = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
649 b'ctx': fcl.changectx(),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
650 b'node': hex(mynode),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
651 b'path': fcl.path(),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
652 b'local': mappingdict(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
653 {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
654 b'ctx': fcl.changectx(),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
655 b'fctx': fcl,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
656 b'node': hex(mynode),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
657 b'name': _(b'local'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
658 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
659 b'label': env[b'HG_MY_LABEL'],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
660 }
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
661 ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
662 b'base': mappingdict(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
663 {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
664 b'ctx': fcb.changectx(),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
665 b'fctx': fcb,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
666 b'name': _(b'base'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
667 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
668 b'label': env[b'HG_BASE_LABEL'],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
669 }
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
670 ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
671 b'other': mappingdict(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
672 {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
673 b'ctx': fco.changectx(),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
674 b'fctx': fco,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
675 b'name': _(b'other'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
676 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
677 b'label': env[b'HG_OTHER_LABEL'],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
678 }
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
679 ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
680 b'toolpath': toolpath,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
681 b'toolargs': args,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
682 }
40478
86dfae98a3a2 merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents: 39359
diff changeset
683
86dfae98a3a2 merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents: 39359
diff changeset
684 # 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
685 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
686
86dfae98a3a2 merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents: 39359
diff changeset
687 # 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
688 # 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
689 tres = formatter.templateresources(ui, repo)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
690 t = formatter.maketemplater(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
691 ui, tmpl, defaults=templatekw.keywords, resources=tres
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
692 )
40478
86dfae98a3a2 merge-tools: when calling external merge tool, describe the resolve inputs
Kyle Lippincott <spectral@google.com>
parents: 39359
diff changeset
693 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
694
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
695
21273
20b8090d8125 merge: define conflict marker labels in filemerge()
Durham Goode <durham@fb.com>
parents: 21100
diff changeset
696 def _xmerge(repo, mynode, orig, 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
697 tool, toolpath, binary, symlink, scriptfn = toolconf
41510
faa49a5914bb merge: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41365
diff changeset
698 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
699 if fcd.isabsent() or fco.isabsent():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
700 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
701 _(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
702 % (tool, uipathfn(fcd.path()))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
703 )
27042
30b919bc49bf filemerge: don't try using external tools on change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27041
diff changeset
704 return False, 1, None
34035
96123bdea43e filemerge: reduce creation of tempfiles until needed
Phil Cohen <phillco@fb.com>
parents: 34034
diff changeset
705 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
706 localpath = _workingpath(repo, fcd)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
707 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
708
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
709 with _maketempfiles(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
710 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
711 ) 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
712 basepath, otherpath, localoutputpath = temppaths
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
713 outpath = b""
35907
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
714 mylabel, otherlabel = labels[:2]
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
715 if len(labels) >= 3:
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
716 baselabel = labels[2]
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
717 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
718 baselabel = b'base'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
719 env = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
720 b'HG_FILE': fcd.path(),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
721 b'HG_MY_NODE': short(mynode),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
722 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
723 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
724 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
725 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
726 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
727 b'HG_MY_LABEL': mylabel,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
728 b'HG_OTHER_LABEL': otherlabel,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
729 b'HG_BASE_LABEL': baselabel,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
730 }
34035
96123bdea43e filemerge: reduce creation of tempfiles until needed
Phil Cohen <phillco@fb.com>
parents: 34034
diff changeset
731 ui = repo.ui
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
732
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
733 if b"$output" in args:
34782
f21eecc64ace filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents: 34506
diff changeset
734 # 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
735 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
736 localpath = localoutputpath
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
737 replace = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
738 b'local': localpath,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
739 b'base': basepath,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
740 b'other': otherpath,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
741 b'output': outpath,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
742 b'labellocal': mylabel,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
743 b'labelother': otherlabel,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
744 b'labelbase': baselabel,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
745 }
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
746 args = util.interpolate(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
747 br'\$',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
748 replace,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
749 args,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
750 lambda s: procutil.shellquote(util.localpath(s)),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
751 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
752 if _toolbool(ui, tool, b"gui"):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
753 repo.ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
754 _(b'running merge tool %s for file %s\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
755 % (tool, uipathfn(fcd.path()))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
756 )
38041
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
757 if scriptfn is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
758 cmd = toolpath + b' ' + args
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
759 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
760 _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
761 r = ui.system(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
762 cmd, cwd=repo.root, environ=env, blockedtag=b'mergetool'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
763 )
38041
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
764 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
765 repo.ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
766 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
767 )
38041
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
768 r = 0
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
769 try:
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
770 # 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
771 from . import extensions
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
772
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
773 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
774 except Exception:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
775 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
776 _(b"loading python merge script failed: %s") % toolpath
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
777 )
38041
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
778 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
779 if mergefn is None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
780 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
781 _(b"%s does not have function: %s") % (toolpath, scriptfn)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
782 )
38041
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
783 argslist = procutil.shellsplit(args)
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
784 # 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
785 from . import hook
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
786
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
787 ret, raised = hook.pythonhook(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
788 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
789 )
38041
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
790 if raised:
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
791 r = 1
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
792 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
793 return True, r, False
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
794
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
795
35482
c240657febb7 templater: drop unneeded resources from conflict-marker data
Yuya Nishihara <yuya@tcha.org>
parents: 35469
diff changeset
796 def _formatconflictmarker(ctx, template, label, pad):
21519
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
797 """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
798
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
799 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
800 can have aligned templated parts.
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 if ctx.node() is None:
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
803 ctx = ctx.p1()
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
804
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
805 props = {b'ctx': ctx}
36988
317382151ac3 templater: rename .render(mapping) to .renderdefault(mapping) (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36976
diff changeset
806 templateresult = template.renderdefault(props)
21519
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 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
809 mark = b'%s %s' % (label, templateresult)
21519
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
810
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
811 if mark:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
812 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
813
21865
78e56e70c70a filemerge: use 'util.ellipsis' to trim custom conflict markers correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21864
diff changeset
814 # 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
815 return stringutil.ellipsis(mark, 80 - 8)
21519
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
816
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
817
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
818 _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
819
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
820
35907
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
821 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
822 """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
823
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
824 Returns a list of formatted labels.
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
825 """
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
826 cd = fcd.changectx()
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
827 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
828 ca = fca.changectx()
21519
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
829
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
830 ui = repo.ui
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
831 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
832 if tool is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
833 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
834 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
835 tres = formatter.templateresources(ui, repo)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
836 tmpl = formatter.maketemplater(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
837 ui, template, defaults=templatekw.keywords, resources=tres
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
838 )
21519
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
839
22026
6966542768ff filemerge: allow the formatting of three labels instead of two
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22025
diff changeset
840 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
841
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
842 newlabels = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
843 _formatconflictmarker(cd, tmpl, labels[0], pad),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
844 _formatconflictmarker(co, tmpl, labels[1], pad),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
845 ]
22026
6966542768ff filemerge: allow the formatting of three labels instead of two
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22025
diff changeset
846 if len(labels) > 2:
35482
c240657febb7 templater: drop unneeded resources from conflict-marker data
Yuya Nishihara <yuya@tcha.org>
parents: 35469
diff changeset
847 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
848 return newlabels
21519
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
849
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
850
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
851 def partextras(labels):
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
852 """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
853
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
854 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
855 """
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
856 if labels is None:
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
857 return {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
858 b"l": b"",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
859 b"o": b"",
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
860 }
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
861
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
862 return {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
863 b"l": b" [%s]" % labels[0],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
864 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
865 }
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
866
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
867
34036
fe04c018eaac filemerge: add _restorebackup
Phil Cohen <phillco@fb.com>
parents: 34035
diff changeset
868 def _restorebackup(fcd, back):
fe04c018eaac filemerge: add _restorebackup
Phil Cohen <phillco@fb.com>
parents: 34035
diff changeset
869 # TODO: Add a workingfilectx.write(otherfilectx) path so we can use
fe04c018eaac filemerge: add _restorebackup
Phil Cohen <phillco@fb.com>
parents: 34035
diff changeset
870 # util.copy here instead.
34782
f21eecc64ace filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents: 34506
diff changeset
871 fcd.write(back.data(), fcd.flags())
34036
fe04c018eaac filemerge: add _restorebackup
Phil Cohen <phillco@fb.com>
parents: 34035
diff changeset
872
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
873
34782
f21eecc64ace filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents: 34506
diff changeset
874 def _makebackup(repo, ui, wctx, fcd, premerge):
f21eecc64ace filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents: 34506
diff changeset
875 """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
876
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
877 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
878 (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
879 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
880 have.
35702
c0439e11af16 filemerge: fix backing up an in-memory file to a custom location
Phil Cohen <phillco@fb.com>
parents: 35483
diff changeset
881
c0439e11af16 filemerge: fix backing up an in-memory file to a custom location
Phil Cohen <phillco@fb.com>
parents: 35483
diff changeset
882 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
883 content doesn't change afterwards.
34031
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
884 """
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
885 if fcd.isabsent():
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
886 return None
34782
f21eecc64ace filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents: 34506
diff changeset
887 # TODO: Break this import cycle somehow. (filectx -> ctx -> fileset ->
f21eecc64ace filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents: 34506
diff changeset
888 # 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
889 from . import context
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
890
41600
a8ccd821b7d2 filemerge: migrate to scmutil.backuppath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41510
diff changeset
891 back = scmutil.backuppath(ui, repo, fcd.path())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
892 inworkingdir = back.startswith(repo.wvfs.base) and not back.startswith(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
893 repo.vfs.base
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
894 )
34784
123a68e6b473 filemerge: store backups in the overlayworkingctx if using imm
Phil Cohen <phillco@fb.com>
parents: 34782
diff changeset
895 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
896 # 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
897 # 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
898 # so we don't disturb the working directory.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
899 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
900 if premerge:
9a50ffd15b25 filemerge: only write in-memory backup during premerge
Phil Cohen <phillco@fb.com>
parents: 35702
diff changeset
901 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
902 return wctx[relpath]
123a68e6b473 filemerge: store backups in the overlayworkingctx if using imm
Phil Cohen <phillco@fb.com>
parents: 34782
diff changeset
903 else:
35702
c0439e11af16 filemerge: fix backing up an in-memory file to a custom location
Phil Cohen <phillco@fb.com>
parents: 35483
diff changeset
904 if premerge:
c0439e11af16 filemerge: fix backing up an in-memory file to a custom location
Phil Cohen <phillco@fb.com>
parents: 35483
diff changeset
905 # 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
906 # 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
907 # 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
908 # on disk.
c0439e11af16 filemerge: fix backing up an in-memory file to a custom location
Phil Cohen <phillco@fb.com>
parents: 35483
diff changeset
909 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
910 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
911 else:
41600
a8ccd821b7d2 filemerge: migrate to scmutil.backuppath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41510
diff changeset
912 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
913 util.copyfile(a, back)
34784
123a68e6b473 filemerge: store backups in the overlayworkingctx if using imm
Phil Cohen <phillco@fb.com>
parents: 34782
diff changeset
914 # 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
915 # 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
916 return context.arbitraryfilectx(back, repo=repo)
34031
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
917
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
918
36998
3723b42ff953 filemerge: move temp file unlinks to _maketempfiles
Kyle Lippincott <spectral@google.com>
parents: 36988
diff changeset
919 @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
920 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
921 """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
922 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
923 use them.
34031
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
924 """
36999
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
925 tmproot = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
926 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
927 if tmprootprefix:
38165
2ce60954b1b7 py3: wrap tempfile.mkdtemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents: 38164
diff changeset
928 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
929
37077
1e30a26a65d0 filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents: 36999
diff changeset
930 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
931 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
932 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
933 if tmproot:
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
934 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
935 if ext:
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
936 name += ext
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
937 f = open(name, r"wb")
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
938 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
939 fd, name = pycompat.mkstemp(prefix=pre + b'.', suffix=ext)
36999
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
940 f = os.fdopen(fd, r"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
941 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
942
1e30a26a65d0 filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents: 36999
diff changeset
943 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
944 f, name = maketempfrompath(prefix, ctx.path())
34031
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
945 data = repo.wwritedata(ctx.path(), ctx.data())
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
946 f.write(data)
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
947 f.close()
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
948 return name
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
949
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
950 b = tempfromcontext(b"base", fca)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
951 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
952 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
953 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
954 # 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
955 # 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
956 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
957 d, _ = os.path.splitext(d)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
958 f, d = maketempfrompath(b"local", d)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
959 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
960 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
961 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
962
36998
3723b42ff953 filemerge: move temp file unlinks to _maketempfiles
Kyle Lippincott <spectral@google.com>
parents: 36988
diff changeset
963 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
964 yield b, c, d
36998
3723b42ff953 filemerge: move temp file unlinks to _maketempfiles
Kyle Lippincott <spectral@google.com>
parents: 36988
diff changeset
965 finally:
36999
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
966 if tmproot:
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
967 shutil.rmtree(tmproot)
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
968 else:
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
969 util.unlink(b)
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
970 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
971 # 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
972 # 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
973 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
974 util.unlink(d)
34031
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
975
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
976
34122
c0ce60459d84 merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents: 34076
diff changeset
977 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
978 """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
979
26607
45a6233d5f50 filemerge: introduce a premerge flag and function
Siddharth Agarwal <sid0@fb.com>
parents: 26606
diff changeset
980 premerge = whether this is a premerge
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
981 mynode = parent node before merge
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
982 orig = original local filename before merge
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
983 fco = other file context
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
984 fca = ancestor file context
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
985 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
986
27034
86ede9eda252 filemerge: return whether the file was deleted
Siddharth Agarwal <sid0@fb.com>
parents: 27033
diff changeset
987 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
988 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
989
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
990 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
991 return True, None, False
26512
4c52dd406adc filemerge: indent filemerge.filemerge
Siddharth Agarwal <sid0@fb.com>
parents: 26224
diff changeset
992
26608
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
993 ui = repo.ui
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
994 fd = fcd.path()
41510
faa49a5914bb merge: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41365
diff changeset
995 uipathfn = scmutil.getuipathfn(repo)
faa49a5914bb merge: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41365
diff changeset
996 fduipath = uipathfn(fd)
26608
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
997 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
998 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
999 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
1000 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
1001 scriptfn = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1002 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
1003 # 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
1004 tool = tool[len(b'internal') :]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1005 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
1006 invalidsyntax = False
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1007 if toolpath.count(b':') >= 2:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1008 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
1009 if not scriptfn:
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
1010 invalidsyntax = True
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
1011 # 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
1012 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
1013 invalidsyntax = True
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
1014 else:
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
1015 invalidsyntax = True
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
1016 if invalidsyntax:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1017 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
1018 toolpath = script
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1019 ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1020 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
1021 % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1022 tool,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1023 fduipath,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1024 pycompat.bytestr(binary),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1025 pycompat.bytestr(symlink),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1026 pycompat.bytestr(changedelete),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1027 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1028 )
6003
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
1029
26608
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
1030 if tool in internals:
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
1031 func = internals[tool]
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
1032 mergetype = func.mergetype
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
1033 onfailure = func.onfailure
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
1034 precheck = func.precheck
35907
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
1035 isexternal = False
26608
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
1036 else:
35463
ef7e667a4f7b filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents: 35282
diff changeset
1037 if wctx.isinmemory():
ef7e667a4f7b filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents: 35282
diff changeset
1038 func = _xmergeimm
ef7e667a4f7b filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents: 35282
diff changeset
1039 else:
ef7e667a4f7b filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents: 35282
diff changeset
1040 func = _xmerge
26608
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
1041 mergetype = fullmerge
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1042 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
1043 precheck = None
35907
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
1044 isexternal = True
26512
4c52dd406adc filemerge: indent filemerge.filemerge
Siddharth Agarwal <sid0@fb.com>
parents: 26224
diff changeset
1045
38041
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
1046 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
1047
26608
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
1048 if mergetype == nomerge:
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
1049 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
1050 return True, r, deleted
26512
4c52dd406adc filemerge: indent filemerge.filemerge
Siddharth Agarwal <sid0@fb.com>
parents: 26224
diff changeset
1051
26609
47681e77e484 filemerge: only print out "merging f" output at premerge step
Siddharth Agarwal <sid0@fb.com>
parents: 26608
diff changeset
1052 if premerge:
47681e77e484 filemerge: only print out "merging f" output at premerge step
Siddharth Agarwal <sid0@fb.com>
parents: 26608
diff changeset
1053 if orig != fco.path():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1054 ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1055 _(b"merging %s and %s to %s\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1056 % (uipathfn(orig), uipathfn(fco.path()), fduipath)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1057 )
26609
47681e77e484 filemerge: only print out "merging f" output at premerge step
Siddharth Agarwal <sid0@fb.com>
parents: 26608
diff changeset
1058 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1059 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
1060
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1061 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
1062
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1063 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
1064 if onfailure:
35282
46d7f0713a87 filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents: 35281
diff changeset
1065 if wctx.isinmemory():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1066 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
1067 b'in-memory merge does not support merge conflicts'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1068 )
41510
faa49a5914bb merge: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41365
diff changeset
1069 ui.warn(onfailure % fduipath)
27034
86ede9eda252 filemerge: return whether the file was deleted
Siddharth Agarwal <sid0@fb.com>
parents: 27033
diff changeset
1070 return True, 1, False
26529
7833b13b001f filemerge: move precheck to before files are written out
Siddharth Agarwal <sid0@fb.com>
parents: 26528
diff changeset
1071
34782
f21eecc64ace filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents: 34506
diff changeset
1072 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
1073 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
1074 r = 1
fb388aa26453 filemerge: clean up temp files in a finally block
Siddharth Agarwal <sid0@fb.com>
parents: 26575
diff changeset
1075 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1076 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
1077 if isexternal:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1078 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
1079 else:
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
1080 markerstyle = internalmarkerstyle
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
1081
26529
7833b13b001f filemerge: move precheck to before files are written out
Siddharth Agarwal <sid0@fb.com>
parents: 26528
diff changeset
1082 if not labels:
7833b13b001f filemerge: move precheck to before files are written out
Siddharth Agarwal <sid0@fb.com>
parents: 26528
diff changeset
1083 labels = _defaultconflictlabels
35907
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
1084 formattedlabels = labels
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1085 if markerstyle != b'basic':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1086 formattedlabels = _formatlabels(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1087 repo, fcd, fco, fca, labels, tool=tool
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1088 )
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
1089
26607
45a6233d5f50 filemerge: introduce a premerge flag and function
Siddharth Agarwal <sid0@fb.com>
parents: 26606
diff changeset
1090 if premerge and mergetype == fullmerge:
35907
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
1091 # 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
1092 # 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
1093 # 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
1094 # 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
1095 # 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
1096 premergelabels = labels
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
1097 labeltool = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1098 if markerstyle != b'basic':
35907
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
1099 # 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
1100 # ui.mergemarkertemplate)
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
1101 labeltool = tool
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1102 if internalmarkerstyle != b'basic' or markerstyle != b'basic':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1103 premergelabels = _formatlabels(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1104 repo, fcd, fco, fca, premergelabels, tool=labeltool
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1105 )
35907
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
1106
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1107 r = _premerge(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1108 repo, fcd, fco, fca, toolconf, files, labels=premergelabels
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1109 )
26611
a5ff66e6d77a filemerge: break overall filemerge into separate premerge and merge steps
Siddharth Agarwal <sid0@fb.com>
parents: 26610
diff changeset
1110 # 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
1111 return not r, r, False
26567
f18646cf0e93 filemerge: call premerge directly from main merge function
Siddharth Agarwal <sid0@fb.com>
parents: 26529
diff changeset
1112
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1113 needcheck, r, deleted = func(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1114 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1115 mynode,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1116 orig,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1117 fcd,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1118 fco,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1119 fca,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1120 toolconf,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1121 files,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1122 labels=formattedlabels,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1123 )
27033
089dab8794dc filemerge: return whether the file is deleted from all other merge tools
Siddharth Agarwal <sid0@fb.com>
parents: 27032
diff changeset
1124
26575
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
1125 if needcheck:
34034
7558917f291e filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents: 34033
diff changeset
1126 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
1127
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
1128 if r:
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
1129 if onfailure:
35282
46d7f0713a87 filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents: 35281
diff changeset
1130 if wctx.isinmemory():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1131 raise error.InMemoryMergeConflictsError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1132 b'in-memory merge '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1133 b'does not support '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1134 b'merge conflicts'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1135 )
41510
faa49a5914bb merge: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41365
diff changeset
1136 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
1137 _onfilemergefailure(ui)
26589
fb388aa26453 filemerge: clean up temp files in a finally block
Siddharth Agarwal <sid0@fb.com>
parents: 26575
diff changeset
1138
27034
86ede9eda252 filemerge: return whether the file was deleted
Siddharth Agarwal <sid0@fb.com>
parents: 27033
diff changeset
1139 return True, r, deleted
26589
fb388aa26453 filemerge: clean up temp files in a finally block
Siddharth Agarwal <sid0@fb.com>
parents: 26575
diff changeset
1140 finally:
27047
e1458049dca5 filemerge: don't try to copy files known to be absent
Siddharth Agarwal <sid0@fb.com>
parents: 27042
diff changeset
1141 if not r and back is not None:
34782
f21eecc64ace filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents: 34506
diff changeset
1142 back.remove()
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
1143
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1144
34796
ed91846c29cf filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents: 34785
diff changeset
1145 def _haltmerge():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1146 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
1147 raise error.InterventionRequired(msg)
ed91846c29cf filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents: 34785
diff changeset
1148
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1149
34796
ed91846c29cf filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents: 34785
diff changeset
1150 def _onfilemergefailure(ui):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1151 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
1152 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
1153 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
1154 if ui.promptchoice(msg, 0) == 1:
ed91846c29cf filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents: 34785
diff changeset
1155 _haltmerge()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1156 if action == b'halt':
34796
ed91846c29cf filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents: 34785
diff changeset
1157 _haltmerge()
ed91846c29cf filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents: 34785
diff changeset
1158 # 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
1159
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1160
38793
6c8e3c847977 resolve: add option to warn/abort on -m with unresolved conflict markers
Kyle Lippincott <spectral@google.com>
parents: 38165
diff changeset
1161 def hasconflictmarkers(data):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1162 return bool(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1163 re.search(b"^(<<<<<<< .*|=======|>>>>>>> .*)$", data, re.MULTILINE)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1164 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1165
38793
6c8e3c847977 resolve: add option to warn/abort on -m with unresolved conflict markers
Kyle Lippincott <spectral@google.com>
parents: 38165
diff changeset
1166
34034
7558917f291e filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents: 34033
diff changeset
1167 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
1168 fd = fcd.path()
41510
faa49a5914bb merge: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41365
diff changeset
1169 uipathfn = scmutil.getuipathfn(repo)
34034
7558917f291e filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents: 34033
diff changeset
1170 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
1171
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1172 if not r and (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1173 _toolbool(ui, tool, b"checkconflicts")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1174 or b'conflicts' in _toollist(ui, tool, b"check")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1175 ):
38793
6c8e3c847977 resolve: add option to warn/abort on -m with unresolved conflict markers
Kyle Lippincott <spectral@google.com>
parents: 38165
diff changeset
1176 if hasconflictmarkers(fcd.data()):
26575
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
1177 r = 1
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
1178
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
1179 checked = False
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1180 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
1181 checked = True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1182 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
1183 _(b"was merge of '%s' successful (yn)?$$ &Yes $$ &No")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1184 % uipathfn(fd),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1185 1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1186 ):
26575
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
1187 r = 1
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
1188
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1189 if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1190 not r
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1191 and not checked
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1192 and (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1193 _toolbool(ui, tool, b"checkchanged")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1194 or b'changed' in _toollist(ui, tool, b"check")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1195 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1196 ):
34782
f21eecc64ace filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents: 34506
diff changeset
1197 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
1198 if ui.promptchoice(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1199 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1200 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
1201 b"was merge successful (yn)?"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1202 b"$$ &Yes $$ &No"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1203 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1204 % uipathfn(fd),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1205 1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1206 ):
26575
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
1207 r = 1
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
1208
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1209 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
1210 _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
1211
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
1212 return r
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
1213
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1214
34034
7558917f291e filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents: 34033
diff changeset
1215 def _workingpath(repo, ctx):
7558917f291e filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents: 34033
diff changeset
1216 return repo.wjoin(ctx.path())
7558917f291e filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents: 34033
diff changeset
1217
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1218
34122
c0ce60459d84 merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents: 34076
diff changeset
1219 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
1220 return _filemerge(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1221 True, repo, wctx, mynode, orig, fcd, fco, fca, labels=labels
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1222 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1223
26607
45a6233d5f50 filemerge: introduce a premerge flag and function
Siddharth Agarwal <sid0@fb.com>
parents: 26606
diff changeset
1224
34122
c0ce60459d84 merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents: 34076
diff changeset
1225 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
1226 return _filemerge(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1227 False, repo, wctx, mynode, orig, fcd, fco, fca, labels=labels
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1228 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1229
26605
ef21a2c41629 filemerge: add a wrapper around the filemerge function
Siddharth Agarwal <sid0@fb.com>
parents: 26589
diff changeset
1230
33699
50c44dee741a filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33523
diff changeset
1231 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
1232 """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
1233 """
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
1234 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
1235 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
1236 internals[fullname] = func
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1237 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
1238 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
1239
39126
e09fad982ef5 filemerge: show actual capabilities of internal merge tools
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39125
diff changeset
1240 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
1241 if capabilities:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1242 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
1243 capabilities
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1244 )
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1245 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
1246
88c5a3ef54b1 filemerge: avoid putting translated text into docstring
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39266
diff changeset
1247 # 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
1248
39359
bc0eb1dc6aae filemerge: fix an i18n comment typo
Matt Harbison <matt_harbison@yahoo.com>
parents: 39285
diff changeset
1249 # 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
1250 # 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
1251 _(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
1252 # i18n: "binary" is keyword
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)")
39267
88c5a3ef54b1 filemerge: avoid putting translated text into docstring
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39266
diff changeset
1255 # i18n: "symlink" 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: symlink)")
39126
e09fad982ef5 filemerge: show actual capabilities of internal merge tools
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39125
diff changeset
1258
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42565
diff changeset
1259
33699
50c44dee741a filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33523
diff changeset
1260 # 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
1261 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
1262
16126
0c4bec9596d8 filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16125
diff changeset
1263 # 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
1264 i18nfunctions = internals.values()