annotate mercurial/filemerge.py @ 39284:975d959295ef

filemerge: print the filename in quotes in prompt This is better as the filename is in quotes and user can understand better what the filename is and what is important part in the prompt. Differential Revision: https://phab.mercurial-scm.org/D4373
author Pulkit Goyal <pulkit@yandex-team.ru>
date Sat, 25 Aug 2018 21:17:34 +0300
parents f785073f792c
children a3fd84f4fb38
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 _
26979
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
16 from .node import nullid, short
25949
80aba76e29c1 filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25835
diff changeset
17
80aba76e29c1 filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25835
diff changeset
18 from . import (
30636
f1c9fafcbf46 py3: replace os.environ with encoding.environ (part 3 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30538
diff changeset
19 encoding,
25949
80aba76e29c1 filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25835
diff changeset
20 error,
28955
78759f78a44e templater: factor out function that creates templater from string template
Yuya Nishihara <yuya@tcha.org>
parents: 28954
diff changeset
21 formatter,
25949
80aba76e29c1 filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25835
diff changeset
22 match,
30073
aa23c93e636d py3: make format strings unicodes and not bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29775
diff changeset
23 pycompat,
33699
50c44dee741a filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33523
diff changeset
24 registrar,
27651
07fc2f2134ba origpath: move from cmdutil to scmutil
Siddharth Agarwal <sid0@fb.com>
parents: 27599
diff changeset
25 scmutil,
25949
80aba76e29c1 filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25835
diff changeset
26 simplemerge,
80aba76e29c1 filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25835
diff changeset
27 tagmerge,
80aba76e29c1 filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25835
diff changeset
28 templatekw,
80aba76e29c1 filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25835
diff changeset
29 templater,
80aba76e29c1 filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25835
diff changeset
30 util,
80aba76e29c1 filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25835
diff changeset
31 )
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
32
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37077
diff changeset
33 from .utils import (
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
34 procutil,
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37077
diff changeset
35 stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37077
diff changeset
36 )
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37077
diff changeset
37
34826
18a3274ed675 configitems: register the full 'merge-tools' config and sub-options
Boris Feld <boris.feld@octobus.net>
parents: 34797
diff changeset
38 def _toolstr(ui, tool, part, *args):
18a3274ed675 configitems: register the full 'merge-tools' config and sub-options
Boris Feld <boris.feld@octobus.net>
parents: 34797
diff changeset
39 return ui.config("merge-tools", tool + "." + part, *args)
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
40
34826
18a3274ed675 configitems: register the full 'merge-tools' config and sub-options
Boris Feld <boris.feld@octobus.net>
parents: 34797
diff changeset
41 def _toolbool(ui, tool, part,*args):
18a3274ed675 configitems: register the full 'merge-tools' config and sub-options
Boris Feld <boris.feld@octobus.net>
parents: 34797
diff changeset
42 return ui.configbool("merge-tools", tool + "." + part, *args)
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
43
34826
18a3274ed675 configitems: register the full 'merge-tools' config and sub-options
Boris Feld <boris.feld@octobus.net>
parents: 34797
diff changeset
44 def _toollist(ui, tool, part):
18a3274ed675 configitems: register the full 'merge-tools' config and sub-options
Boris Feld <boris.feld@octobus.net>
parents: 34797
diff changeset
45 return ui.configlist("merge-tools", tool + "." + part)
11148
a912f26777d3 merge: introduce tool.check parameter
David Champion <dgc@uchicago.edu>
parents: 11146
diff changeset
46
16126
0c4bec9596d8 filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16125
diff changeset
47 internals = {}
24099
be83fd9d46d5 help.merge-tools: do not double document merge tools
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23270
diff changeset
48 # Merge tools to document.
be83fd9d46d5 help.merge-tools: do not double document merge tools
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23270
diff changeset
49 internalsdoc = {}
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
50
33699
50c44dee741a filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33523
diff changeset
51 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
52
26525
abc2327e382a filemerge: add some merge types
Siddharth Agarwal <sid0@fb.com>
parents: 26519
diff changeset
53 # 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
54 nomerge = internaltool.nomerge
50c44dee741a filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33523
diff changeset
55 mergeonly = internaltool.mergeonly # just the full merge, no premerge
50c44dee741a filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33523
diff changeset
56 fullmerge = internaltool.fullmerge # both premerge and merge
26525
abc2327e382a filemerge: add some merge types
Siddharth Agarwal <sid0@fb.com>
parents: 26519
diff changeset
57
32317
6587427b2018 filemerge: store error messages in module variables
Stanislau Hlebik <stash@fb.com>
parents: 32255
diff changeset
58 _localchangedotherdeletedmsg = _(
39284
975d959295ef filemerge: print the filename in quotes in prompt
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39277
diff changeset
59 "file '%(fd)s' was deleted in local%(l)s but was modified in other%(o)s.\n"
39277
f785073f792c merge: improve interactive one-changed one-deleted message (issue5550)
Augie Fackler <augie@google.com>
parents: 39267
diff changeset
60 "What do you want to do?\n"
32317
6587427b2018 filemerge: store error messages in module variables
Stanislau Hlebik <stash@fb.com>
parents: 32255
diff changeset
61 "use (c)hanged version, (d)elete, or leave (u)nresolved?"
6587427b2018 filemerge: store error messages in module variables
Stanislau Hlebik <stash@fb.com>
parents: 32255
diff changeset
62 "$$ &Changed $$ &Delete $$ &Unresolved")
6587427b2018 filemerge: store error messages in module variables
Stanislau Hlebik <stash@fb.com>
parents: 32255
diff changeset
63
6587427b2018 filemerge: store error messages in module variables
Stanislau Hlebik <stash@fb.com>
parents: 32255
diff changeset
64 _otherchangedlocaldeletedmsg = _(
39284
975d959295ef filemerge: print the filename in quotes in prompt
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39277
diff changeset
65 "file '%(fd)s' was deleted in other%(o)s but was modified in local%(l)s.\n"
39277
f785073f792c merge: improve interactive one-changed one-deleted message (issue5550)
Augie Fackler <augie@google.com>
parents: 39267
diff changeset
66 "What do you want to do?\n"
32317
6587427b2018 filemerge: store error messages in module variables
Stanislau Hlebik <stash@fb.com>
parents: 32255
diff changeset
67 "use (c)hanged version, leave (d)eleted, or "
6587427b2018 filemerge: store error messages in module variables
Stanislau Hlebik <stash@fb.com>
parents: 32255
diff changeset
68 "leave (u)nresolved?"
6587427b2018 filemerge: store error messages in module variables
Stanislau Hlebik <stash@fb.com>
parents: 32255
diff changeset
69 "$$ &Changed $$ &Deleted $$ &Unresolved")
6587427b2018 filemerge: store error messages in module variables
Stanislau Hlebik <stash@fb.com>
parents: 32255
diff changeset
70
26979
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
71 class absentfilectx(object):
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
72 """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
73 present in it.
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
74
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
75 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
76 other code is likely going to break with the values this returns."""
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
77 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
78 self._ctx = ctx
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
79 self._f = f
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
80
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
81 def path(self):
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
82 return self._f
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
83
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
84 def size(self):
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
85 return None
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
86
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
87 def data(self):
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
88 return None
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
89
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
90 def filenode(self):
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
91 return nullid
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
92
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
93 _customcmp = True
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
94 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
95 """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
96
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
97 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
98 """
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
99 return not (fctx.isabsent() and
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
100 fctx.ctx() == self.ctx() and
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
101 fctx.path() == self.path())
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
102
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
103 def flags(self):
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
104 return ''
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
105
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
106 def changectx(self):
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
107 return self._ctx
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
108
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
109 def isbinary(self):
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
110 return False
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
111
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
112 def isabsent(self):
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
113 return True
7b038ec6c5fd filemerge: introduce class whose objects represent files not in a context
Siddharth Agarwal <sid0@fb.com>
parents: 26967
diff changeset
114
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
115 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
116 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
117 return tool
38041
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
118 cmd = _toolstr(ui, tool, "executable", tool)
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
119 if cmd.startswith('python:'):
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
120 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
121 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
122
38041
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
123 def _quotetoolpath(cmd):
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
124 if cmd.startswith('python:'):
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
125 return cmd
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
126 return procutil.shellquote(cmd)
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
127
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
128 def findexternaltool(ui, tool):
13565
984175605311 filemerge: introduce a 'regkeyalt' merge tool variable
Steve Borho <steve@borho.org>
parents: 12788
diff changeset
129 for kn in ("regkey", "regkeyalt"):
984175605311 filemerge: introduce a 'regkeyalt' merge tool variable
Steve Borho <steve@borho.org>
parents: 12788
diff changeset
130 k = _toolstr(ui, tool, kn)
984175605311 filemerge: introduce a 'regkeyalt' merge tool variable
Steve Borho <steve@borho.org>
parents: 12788
diff changeset
131 if not k:
984175605311 filemerge: introduce a 'regkeyalt' merge tool variable
Steve Borho <steve@borho.org>
parents: 12788
diff changeset
132 continue
14230
d51630301241 rename util.lookup_reg to lookupreg
Adrian Buehlmann <adrian@cadifra.com>
parents: 14168
diff changeset
133 p = util.lookupreg(k, _toolstr(ui, tool, "regname"))
6006
3c9dbb743d20 merge: add registry look up bits to tool search
Matt Mackall <mpm@selenic.com>
parents: 6005
diff changeset
134 if p:
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
135 p = procutil.findexe(p + _toolstr(ui, tool, "regappend", ""))
6006
3c9dbb743d20 merge: add registry look up bits to tool search
Matt Mackall <mpm@selenic.com>
parents: 6005
diff changeset
136 if p:
3c9dbb743d20 merge: add registry look up bits to tool search
Matt Mackall <mpm@selenic.com>
parents: 6005
diff changeset
137 return p
15264
157d93c41c10 merge: expand environment variables and ~/ in tool.executable
Greg Ward <greg@gerg.ca>
parents: 14749
diff changeset
138 exe = _toolstr(ui, tool, "executable", tool)
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
139 return procutil.findexe(util.expandpath(exe))
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
140
27039
d7517deedf86 filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27038
diff changeset
141 def _picktool(repo, ui, path, binary, symlink, changedelete):
39125
cded904f7acc filemerge: add config knob to check capabilities of internal merge tools
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39124
diff changeset
142 strictcheck = ui.configbool('merge', 'strict-capability-check')
cded904f7acc filemerge: add config knob to check capabilities of internal merge tools
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39124
diff changeset
143
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
144 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
145 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
146 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
147 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
148
27039
d7517deedf86 filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27038
diff changeset
149 def supportscd(tool):
d7517deedf86 filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27038
diff changeset
150 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
151
d7517deedf86 filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27038
diff changeset
152 def check(tool, pat, symlink, binary, changedelete):
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
153 tmsg = tool
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
154 if pat:
32254
177742666abd filemerge: make warning message more i18n friendly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32253
diff changeset
155 tmsg = _("%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
156 if not _findtool(ui, tool):
4c92d8971809 More verbose logging when filemerge searches for merge-tool
Mads Kiilerich <mads@kiilerich.com>
parents: 6762
diff changeset
157 if pat: # explicitly requested tool deserves a warning
4c92d8971809 More verbose logging when filemerge searches for merge-tool
Mads Kiilerich <mads@kiilerich.com>
parents: 6762
diff changeset
158 ui.warn(_("couldn't find merge tool %s\n") % tmsg)
4c92d8971809 More verbose logging when filemerge searches for merge-tool
Mads Kiilerich <mads@kiilerich.com>
parents: 6762
diff changeset
159 else: # configured but non-existing tools are more silent
4c92d8971809 More verbose logging when filemerge searches for merge-tool
Mads Kiilerich <mads@kiilerich.com>
parents: 6762
diff changeset
160 ui.note(_("couldn't find merge tool %s\n") % tmsg)
39125
cded904f7acc filemerge: add config knob to check capabilities of internal merge tools
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39124
diff changeset
161 elif symlink and not hascapability(tool, "symlink", strictcheck):
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
162 ui.warn(_("tool %s can't handle symlinks\n") % tmsg)
39125
cded904f7acc filemerge: add config knob to check capabilities of internal merge tools
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39124
diff changeset
163 elif binary and not hascapability(tool, "binary", strictcheck):
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
164 ui.warn(_("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
165 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
166 # 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
167 # conflicts
d7517deedf86 filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27038
diff changeset
168 pass
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
169 elif not procutil.gui() and _toolbool(ui, tool, "gui"):
6007
090b1a665901 filemerge: add config item for GUI tools
Matt Mackall <mpm@selenic.com>
parents: 6006
diff changeset
170 ui.warn(_("tool %s requires a GUI\n") % tmsg)
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
171 else:
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
172 return True
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
173 return False
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
174
25835
34ffe4c29782 filemerge: mark internal-only config option
Matt Mackall <mpm@selenic.com>
parents: 24987
diff changeset
175 # internal config: ui.forcemerge
12788
de793925862e merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents: 12047
diff changeset
176 # forcemerge comes from command line arguments, highest priority
de793925862e merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents: 12047
diff changeset
177 force = ui.config('ui', 'forcemerge')
de793925862e merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents: 12047
diff changeset
178 if force:
de793925862e merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents: 12047
diff changeset
179 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
180 if changedelete and not supportscd(toolpath):
d7517deedf86 filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27038
diff changeset
181 return ":prompt", None
12788
de793925862e merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents: 12047
diff changeset
182 else:
27039
d7517deedf86 filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27038
diff changeset
183 if toolpath:
38041
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
184 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
185 else:
d7517deedf86 filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27038
diff changeset
186 # 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
187 return (force, force)
12788
de793925862e merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents: 12047
diff changeset
188
de793925862e merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents: 12047
diff changeset
189 # HGMERGE takes next precedence
30636
f1c9fafcbf46 py3: replace os.environ with encoding.environ (part 3 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30538
diff changeset
190 hgmerge = encoding.environ.get("HGMERGE")
6025
f2335246e5c7 filemerge: wrap quotes around tool path
Steve Borho <steve@borho.org>
parents: 6016
diff changeset
191 if hgmerge:
27039
d7517deedf86 filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27038
diff changeset
192 if changedelete and not supportscd(hgmerge):
d7517deedf86 filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27038
diff changeset
193 return ":prompt", None
d7517deedf86 filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27038
diff changeset
194 else:
d7517deedf86 filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27038
diff changeset
195 return (hgmerge, hgmerge)
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
196
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
197 # 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
198
cded904f7acc filemerge: add config knob to check capabilities of internal merge tools
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39124
diff changeset
199 # 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
200 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
201
6016
288ec2f6faa2 filemerge: fix pattern matching
dhruva <dhruvakm@gmail.com>
parents: 6015
diff changeset
202 for pat, tool in ui.configitems("merge-patterns"):
8567
fea40a677d43 match: add some default args
Matt Mackall <mpm@selenic.com>
parents: 8566
diff changeset
203 mf = match.match(repo.root, '', [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
204 if mf(path) and check(tool, pat, symlink, binarycap, changedelete):
39124
6618634e3325 filemerge: show warning if chosen tool has no binary files capability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39123
diff changeset
205 if binary and not hascapability(tool, "binary", strict=True):
6618634e3325 filemerge: show warning if chosen tool has no binary files capability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39123
diff changeset
206 ui.warn(_("warning: check merge-patterns configurations,"
6618634e3325 filemerge: show warning if chosen tool has no binary files capability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39123
diff changeset
207 " if %r for binary file %r is unintentional\n"
6618634e3325 filemerge: show warning if chosen tool has no binary files capability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39123
diff changeset
208 "(see 'hg help merge-tools'"
6618634e3325 filemerge: show warning if chosen tool has no binary files capability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39123
diff changeset
209 " for binary files capability)\n")
6618634e3325 filemerge: show warning if chosen tool has no binary files capability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39123
diff changeset
210 % (pycompat.bytestr(tool), pycompat.bytestr(path)))
10339
23e608f42f2c fix spaces/identation issues
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10282
diff changeset
211 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
212 return (tool, _quotetoolpath(toolpath))
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
213
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
214 # then merge tools
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
215 tools = {}
26730
a1e43e85d294 merge-tools: allow marking a mergetool as completely disabled
Augie Fackler <augie@google.com>
parents: 26614
diff changeset
216 disabled = set()
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
217 for k, v in ui.configitems("merge-tools"):
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
218 t = k.split('.')[0]
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
219 if t not in tools:
34826
18a3274ed675 configitems: register the full 'merge-tools' config and sub-options
Boris Feld <boris.feld@octobus.net>
parents: 34797
diff changeset
220 tools[t] = int(_toolstr(ui, t, "priority"))
18a3274ed675 configitems: register the full 'merge-tools' config and sub-options
Boris Feld <boris.feld@octobus.net>
parents: 34797
diff changeset
221 if _toolbool(ui, t, "disabled"):
26730
a1e43e85d294 merge-tools: allow marking a mergetool as completely disabled
Augie Fackler <augie@google.com>
parents: 26614
diff changeset
222 disabled.add(t)
6076
0ee885fea464 filemerge: more backwards compatible behavior for ui.merge
Steve Borho <steve@borho.org>
parents: 6075
diff changeset
223 names = tools.keys()
30388
8819b63732b9 filemerge: avoid shadowing a variable in a list comprehension
Augie Fackler <augie@google.com>
parents: 30073
diff changeset
224 tools = sorted([(-p, tool) for tool, p in tools.items()
8819b63732b9 filemerge: avoid shadowing a variable in a list comprehension
Augie Fackler <augie@google.com>
parents: 30073
diff changeset
225 if tool not in disabled])
6076
0ee885fea464 filemerge: more backwards compatible behavior for ui.merge
Steve Borho <steve@borho.org>
parents: 6075
diff changeset
226 uimerge = ui.config("ui", "merge")
0ee885fea464 filemerge: more backwards compatible behavior for ui.merge
Steve Borho <steve@borho.org>
parents: 6075
diff changeset
227 if uimerge:
27039
d7517deedf86 filemerge._picktool: only pick from nomerge tools for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27038
diff changeset
228 # 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
229 # change/delete conflicts
38952
0e58c5b20745 mergetool: warn if ui.merge points to nonexistent tool
Martin von Zweigbergk <martinvonz@google.com>
parents: 38793
diff changeset
230 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
231 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
232 return (uimerge, uimerge)
0e58c5b20745 mergetool: warn if ui.merge points to nonexistent tool
Martin von Zweigbergk <martinvonz@google.com>
parents: 38793
diff changeset
233 tools.insert(0, (None, uimerge)) # highest priority
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
234 tools.append((None, "hgmerge")) # the old default, if found
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
235 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
236 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
237 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
238 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
239
c7eef052c9e3 filemerge: restore default prompt for binary/symlink lost in 83925d3a4559
Matt Mackall <mpm@selenic.com>
parents: 16205
diff changeset
240 # 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
241 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
242 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
243 # any tool is rejected by capability for symlink or binary
7d4ce4b567c5 filemerge: show warning about choice of :prompt only at an actual fallback
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32047
diff changeset
244 ui.warn(_("no tool found to merge %s\n") % path)
22707
38e0363dcbe0 filemerge: switch the default name for internal tools from internal:x to :x
Mads Kiilerich <madski@unity3d.com>
parents: 22706
diff changeset
245 return ":prompt", None
38e0363dcbe0 filemerge: switch the default name for internal tools from internal:x to :x
Mads Kiilerich <madski@unity3d.com>
parents: 22706
diff changeset
246 return ":merge", None
6003
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
247
6005
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
248 def _eoltype(data):
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
249 "Guess the EOL type of a file"
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
250 if '\0' in data: # binary
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
251 return None
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
252 if '\r\n' in data: # Windows
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
253 return '\r\n'
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
254 if '\r' in data: # Old Mac
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
255 return '\r'
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
256 if '\n' in data: # UNIX
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
257 return '\n'
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
258 return None # unknown
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
259
34782
f21eecc64ace filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents: 34506
diff changeset
260 def _matcheol(file, back):
6005
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
261 "Convert EOL markers in a file to match origfile"
34782
f21eecc64ace filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents: 34506
diff changeset
262 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
263 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
264 data = util.readfile(file)
6005
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
265 style = _eoltype(data)
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
266 if style:
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
267 newdata = data.replace(style, tostyle)
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
268 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
269 util.writefile(file, newdata)
6005
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
270
26526
7fa3560443fd filemerge: switch trymerge boolean to mergetype enum
Siddharth Agarwal <sid0@fb.com>
parents: 26525
diff changeset
271 @internaltool('prompt', nomerge)
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
272 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
273 """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
274 keep as the merged version."""
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
275 ui = repo.ui
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
276 fd = fcd.path()
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
277
35282
46d7f0713a87 filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents: 35281
diff changeset
278 # 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
279 # conflicts.
46d7f0713a87 filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents: 35281
diff changeset
280 if fcd.changectx().isinmemory():
46d7f0713a87 filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents: 35281
diff changeset
281 raise error.InMemoryMergeConflictsError('in-memory merge does not '
46d7f0713a87 filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents: 35281
diff changeset
282 'support file conflicts')
46d7f0713a87 filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents: 35281
diff changeset
283
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
284 prompts = partextras(labels)
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
285 prompts['fd'] = fd
26898
33eb8a56d0c9 filemerge: treat EOF at prompt as fail, not abort
Siddharth Agarwal <sid0@fb.com>
parents: 26893
diff changeset
286 try:
27038
58a4eb16e722 filemerge: add support for change/delete conflicts to the ':prompt' tool
Siddharth Agarwal <sid0@fb.com>
parents: 27037
diff changeset
287 if fco.isabsent():
58a4eb16e722 filemerge: add support for change/delete conflicts to the ':prompt' tool
Siddharth Agarwal <sid0@fb.com>
parents: 27037
diff changeset
288 index = ui.promptchoice(
32317
6587427b2018 filemerge: store error messages in module variables
Stanislau Hlebik <stash@fb.com>
parents: 32255
diff changeset
289 _localchangedotherdeletedmsg % prompts, 2)
27163
27b89a0957ec filemerge: add a 'leave unresolved' option to change/delete prompts
Siddharth Agarwal <sid0@fb.com>
parents: 27162
diff changeset
290 choice = ['local', 'other', 'unresolved'][index]
27038
58a4eb16e722 filemerge: add support for change/delete conflicts to the ':prompt' tool
Siddharth Agarwal <sid0@fb.com>
parents: 27037
diff changeset
291 elif fcd.isabsent():
58a4eb16e722 filemerge: add support for change/delete conflicts to the ':prompt' tool
Siddharth Agarwal <sid0@fb.com>
parents: 27037
diff changeset
292 index = ui.promptchoice(
32317
6587427b2018 filemerge: store error messages in module variables
Stanislau Hlebik <stash@fb.com>
parents: 32255
diff changeset
293 _otherchangedlocaldeletedmsg % prompts, 2)
27163
27b89a0957ec filemerge: add a 'leave unresolved' option to change/delete prompts
Siddharth Agarwal <sid0@fb.com>
parents: 27162
diff changeset
294 choice = ['other', 'local', 'unresolved'][index]
27038
58a4eb16e722 filemerge: add support for change/delete conflicts to the ':prompt' tool
Siddharth Agarwal <sid0@fb.com>
parents: 27037
diff changeset
295 else:
27162
4ab69be0ea15 filemerge: add a 'leave unresolved' option to regular prompts
Siddharth Agarwal <sid0@fb.com>
parents: 27161
diff changeset
296 index = ui.promptchoice(
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
297 _("keep (l)ocal%(l)s, take (o)ther%(o)s, or leave (u)nresolved"
7d4ce4b567c5 filemerge: show warning about choice of :prompt only at an actual fallback
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32047
diff changeset
298 " for %(fd)s?"
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
299 "$$ &Local $$ &Other $$ &Unresolved") % prompts, 2)
27162
4ab69be0ea15 filemerge: add a 'leave unresolved' option to regular prompts
Siddharth Agarwal <sid0@fb.com>
parents: 27161
diff changeset
300 choice = ['local', 'other', 'unresolved'][index]
26851
859f453e8b4e filemerge.prompt: separate out choice selection and action
Siddharth Agarwal <sid0@fb.com>
parents: 26730
diff changeset
301
26898
33eb8a56d0c9 filemerge: treat EOF at prompt as fail, not abort
Siddharth Agarwal <sid0@fb.com>
parents: 26893
diff changeset
302 if choice == 'other':
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
303 return _iother(repo, mynode, orig, fcd, fco, fca, toolconf,
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
304 labels)
27162
4ab69be0ea15 filemerge: add a 'leave unresolved' option to regular prompts
Siddharth Agarwal <sid0@fb.com>
parents: 27161
diff changeset
305 elif choice == 'local':
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
306 return _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf,
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
307 labels)
27162
4ab69be0ea15 filemerge: add a 'leave unresolved' option to regular prompts
Siddharth Agarwal <sid0@fb.com>
parents: 27161
diff changeset
308 elif choice == 'unresolved':
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
309 return _ifail(repo, mynode, orig, fcd, fco, fca, toolconf,
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
310 labels)
26898
33eb8a56d0c9 filemerge: treat EOF at prompt as fail, not abort
Siddharth Agarwal <sid0@fb.com>
parents: 26893
diff changeset
311 except error.ResponseExpected:
33eb8a56d0c9 filemerge: treat EOF at prompt as fail, not abort
Siddharth Agarwal <sid0@fb.com>
parents: 26893
diff changeset
312 ui.write("\n")
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
313 return _ifail(repo, mynode, orig, fcd, fco, fca, toolconf,
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
314 labels)
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
315
26526
7fa3560443fd filemerge: switch trymerge boolean to mergetype enum
Siddharth Agarwal <sid0@fb.com>
parents: 26525
diff changeset
316 @internaltool('local', nomerge)
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
317 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
318 """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
319 return 0, fcd.isabsent()
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
320
26526
7fa3560443fd filemerge: switch trymerge boolean to mergetype enum
Siddharth Agarwal <sid0@fb.com>
parents: 26525
diff changeset
321 @internaltool('other', nomerge)
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
322 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
323 """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
324 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
325 # 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
326 _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
327 deleted = True
a8908c139f2f filemerge: add support for change/delete conflicts to the ':other' merge tool
Siddharth Agarwal <sid0@fb.com>
parents: 27036
diff changeset
328 else:
33151
851825214aa3 filemerge: convert a couple of wvfs calls in internal mergetools to contexts
Phil Cohen <phillco@fb.com>
parents: 32873
diff changeset
329 _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
330 deleted = False
a8908c139f2f filemerge: add support for change/delete conflicts to the ':other' merge tool
Siddharth Agarwal <sid0@fb.com>
parents: 27036
diff changeset
331 return 0, deleted
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
332
26526
7fa3560443fd filemerge: switch trymerge boolean to mergetype enum
Siddharth Agarwal <sid0@fb.com>
parents: 26525
diff changeset
333 @internaltool('fail', nomerge)
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
334 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
335 """
16126
0c4bec9596d8 filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16125
diff changeset
336 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
337 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
338 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
339 # 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
340 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
341 _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
342 return 1, False
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
343
33151
851825214aa3 filemerge: convert a couple of wvfs calls in internal mergetools to contexts
Phil Cohen <phillco@fb.com>
parents: 32873
diff changeset
344 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
345 """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
346 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
347 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
348 """
851825214aa3 filemerge: convert a couple of wvfs calls in internal mergetools to contexts
Phil Cohen <phillco@fb.com>
parents: 32873
diff changeset
349 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
350 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
351 else:
851825214aa3 filemerge: convert a couple of wvfs calls in internal mergetools to contexts
Phil Cohen <phillco@fb.com>
parents: 32873
diff changeset
352 return filectx
851825214aa3 filemerge: convert a couple of wvfs calls in internal mergetools to contexts
Phil Cohen <phillco@fb.com>
parents: 32873
diff changeset
353
27041
0e330f59ef68 filemerge: don't attempt to premerge change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27040
diff changeset
354 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
355 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
356 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
357 return 1
34032
67cfffbfb6a0 filemerge: eliminate most uses of tempfiles
Phil Cohen <phillco@fb.com>
parents: 34031
diff changeset
358 unused, unused, unused, back = files
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
359
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
360 ui = repo.ui
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
361
22032
d7f25834ffbb merge-tools: add a `premerge=keep-merge3` config option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22031
diff changeset
362 validkeep = ['keep', 'keep-merge3']
22031
b36c60cfe46f merge-tools: make premerge valid values extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22028
diff changeset
363
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
364 # do we attempt to simplemerge first?
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
365 try:
18257
a35d0128545e merge: never do premerge on symlinks
Mads Kiilerich <mads@kiilerich.com>
parents: 18256
diff changeset
366 premerge = _toolbool(ui, tool, "premerge", not binary)
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
367 except error.ConfigError:
34826
18a3274ed675 configitems: register the full 'merge-tools' config and sub-options
Boris Feld <boris.feld@octobus.net>
parents: 34797
diff changeset
368 premerge = _toolstr(ui, tool, "premerge", "").lower()
22031
b36c60cfe46f merge-tools: make premerge valid values extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22028
diff changeset
369 if premerge not in validkeep:
b36c60cfe46f merge-tools: make premerge valid values extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22028
diff changeset
370 _valid = ', '.join(["'" + v + "'" for v in validkeep])
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
371 raise error.ConfigError(_("%s.premerge not valid "
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
372 "('%s' is neither boolean nor %s)") %
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
373 (tool, premerge, _valid))
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
374
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
375 if premerge:
22032
d7f25834ffbb merge-tools: add a `premerge=keep-merge3` config option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22031
diff changeset
376 if premerge == 'keep-merge3':
d7f25834ffbb merge-tools: add a `premerge=keep-merge3` config option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22031
diff changeset
377 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
378 labels = _defaultconflictlabels
d7f25834ffbb merge-tools: add a `premerge=keep-merge3` config option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22031
diff changeset
379 if len(labels) < 3:
d7f25834ffbb merge-tools: add a `premerge=keep-merge3` config option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22031
diff changeset
380 labels.append('base')
34049
6330df9d6393 simplemerge: remove unused `repo` parameter
Phil Cohen <phillco@fb.com>
parents: 34036
diff changeset
381 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
382 if not r:
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
383 ui.debug(" premerge successful\n")
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
384 return 0
22031
b36c60cfe46f merge-tools: make premerge valid values extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22028
diff changeset
385 if premerge not in validkeep:
34032
67cfffbfb6a0 filemerge: eliminate most uses of tempfiles
Phil Cohen <phillco@fb.com>
parents: 34031
diff changeset
386 # restore from backup and try again
34036
fe04c018eaac filemerge: add _restorebackup
Phil Cohen <phillco@fb.com>
parents: 34035
diff changeset
387 _restorebackup(fcd, back)
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
388 return 1 # continue merging
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
389
26948
067ab07435c9 filemerge: rename _symlinkcheck to _mergecheck
Siddharth Agarwal <sid0@fb.com>
parents: 26941
diff changeset
390 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
391 tool, toolpath, binary, symlink, scriptfn = toolconf
26515
0ffa7fe1076b filemerge: add a precheck for symlinks
Siddharth Agarwal <sid0@fb.com>
parents: 26514
diff changeset
392 if symlink:
26518
a77679d0b887 filemerge: print correct name of tool for symlink checks
Siddharth Agarwal <sid0@fb.com>
parents: 26517
diff changeset
393 repo.ui.warn(_('warning: internal %s cannot merge symlinks '
a77679d0b887 filemerge: print correct name of tool for symlink checks
Siddharth Agarwal <sid0@fb.com>
parents: 26517
diff changeset
394 'for %s\n') % (tool, fcd.path()))
26515
0ffa7fe1076b filemerge: add a precheck for symlinks
Siddharth Agarwal <sid0@fb.com>
parents: 26514
diff changeset
395 return False
27040
1bde66b89bb2 filemerge._mergecheck: add check for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27039
diff changeset
396 if fcd.isabsent() or fco.isabsent():
1bde66b89bb2 filemerge._mergecheck: add check for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27039
diff changeset
397 repo.ui.warn(_('warning: internal %s cannot merge change/delete '
1bde66b89bb2 filemerge._mergecheck: add check for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27039
diff changeset
398 'conflict for %s\n') % (tool, fcd.path()))
1bde66b89bb2 filemerge._mergecheck: add check for change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27039
diff changeset
399 return False
26515
0ffa7fe1076b filemerge: add a precheck for symlinks
Siddharth Agarwal <sid0@fb.com>
parents: 26514
diff changeset
400 return True
0ffa7fe1076b filemerge: add a precheck for symlinks
Siddharth Agarwal <sid0@fb.com>
parents: 26514
diff changeset
401
26070
e15966216aec filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents: 25949
diff changeset
402 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
403 """
16126
0c4bec9596d8 filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16125
diff changeset
404 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
405 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
406 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
407 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
408 ui = repo.ui
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
409
34049
6330df9d6393 simplemerge: remove unused `repo` parameter
Phil Cohen <phillco@fb.com>
parents: 34036
diff changeset
410 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
411 return True, r, False
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
412
26526
7fa3560443fd filemerge: switch trymerge boolean to mergetype enum
Siddharth Agarwal <sid0@fb.com>
parents: 26525
diff changeset
413 @internaltool('union', fullmerge,
26614
ef1eb6df7071 simplemerge: move conflict warning message to filemerge
Siddharth Agarwal <sid0@fb.com>
parents: 26613
diff changeset
414 _("warning: conflicts while merging %s! "
ef1eb6df7071 simplemerge: move conflict warning message to filemerge
Siddharth Agarwal <sid0@fb.com>
parents: 26613
diff changeset
415 "(edit, then use 'hg resolve --mark')\n"),
26948
067ab07435c9 filemerge: rename _symlinkcheck to _mergecheck
Siddharth Agarwal <sid0@fb.com>
parents: 26941
diff changeset
416 precheck=_mergecheck)
26071
ff12a6c63c3d filemerge: add 'union' merge to internal merge tool
Erik Huelsmann <ehuels@gmail.com>
parents: 26070
diff changeset
417 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
418 """
ff12a6c63c3d filemerge: add 'union' merge to internal merge tool
Erik Huelsmann <ehuels@gmail.com>
parents: 26070
diff changeset
419 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
420 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
421 No markers are inserted."""
ff12a6c63c3d filemerge: add 'union' merge to internal merge tool
Erik Huelsmann <ehuels@gmail.com>
parents: 26070
diff changeset
422 return _merge(repo, mynode, orig, fcd, fco, fca, toolconf,
ff12a6c63c3d filemerge: add 'union' merge to internal merge tool
Erik Huelsmann <ehuels@gmail.com>
parents: 26070
diff changeset
423 files, labels, 'union')
ff12a6c63c3d filemerge: add 'union' merge to internal merge tool
Erik Huelsmann <ehuels@gmail.com>
parents: 26070
diff changeset
424
26526
7fa3560443fd filemerge: switch trymerge boolean to mergetype enum
Siddharth Agarwal <sid0@fb.com>
parents: 26525
diff changeset
425 @internaltool('merge', fullmerge,
26614
ef1eb6df7071 simplemerge: move conflict warning message to filemerge
Siddharth Agarwal <sid0@fb.com>
parents: 26613
diff changeset
426 _("warning: conflicts while merging %s! "
ef1eb6df7071 simplemerge: move conflict warning message to filemerge
Siddharth Agarwal <sid0@fb.com>
parents: 26613
diff changeset
427 "(edit, then use 'hg resolve --mark')\n"),
26948
067ab07435c9 filemerge: rename _symlinkcheck to _mergecheck
Siddharth Agarwal <sid0@fb.com>
parents: 26941
diff changeset
428 precheck=_mergecheck)
26070
e15966216aec filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents: 25949
diff changeset
429 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
430 """
e15966216aec filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents: 25949
diff changeset
431 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
432 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
433 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
434 of merge."""
e15966216aec filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents: 25949
diff changeset
435 return _merge(repo, mynode, orig, fcd, fco, fca, toolconf,
e15966216aec filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents: 25949
diff changeset
436 files, labels, 'merge')
e15966216aec filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents: 25949
diff changeset
437
26526
7fa3560443fd filemerge: switch trymerge boolean to mergetype enum
Siddharth Agarwal <sid0@fb.com>
parents: 26525
diff changeset
438 @internaltool('merge3', fullmerge,
26614
ef1eb6df7071 simplemerge: move conflict warning message to filemerge
Siddharth Agarwal <sid0@fb.com>
parents: 26613
diff changeset
439 _("warning: conflicts while merging %s! "
ef1eb6df7071 simplemerge: move conflict warning message to filemerge
Siddharth Agarwal <sid0@fb.com>
parents: 26613
diff changeset
440 "(edit, then use 'hg resolve --mark')\n"),
26948
067ab07435c9 filemerge: rename _symlinkcheck to _mergecheck
Siddharth Agarwal <sid0@fb.com>
parents: 26941
diff changeset
441 precheck=_mergecheck)
22028
3d0572ab3b4a merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 22027
diff changeset
442 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
443 """
3d0572ab3b4a merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 22027
diff changeset
444 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
445 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
446 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
447 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
448 if not labels:
3d0572ab3b4a merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 22027
diff changeset
449 labels = _defaultconflictlabels
3d0572ab3b4a merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 22027
diff changeset
450 if len(labels) < 3:
3d0572ab3b4a merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 22027
diff changeset
451 labels.append('base')
3d0572ab3b4a merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 22027
diff changeset
452 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
453
26224
a4da463df6cf filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 26071
diff changeset
454 def _imergeauto(repo, mynode, orig, fcd, fco, fca, toolconf, files,
a4da463df6cf filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 26071
diff changeset
455 labels=None, localorother=None):
a4da463df6cf filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 26071
diff changeset
456 """
a4da463df6cf filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 26071
diff changeset
457 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
458 """
a4da463df6cf filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 26071
diff changeset
459 assert localorother is not None
38041
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
460 tool, toolpath, binary, symlink, scriptfn = toolconf
34049
6330df9d6393 simplemerge: remove unused `repo` parameter
Phil Cohen <phillco@fb.com>
parents: 34036
diff changeset
461 r = simplemerge.simplemerge(repo.ui, fcd, fca, fco, label=labels,
6330df9d6393 simplemerge: remove unused `repo` parameter
Phil Cohen <phillco@fb.com>
parents: 34036
diff changeset
462 localorother=localorother)
26224
a4da463df6cf filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 26071
diff changeset
463 return True, r
a4da463df6cf filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 26071
diff changeset
464
26948
067ab07435c9 filemerge: rename _symlinkcheck to _mergecheck
Siddharth Agarwal <sid0@fb.com>
parents: 26941
diff changeset
465 @internaltool('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
466 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
467 """
a4da463df6cf filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 26071
diff changeset
468 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
469 of the local `p1()` changes."""
26224
a4da463df6cf filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 26071
diff changeset
470 success, status = _imergeauto(localorother='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
471 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
472
26948
067ab07435c9 filemerge: rename _symlinkcheck to _mergecheck
Siddharth Agarwal <sid0@fb.com>
parents: 26941
diff changeset
473 @internaltool('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
474 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
475 """
a4da463df6cf filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 26071
diff changeset
476 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
477 of the other `p2()` changes."""
26224
a4da463df6cf filemerge: add non-interactive :merge-local and :merge-other
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 26071
diff changeset
478 success, status = _imergeauto(localorother='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
479 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
480
26526
7fa3560443fd filemerge: switch trymerge boolean to mergetype enum
Siddharth Agarwal <sid0@fb.com>
parents: 26525
diff changeset
481 @internaltool('tagmerge', mergeonly,
21922
50e20154cb68 filemerge: add internal:tagmerge merge tool
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21921
diff changeset
482 _("automatic tag merging of %s failed! "
22707
38e0363dcbe0 filemerge: switch the default name for internal tools from internal:x to :x
Mads Kiilerich <madski@unity3d.com>
parents: 22706
diff changeset
483 "(use 'hg resolve --tool :merge' or another merge "
21922
50e20154cb68 filemerge: add internal:tagmerge merge tool
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21921
diff changeset
484 "tool of your choice)\n"))
50e20154cb68 filemerge: add internal:tagmerge merge tool
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21921
diff changeset
485 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
486 """
50e20154cb68 filemerge: add internal:tagmerge merge tool
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21921
diff changeset
487 Uses the internal tag merge algorithm (experimental).
50e20154cb68 filemerge: add internal:tagmerge merge tool
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21921
diff changeset
488 """
27033
089dab8794dc filemerge: return whether the file is deleted from all other merge tools
Siddharth Agarwal <sid0@fb.com>
parents: 27032
diff changeset
489 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
490 return success, status, False
21922
50e20154cb68 filemerge: add internal:tagmerge merge tool
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21921
diff changeset
491
39122
5d3b58472660 filemerge: set actual capabilities of internal merge tools
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 38952
diff changeset
492 @internaltool('dump', fullmerge, binary=True, symlink=True)
21273
20b8090d8125 merge: define conflict marker labels in filemerge()
Durham Goode <durham@fb.com>
parents: 21100
diff changeset
493 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
494 """
16126
0c4bec9596d8 filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16125
diff changeset
495 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
496 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
497 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
498 ``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
499 ``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
500 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
501
34915
cab34bda259e help: fix typo in hg merge documentation
Joe Blaylock <jrbl@google.com>
parents: 34826
diff changeset
502 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
503 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
504 """
34034
7558917f291e filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents: 34033
diff changeset
505 a = _workingpath(repo, fcd)
26573
a875773cf537 filemerge._idump: drop no longer necessary 'if r:' check
Siddharth Agarwal <sid0@fb.com>
parents: 26572
diff changeset
506 fd = fcd.path()
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
507
34785
1af4561b6bfe filemerge: add a missing flushall()
Phil Cohen <phillco@fb.com>
parents: 34784
diff changeset
508 from . import context
1af4561b6bfe filemerge: add a missing flushall()
Phil Cohen <phillco@fb.com>
parents: 34784
diff changeset
509 if isinstance(fcd, context.overlayworkingfilectx):
35282
46d7f0713a87 filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents: 35281
diff changeset
510 raise error.InMemoryMergeConflictsError('in-memory merge does not '
46d7f0713a87 filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents: 35281
diff changeset
511 'support the :dump tool.')
34785
1af4561b6bfe filemerge: add a missing flushall()
Phil Cohen <phillco@fb.com>
parents: 34784
diff changeset
512
34076
cd38b83bfb23 filemerge: use fctx.write() in the internal:dump tool, instead of copy
Phil Cohen <phillco@fb.com>
parents: 34049
diff changeset
513 util.writefile(a + ".local", fcd.decodeddata())
26573
a875773cf537 filemerge._idump: drop no longer necessary 'if r:' check
Siddharth Agarwal <sid0@fb.com>
parents: 26572
diff changeset
514 repo.wwrite(fd + ".other", fco.data(), fco.flags())
a875773cf537 filemerge._idump: drop no longer necessary 'if r:' check
Siddharth Agarwal <sid0@fb.com>
parents: 26572
diff changeset
515 repo.wwrite(fd + ".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
516 return False, 1, False
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
517
39122
5d3b58472660 filemerge: set actual capabilities of internal merge tools
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 38952
diff changeset
518 @internaltool('forcedump', mergeonly, binary=True, symlink=True)
32255
7e35d31b41fd filemerge: add internal merge tool to dump files forcibly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32254
diff changeset
519 def _forcedump(repo, mynode, orig, fcd, fco, fca, toolconf, files,
7e35d31b41fd filemerge: add internal merge tool to dump files forcibly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32254
diff changeset
520 labels=None):
7e35d31b41fd filemerge: add internal merge tool to dump files forcibly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32254
diff changeset
521 """
7e35d31b41fd filemerge: add internal merge tool to dump files forcibly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32254
diff changeset
522 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
523 """
7e35d31b41fd filemerge: add internal merge tool to dump files forcibly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32254
diff changeset
524 return _idump(repo, mynode, orig, fcd, fco, fca, toolconf, files,
7e35d31b41fd filemerge: add internal merge tool to dump files forcibly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32254
diff changeset
525 labels=labels)
7e35d31b41fd filemerge: add internal merge tool to dump files forcibly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32254
diff changeset
526
35463
ef7e667a4f7b filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents: 35282
diff changeset
527 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
528 # 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
529 # for now.
ef7e667a4f7b filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents: 35282
diff changeset
530 #
ef7e667a4f7b filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents: 35282
diff changeset
531 # 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
532 # 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
533 # 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
534 # 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
535 # clunky.)
ef7e667a4f7b filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents: 35282
diff changeset
536 raise error.InMemoryMergeConflictsError('in-memory merge does not support '
ef7e667a4f7b filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents: 35282
diff changeset
537 'external merge tools')
ef7e667a4f7b filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents: 35282
diff changeset
538
21273
20b8090d8125 merge: define conflict marker labels in filemerge()
Durham Goode <durham@fb.com>
parents: 21100
diff changeset
539 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
540 tool, toolpath, binary, symlink, scriptfn = toolconf
27042
30b919bc49bf filemerge: don't try using external tools on change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27041
diff changeset
541 if fcd.isabsent() or fco.isabsent():
30b919bc49bf filemerge: don't try using external tools on change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27041
diff changeset
542 repo.ui.warn(_('warning: %s cannot merge change/delete conflict '
30b919bc49bf filemerge: don't try using external tools on change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27041
diff changeset
543 'for %s\n') % (tool, fcd.path()))
30b919bc49bf filemerge: don't try using external tools on change/delete conflicts
Siddharth Agarwal <sid0@fb.com>
parents: 27041
diff changeset
544 return False, 1, None
34035
96123bdea43e filemerge: reduce creation of tempfiles until needed
Phil Cohen <phillco@fb.com>
parents: 34034
diff changeset
545 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
546 localpath = _workingpath(repo, fcd)
37077
1e30a26a65d0 filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents: 36999
diff changeset
547 args = _toolstr(repo.ui, tool, "args")
1e30a26a65d0 filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents: 36999
diff changeset
548
1e30a26a65d0 filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents: 36999
diff changeset
549 with _maketempfiles(repo, fco, fca, repo.wvfs.join(back.path()),
1e30a26a65d0 filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents: 36999
diff changeset
550 "$output" in args) as temppaths:
1e30a26a65d0 filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents: 36999
diff changeset
551 basepath, otherpath, localoutputpath = temppaths
36976
a4a95bd7158d filemerge: give some variables in _xmerge more descriptive names
Kyle Lippincott <spectral@google.com>
parents: 36835
diff changeset
552 outpath = ""
35907
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
553 mylabel, otherlabel = labels[:2]
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
554 if len(labels) >= 3:
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
555 baselabel = labels[2]
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
556 else:
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
557 baselabel = 'base'
34035
96123bdea43e filemerge: reduce creation of tempfiles until needed
Phil Cohen <phillco@fb.com>
parents: 34034
diff changeset
558 env = {'HG_FILE': fcd.path(),
96123bdea43e filemerge: reduce creation of tempfiles until needed
Phil Cohen <phillco@fb.com>
parents: 34034
diff changeset
559 'HG_MY_NODE': short(mynode),
36424
3ab9d74dd1c5 filemerge: do what the context __bytes__ does, but locally
Augie Fackler <augie@google.com>
parents: 35907
diff changeset
560 'HG_OTHER_NODE': short(fco.changectx().node()),
3ab9d74dd1c5 filemerge: do what the context __bytes__ does, but locally
Augie Fackler <augie@google.com>
parents: 35907
diff changeset
561 'HG_BASE_NODE': short(fca.changectx().node()),
34035
96123bdea43e filemerge: reduce creation of tempfiles until needed
Phil Cohen <phillco@fb.com>
parents: 34034
diff changeset
562 'HG_MY_ISLINK': 'l' in fcd.flags(),
96123bdea43e filemerge: reduce creation of tempfiles until needed
Phil Cohen <phillco@fb.com>
parents: 34034
diff changeset
563 'HG_OTHER_ISLINK': 'l' in fco.flags(),
96123bdea43e filemerge: reduce creation of tempfiles until needed
Phil Cohen <phillco@fb.com>
parents: 34034
diff changeset
564 'HG_BASE_ISLINK': 'l' in fca.flags(),
35907
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
565 'HG_MY_LABEL': mylabel,
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
566 'HG_OTHER_LABEL': otherlabel,
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
567 'HG_BASE_LABEL': baselabel,
34035
96123bdea43e filemerge: reduce creation of tempfiles until needed
Phil Cohen <phillco@fb.com>
parents: 34034
diff changeset
568 }
96123bdea43e filemerge: reduce creation of tempfiles until needed
Phil Cohen <phillco@fb.com>
parents: 34034
diff changeset
569 ui = repo.ui
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
570
34035
96123bdea43e filemerge: reduce creation of tempfiles until needed
Phil Cohen <phillco@fb.com>
parents: 34034
diff changeset
571 if "$output" in args:
34782
f21eecc64ace filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents: 34506
diff changeset
572 # 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
573 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
574 localpath = localoutputpath
36976
a4a95bd7158d filemerge: give some variables in _xmerge more descriptive names
Kyle Lippincott <spectral@google.com>
parents: 36835
diff changeset
575 replace = {'local': localpath, 'base': basepath, 'other': otherpath,
a4a95bd7158d filemerge: give some variables in _xmerge more descriptive names
Kyle Lippincott <spectral@google.com>
parents: 36835
diff changeset
576 'output': outpath, 'labellocal': mylabel,
a4a95bd7158d filemerge: give some variables in _xmerge more descriptive names
Kyle Lippincott <spectral@google.com>
parents: 36835
diff changeset
577 'labelother': otherlabel, 'labelbase': baselabel}
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
578 args = util.interpolate(
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
579 br'\$', replace, args,
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
580 lambda s: procutil.shellquote(util.localpath(s)))
34035
96123bdea43e filemerge: reduce creation of tempfiles until needed
Phil Cohen <phillco@fb.com>
parents: 34034
diff changeset
581 if _toolbool(ui, tool, "gui"):
96123bdea43e filemerge: reduce creation of tempfiles until needed
Phil Cohen <phillco@fb.com>
parents: 34034
diff changeset
582 repo.ui.status(_('running merge tool %s for file %s\n') %
96123bdea43e filemerge: reduce creation of tempfiles until needed
Phil Cohen <phillco@fb.com>
parents: 34034
diff changeset
583 (tool, fcd.path()))
38041
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
584 if scriptfn is None:
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
585 cmd = toolpath + ' ' + args
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
586 repo.ui.debug('launching merge tool: %s\n' % cmd)
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
587 r = ui.system(cmd, cwd=repo.root, environ=env,
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
588 blockedtag='mergetool')
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
589 else:
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
590 repo.ui.debug('launching python merge script: %s:%s\n' %
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
591 (toolpath, scriptfn))
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
592 r = 0
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
593 try:
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
594 # 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
595 from . import extensions
38159
dea3903175ee filemerge: don't pass function name as loadpath's module_name param
hindlemail <tom_hindle@sil.org>
parents: 38041
diff changeset
596 mod = extensions.loadpath(toolpath, 'hgmerge.%s' % tool)
38041
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
597 except Exception:
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
598 raise error.Abort(_("loading python merge script failed: %s") %
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
599 toolpath)
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
600 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
601 if mergefn is None:
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
602 raise error.Abort(_("%s does not have function: %s") %
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
603 (toolpath, scriptfn))
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
604 argslist = procutil.shellsplit(args)
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
605 # 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
606 from . import hook
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
607 ret, raised = hook.pythonhook(ui, repo, "merge", toolpath,
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
608 mergefn, {'args': argslist}, True)
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
609 if raised:
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
610 r = 1
34506
1d804c22c671 py3: use '%d' for integers instead of '%s'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34123
diff changeset
611 repo.ui.debug('merge tool returned: %d\n' % r)
34035
96123bdea43e filemerge: reduce creation of tempfiles until needed
Phil Cohen <phillco@fb.com>
parents: 34034
diff changeset
612 return True, r, False
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
613
35482
c240657febb7 templater: drop unneeded resources from conflict-marker data
Yuya Nishihara <yuya@tcha.org>
parents: 35469
diff changeset
614 def _formatconflictmarker(ctx, template, label, pad):
21519
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
615 """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
616
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
617 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
618 can have aligned templated parts.
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
619 """
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
620 if ctx.node() is None:
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
621 ctx = ctx.p1()
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
622
35483
817a3d20dd01 templater: register keywords to defaults table
Yuya Nishihara <yuya@tcha.org>
parents: 35482
diff changeset
623 props = {'ctx': ctx}
36988
317382151ac3 templater: rename .render(mapping) to .renderdefault(mapping) (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36976
diff changeset
624 templateresult = template.renderdefault(props)
21519
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
625
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
626 label = ('%s:' % label).ljust(pad + 1)
32873
2ecce24dfcd3 templater: add simple interface for unnamed template (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32753
diff changeset
627 mark = '%s %s' % (label, templateresult)
21519
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
628
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
629 if mark:
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
630 mark = mark.splitlines()[0] # split for safety
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
631
21865
78e56e70c70a filemerge: use 'util.ellipsis' to trim custom conflict markers correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21864
diff changeset
632 # 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
633 return stringutil.ellipsis(mark, 80 - 8)
21519
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
634
21524
47b97d9af27e merge: add labels parameter from merge.update to filemerge
Durham Goode <durham@fb.com>
parents: 21519
diff changeset
635 _defaultconflictlabels = ['local', 'other']
47b97d9af27e merge: add labels parameter from merge.update to filemerge
Durham Goode <durham@fb.com>
parents: 21519
diff changeset
636
35907
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
637 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
638 """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
639
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
640 Returns a list of formatted labels.
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
641 """
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
642 cd = fcd.changectx()
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
643 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
644 ca = fca.changectx()
21519
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
645
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
646 ui = repo.ui
33523
11025c4f1016 configitems: register the 'ui.mergemarkertemplate' config
Boris Feld <boris.feld@octobus.net>
parents: 33499
diff changeset
647 template = ui.config('ui', 'mergemarkertemplate')
35907
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
648 if tool is not None:
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
649 template = _toolstr(ui, tool, 'mergemarkertemplate', template)
32047
458f7294dfee filemerge: optionally strip quotes from merge marker template (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 31436
diff changeset
650 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
651 tres = formatter.templateresources(ui, repo)
35483
817a3d20dd01 templater: register keywords to defaults table
Yuya Nishihara <yuya@tcha.org>
parents: 35482
diff changeset
652 tmpl = formatter.maketemplater(ui, template, defaults=templatekw.keywords,
817a3d20dd01 templater: register keywords to defaults table
Yuya Nishihara <yuya@tcha.org>
parents: 35482
diff changeset
653 resources=tres)
21519
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
654
22026
6966542768ff filemerge: allow the formatting of three labels instead of two
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22025
diff changeset
655 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
656
35482
c240657febb7 templater: drop unneeded resources from conflict-marker data
Yuya Nishihara <yuya@tcha.org>
parents: 35469
diff changeset
657 newlabels = [_formatconflictmarker(cd, tmpl, labels[0], pad),
c240657febb7 templater: drop unneeded resources from conflict-marker data
Yuya Nishihara <yuya@tcha.org>
parents: 35469
diff changeset
658 _formatconflictmarker(co, tmpl, labels[1], 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
659 if len(labels) > 2:
35482
c240657febb7 templater: drop unneeded resources from conflict-marker data
Yuya Nishihara <yuya@tcha.org>
parents: 35469
diff changeset
660 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
661 return newlabels
21519
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
662
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
663 def partextras(labels):
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
664 """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
665
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
666 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
667 """
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
668 if labels is None:
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
669 return {
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
670 "l": "",
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
671 "o": "",
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
672 }
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
673
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
674 return {
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
675 "l": " [%s]" % labels[0],
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
676 "o": " [%s]" % labels[1],
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
677 }
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
678
34036
fe04c018eaac filemerge: add _restorebackup
Phil Cohen <phillco@fb.com>
parents: 34035
diff changeset
679 def _restorebackup(fcd, back):
fe04c018eaac filemerge: add _restorebackup
Phil Cohen <phillco@fb.com>
parents: 34035
diff changeset
680 # TODO: Add a workingfilectx.write(otherfilectx) path so we can use
fe04c018eaac filemerge: add _restorebackup
Phil Cohen <phillco@fb.com>
parents: 34035
diff changeset
681 # util.copy here instead.
34782
f21eecc64ace filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents: 34506
diff changeset
682 fcd.write(back.data(), fcd.flags())
34036
fe04c018eaac filemerge: add _restorebackup
Phil Cohen <phillco@fb.com>
parents: 34035
diff changeset
683
34782
f21eecc64ace filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents: 34506
diff changeset
684 def _makebackup(repo, ui, wctx, fcd, premerge):
f21eecc64ace filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents: 34506
diff changeset
685 """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
686
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
687 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
688 (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
689 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
690 have.
35702
c0439e11af16 filemerge: fix backing up an in-memory file to a custom location
Phil Cohen <phillco@fb.com>
parents: 35483
diff changeset
691
c0439e11af16 filemerge: fix backing up an in-memory file to a custom location
Phil Cohen <phillco@fb.com>
parents: 35483
diff changeset
692 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
693 content doesn't change afterwards.
34031
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
694 """
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
695 if fcd.isabsent():
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
696 return None
34782
f21eecc64ace filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents: 34506
diff changeset
697 # TODO: Break this import cycle somehow. (filectx -> ctx -> fileset ->
f21eecc64ace filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents: 34506
diff changeset
698 # 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
699 from . import context
34034
7558917f291e filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents: 34033
diff changeset
700 a = _workingpath(repo, fcd)
34031
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
701 back = scmutil.origpath(ui, repo, a)
34784
123a68e6b473 filemerge: store backups in the overlayworkingctx if using imm
Phil Cohen <phillco@fb.com>
parents: 34782
diff changeset
702 inworkingdir = (back.startswith(repo.wvfs.base) and not
123a68e6b473 filemerge: store backups in the overlayworkingctx if using imm
Phil Cohen <phillco@fb.com>
parents: 34782
diff changeset
703 back.startswith(repo.vfs.base))
123a68e6b473 filemerge: store backups in the overlayworkingctx if using imm
Phil Cohen <phillco@fb.com>
parents: 34782
diff changeset
704 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
705 # 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
706 # 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
707 # so we don't disturb the working directory.
123a68e6b473 filemerge: store backups in the overlayworkingctx if using imm
Phil Cohen <phillco@fb.com>
parents: 34782
diff changeset
708 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
709 if premerge:
9a50ffd15b25 filemerge: only write in-memory backup during premerge
Phil Cohen <phillco@fb.com>
parents: 35702
diff changeset
710 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
711 return wctx[relpath]
123a68e6b473 filemerge: store backups in the overlayworkingctx if using imm
Phil Cohen <phillco@fb.com>
parents: 34782
diff changeset
712 else:
35702
c0439e11af16 filemerge: fix backing up an in-memory file to a custom location
Phil Cohen <phillco@fb.com>
parents: 35483
diff changeset
713 if premerge:
c0439e11af16 filemerge: fix backing up an in-memory file to a custom location
Phil Cohen <phillco@fb.com>
parents: 35483
diff changeset
714 # 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
715 # 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
716 # 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
717 # on disk.
c0439e11af16 filemerge: fix backing up an in-memory file to a custom location
Phil Cohen <phillco@fb.com>
parents: 35483
diff changeset
718 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
719 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
720 else:
c0439e11af16 filemerge: fix backing up an in-memory file to a custom location
Phil Cohen <phillco@fb.com>
parents: 35483
diff changeset
721 util.copyfile(a, back)
34784
123a68e6b473 filemerge: store backups in the overlayworkingctx if using imm
Phil Cohen <phillco@fb.com>
parents: 34782
diff changeset
722 # 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
723 # 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
724 return context.arbitraryfilectx(back, repo=repo)
34031
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
725
36998
3723b42ff953 filemerge: move temp file unlinks to _maketempfiles
Kyle Lippincott <spectral@google.com>
parents: 36988
diff changeset
726 @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
727 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
728 """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
729 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
730 use them.
34031
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
731 """
36999
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
732 tmproot = None
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
733 tmprootprefix = repo.ui.config('experimental', 'mergetempdirprefix')
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
734 if tmprootprefix:
38165
2ce60954b1b7 py3: wrap tempfile.mkdtemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents: 38164
diff changeset
735 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
736
37077
1e30a26a65d0 filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents: 36999
diff changeset
737 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
738 fullbase, ext = os.path.splitext(path)
36999
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
739 pre = "%s~%s" % (os.path.basename(fullbase), prefix)
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
740 if tmproot:
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
741 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
742 if ext:
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
743 name += ext
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
744 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
745 else:
38164
aac4be30e250 py3: wrap tempfile.mkstemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents: 38159
diff changeset
746 fd, name = pycompat.mkstemp(prefix=pre + '.', suffix=ext)
36999
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
747 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
748 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
749
1e30a26a65d0 filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents: 36999
diff changeset
750 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
751 f, name = maketempfrompath(prefix, ctx.path())
34031
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
752 data = repo.wwritedata(ctx.path(), ctx.data())
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
753 f.write(data)
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
754 f.close()
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
755 return name
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
756
37077
1e30a26a65d0 filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents: 36999
diff changeset
757 b = tempfromcontext("base", fca)
1e30a26a65d0 filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents: 36999
diff changeset
758 c = tempfromcontext("other", fco)
1e30a26a65d0 filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents: 36999
diff changeset
759 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
760 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
761 # 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
762 # to make syntax-highlighting more likely.
1e30a26a65d0 filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents: 36999
diff changeset
763 if d.endswith('.orig'):
1e30a26a65d0 filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents: 36999
diff changeset
764 d, _ = os.path.splitext(d)
1e30a26a65d0 filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents: 36999
diff changeset
765 f, d = maketempfrompath("local", d)
1e30a26a65d0 filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents: 36999
diff changeset
766 with open(localpath, 'rb') as src:
1e30a26a65d0 filemerge: make the 'local' path match the format that 'base' and 'other' use
Kyle Lippincott <spectral@google.com>
parents: 36999
diff changeset
767 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
768 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
769
36998
3723b42ff953 filemerge: move temp file unlinks to _maketempfiles
Kyle Lippincott <spectral@google.com>
parents: 36988
diff changeset
770 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
771 yield b, c, d
36998
3723b42ff953 filemerge: move temp file unlinks to _maketempfiles
Kyle Lippincott <spectral@google.com>
parents: 36988
diff changeset
772 finally:
36999
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
773 if tmproot:
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
774 shutil.rmtree(tmproot)
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
775 else:
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
776 util.unlink(b)
e349ad5cbb71 filemerge: use a single temp dir instead of temp files
Kyle Lippincott <spectral@google.com>
parents: 36998
diff changeset
777 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
778 # 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
779 # 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
780 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
781 util.unlink(d)
34031
52bd006b4f49 filemerge: extract _maketemp and _makebackup
Phil Cohen <phillco@fb.com>
parents: 33906
diff changeset
782
34122
c0ce60459d84 merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents: 34076
diff changeset
783 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
784 """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
785
26607
45a6233d5f50 filemerge: introduce a premerge flag and function
Siddharth Agarwal <sid0@fb.com>
parents: 26606
diff changeset
786 premerge = whether this is a premerge
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
787 mynode = parent node before merge
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
788 orig = original local filename before merge
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
789 fco = other file context
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
790 fca = ancestor file context
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
791 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
792
27034
86ede9eda252 filemerge: return whether the file was deleted
Siddharth Agarwal <sid0@fb.com>
parents: 27033
diff changeset
793 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
794 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
795
26608
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
796 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
797 return True, None, False
26512
4c52dd406adc filemerge: indent filemerge.filemerge
Siddharth Agarwal <sid0@fb.com>
parents: 26224
diff changeset
798
26608
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
799 ui = repo.ui
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
800 fd = fcd.path()
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
801 binary = fcd.isbinary() or fco.isbinary() or fca.isbinary()
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
802 symlink = '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
803 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
804 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
805 scriptfn = None
26608
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
806 if tool in internals and tool.startswith('internal:'):
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
807 # normalize to new-style names (':merge' etc)
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
808 tool = tool[len('internal'):]
38041
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
809 if toolpath and toolpath.startswith('python:'):
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
810 invalidsyntax = False
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
811 if toolpath.count(':') >= 2:
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
812 script, scriptfn = toolpath[7:].rsplit(':', 1)
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
813 if not scriptfn:
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
814 invalidsyntax = True
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
815 # missing :callable can lead to spliting on windows drive letter
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
816 if '\\' in scriptfn or '/' in scriptfn:
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
817 invalidsyntax = True
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
818 else:
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
819 invalidsyntax = True
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
820 if invalidsyntax:
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
821 raise error.Abort(_("invalid 'python:' syntax: %s") % toolpath)
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
822 toolpath = script
27161
296d55def9c4 filemerge: add debug output for whether this is a change/delete conflict
Siddharth Agarwal <sid0@fb.com>
parents: 27124
diff changeset
823 ui.debug("picked tool '%s' for %s (binary %s symlink %s changedelete %s)\n"
32753
264b86cf2092 py3: convert bool variables to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32317
diff changeset
824 % (tool, fd, pycompat.bytestr(binary), pycompat.bytestr(symlink),
264b86cf2092 py3: convert bool variables to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32317
diff changeset
825 pycompat.bytestr(changedelete)))
6003
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
826
26608
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
827 if tool in internals:
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
828 func = internals[tool]
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
829 mergetype = func.mergetype
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
830 onfailure = func.onfailure
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
831 precheck = func.precheck
35907
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
832 isexternal = False
26608
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
833 else:
35463
ef7e667a4f7b filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents: 35282
diff changeset
834 if wctx.isinmemory():
ef7e667a4f7b filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents: 35282
diff changeset
835 func = _xmergeimm
ef7e667a4f7b filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents: 35282
diff changeset
836 else:
ef7e667a4f7b filemerge: only raise InMemoryMergeConflictsError when running _xmerge
Phil Cohen <phillco@fb.com>
parents: 35282
diff changeset
837 func = _xmerge
26608
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
838 mergetype = fullmerge
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
839 onfailure = _("merging %s failed!\n")
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
840 precheck = None
35907
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
841 isexternal = True
26512
4c52dd406adc filemerge: indent filemerge.filemerge
Siddharth Agarwal <sid0@fb.com>
parents: 26224
diff changeset
842
38041
242eb5132203 filemerge: support specifying a python function to custom merge-tools
hindlemail <tom_hindle@sil.org>
parents: 37120
diff changeset
843 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
844
26608
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
845 if mergetype == nomerge:
29774
a7f8939641aa merge: use labels in prompts to the user
Simon Farnsworth <simonfar@fb.com>
parents: 29660
diff changeset
846 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
847 return True, r, deleted
26512
4c52dd406adc filemerge: indent filemerge.filemerge
Siddharth Agarwal <sid0@fb.com>
parents: 26224
diff changeset
848
26609
47681e77e484 filemerge: only print out "merging f" output at premerge step
Siddharth Agarwal <sid0@fb.com>
parents: 26608
diff changeset
849 if premerge:
47681e77e484 filemerge: only print out "merging f" output at premerge step
Siddharth Agarwal <sid0@fb.com>
parents: 26608
diff changeset
850 if orig != fco.path():
47681e77e484 filemerge: only print out "merging f" output at premerge step
Siddharth Agarwal <sid0@fb.com>
parents: 26608
diff changeset
851 ui.status(_("merging %s and %s to %s\n") % (orig, fco.path(), fd))
47681e77e484 filemerge: only print out "merging f" output at premerge step
Siddharth Agarwal <sid0@fb.com>
parents: 26608
diff changeset
852 else:
47681e77e484 filemerge: only print out "merging f" output at premerge step
Siddharth Agarwal <sid0@fb.com>
parents: 26608
diff changeset
853 ui.status(_("merging %s\n") % fd)
26528
8bfef5737321 filemerge: move 'merging' output to before file creation
Siddharth Agarwal <sid0@fb.com>
parents: 26527
diff changeset
854
26608
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
855 ui.debug("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
856
26608
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
857 if precheck and not precheck(repo, mynode, orig, fcd, fco, fca,
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
858 toolconf):
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
859 if onfailure:
35282
46d7f0713a87 filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents: 35281
diff changeset
860 if wctx.isinmemory():
46d7f0713a87 filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents: 35281
diff changeset
861 raise error.InMemoryMergeConflictsError('in-memory merge does '
46d7f0713a87 filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents: 35281
diff changeset
862 'not support merge '
46d7f0713a87 filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents: 35281
diff changeset
863 'conflicts')
26608
ae5b60d3294f filemerge: deindent the parts of filemerge outside the try block
Siddharth Agarwal <sid0@fb.com>
parents: 26607
diff changeset
864 ui.warn(onfailure % fd)
27034
86ede9eda252 filemerge: return whether the file was deleted
Siddharth Agarwal <sid0@fb.com>
parents: 27033
diff changeset
865 return True, 1, False
26529
7833b13b001f filemerge: move precheck to before files are written out
Siddharth Agarwal <sid0@fb.com>
parents: 26528
diff changeset
866
34782
f21eecc64ace filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents: 34506
diff changeset
867 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
868 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
869 r = 1
fb388aa26453 filemerge: clean up temp files in a finally block
Siddharth Agarwal <sid0@fb.com>
parents: 26575
diff changeset
870 try:
35907
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
871 internalmarkerstyle = ui.config('ui', 'mergemarkers')
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
872 if isexternal:
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
873 markerstyle = _toolstr(ui, tool, 'mergemarkers')
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
874 else:
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
875 markerstyle = internalmarkerstyle
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
876
26529
7833b13b001f filemerge: move precheck to before files are written out
Siddharth Agarwal <sid0@fb.com>
parents: 26528
diff changeset
877 if not labels:
7833b13b001f filemerge: move precheck to before files are written out
Siddharth Agarwal <sid0@fb.com>
parents: 26528
diff changeset
878 labels = _defaultconflictlabels
35907
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
879 formattedlabels = labels
26529
7833b13b001f filemerge: move precheck to before files are written out
Siddharth Agarwal <sid0@fb.com>
parents: 26528
diff changeset
880 if markerstyle != 'basic':
35907
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
881 formattedlabels = _formatlabels(repo, fcd, fco, fca, labels,
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
882 tool=tool)
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
883
26607
45a6233d5f50 filemerge: introduce a premerge flag and function
Siddharth Agarwal <sid0@fb.com>
parents: 26606
diff changeset
884 if premerge and mergetype == fullmerge:
35907
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
885 # 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
886 # 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
887 # 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
888 # 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
889 # 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
890 premergelabels = labels
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
891 labeltool = None
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
892 if markerstyle != 'basic':
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
893 # 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
894 # ui.mergemarkertemplate)
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
895 labeltool = tool
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
896 if internalmarkerstyle != 'basic' or markerstyle != 'basic':
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
897 premergelabels = _formatlabels(repo, fcd, fco, fca,
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
898 premergelabels, tool=labeltool)
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
899
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
900 r = _premerge(repo, fcd, fco, fca, toolconf, files,
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
901 labels=premergelabels)
26611
a5ff66e6d77a filemerge: break overall filemerge into separate premerge and merge steps
Siddharth Agarwal <sid0@fb.com>
parents: 26610
diff changeset
902 # 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
903 return not r, r, False
26567
f18646cf0e93 filemerge: call premerge directly from main merge function
Siddharth Agarwal <sid0@fb.com>
parents: 26529
diff changeset
904
27033
089dab8794dc filemerge: return whether the file is deleted from all other merge tools
Siddharth Agarwal <sid0@fb.com>
parents: 27032
diff changeset
905 needcheck, r, deleted = func(repo, mynode, orig, fcd, fco, fca,
35907
9037c29e9f53 filemerge: support passing labels to external merge tools
Kyle Lippincott <spectral@google.com>
parents: 35829
diff changeset
906 toolconf, files, labels=formattedlabels)
27033
089dab8794dc filemerge: return whether the file is deleted from all other merge tools
Siddharth Agarwal <sid0@fb.com>
parents: 27032
diff changeset
907
26575
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
908 if needcheck:
34034
7558917f291e filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents: 34033
diff changeset
909 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
910
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
911 if r:
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
912 if onfailure:
35282
46d7f0713a87 filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents: 35281
diff changeset
913 if wctx.isinmemory():
46d7f0713a87 filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents: 35281
diff changeset
914 raise error.InMemoryMergeConflictsError('in-memory merge '
46d7f0713a87 filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents: 35281
diff changeset
915 'does not support '
46d7f0713a87 filemerge: raise InMemoryMergeConflictsError if we hit merge conflicts in IMM
Phil Cohen <phillco@fb.com>
parents: 35281
diff changeset
916 'merge conflicts')
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
917 ui.warn(onfailure % fd)
34797
284fa44f7f39 merge: allow user to halt merge on merge-tool failures
Ryan McElroy <rmcelroy@fb.com>
parents: 34796
diff changeset
918 _onfilemergefailure(ui)
26589
fb388aa26453 filemerge: clean up temp files in a finally block
Siddharth Agarwal <sid0@fb.com>
parents: 26575
diff changeset
919
27034
86ede9eda252 filemerge: return whether the file was deleted
Siddharth Agarwal <sid0@fb.com>
parents: 27033
diff changeset
920 return True, r, deleted
26589
fb388aa26453 filemerge: clean up temp files in a finally block
Siddharth Agarwal <sid0@fb.com>
parents: 26575
diff changeset
921 finally:
27047
e1458049dca5 filemerge: don't try to copy files known to be absent
Siddharth Agarwal <sid0@fb.com>
parents: 27042
diff changeset
922 if not r and back is not None:
34782
f21eecc64ace filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents: 34506
diff changeset
923 back.remove()
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
924
34796
ed91846c29cf filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents: 34785
diff changeset
925 def _haltmerge():
ed91846c29cf filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents: 34785
diff changeset
926 msg = _('merge halted after failed merge (see hg resolve)')
ed91846c29cf filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents: 34785
diff changeset
927 raise error.InterventionRequired(msg)
ed91846c29cf filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents: 34785
diff changeset
928
ed91846c29cf filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents: 34785
diff changeset
929 def _onfilemergefailure(ui):
ed91846c29cf filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents: 34785
diff changeset
930 action = ui.config('merge', 'on-failure')
ed91846c29cf filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents: 34785
diff changeset
931 if action == 'prompt':
ed91846c29cf filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents: 34785
diff changeset
932 msg = _('continue merge operation (yn)?' '$$ &Yes $$ &No')
ed91846c29cf filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents: 34785
diff changeset
933 if ui.promptchoice(msg, 0) == 1:
ed91846c29cf filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents: 34785
diff changeset
934 _haltmerge()
ed91846c29cf filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents: 34785
diff changeset
935 if action == 'halt':
ed91846c29cf filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents: 34785
diff changeset
936 _haltmerge()
ed91846c29cf filemerge: introduce functions to halt merge flow
Ryan McElroy <rmcelroy@fb.com>
parents: 34785
diff changeset
937 # 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
938
38793
6c8e3c847977 resolve: add option to warn/abort on -m with unresolved conflict markers
Kyle Lippincott <spectral@google.com>
parents: 38165
diff changeset
939 def hasconflictmarkers(data):
6c8e3c847977 resolve: add option to warn/abort on -m with unresolved conflict markers
Kyle Lippincott <spectral@google.com>
parents: 38165
diff changeset
940 return bool(re.search("^(<<<<<<< .*|=======|>>>>>>> .*)$", data,
6c8e3c847977 resolve: add option to warn/abort on -m with unresolved conflict markers
Kyle Lippincott <spectral@google.com>
parents: 38165
diff changeset
941 re.MULTILINE))
6c8e3c847977 resolve: add option to warn/abort on -m with unresolved conflict markers
Kyle Lippincott <spectral@google.com>
parents: 38165
diff changeset
942
34034
7558917f291e filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents: 34033
diff changeset
943 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
944 fd = fcd.path()
34034
7558917f291e filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents: 34033
diff changeset
945 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
946
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
947 if not r and (_toolbool(ui, tool, "checkconflicts") or
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
948 'conflicts' in _toollist(ui, tool, "check")):
38793
6c8e3c847977 resolve: add option to warn/abort on -m with unresolved conflict markers
Kyle Lippincott <spectral@google.com>
parents: 38165
diff changeset
949 if hasconflictmarkers(fcd.data()):
26575
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
950 r = 1
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
951
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
952 checked = False
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
953 if 'prompt' in _toollist(ui, tool, "check"):
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
954 checked = True
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
955 if ui.promptchoice(_("was merge of '%s' successful (yn)?"
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
956 "$$ &Yes $$ &No") % fd, 1):
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
957 r = 1
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
958
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
959 if not r and not checked and (_toolbool(ui, tool, "checkchanged") or
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
960 'changed' in
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
961 _toollist(ui, tool, "check")):
34782
f21eecc64ace filemerge: use arbitraryfilectx for backups
Phil Cohen <phillco@fb.com>
parents: 34506
diff changeset
962 if back is not None and not fcd.cmp(back):
26575
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
963 if ui.promptchoice(_(" output file %s appears unchanged\n"
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
964 "was merge successful (yn)?"
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
965 "$$ &Yes $$ &No") % fd, 1):
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
966 r = 1
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
967
27047
e1458049dca5 filemerge: don't try to copy files known to be absent
Siddharth Agarwal <sid0@fb.com>
parents: 27042
diff changeset
968 if back is not None and _toolbool(ui, tool, "fixeol"):
34034
7558917f291e filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents: 34033
diff changeset
969 _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
970
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
971 return r
d60815664c34 filemerge: move post-merge checks into a separate function
Siddharth Agarwal <sid0@fb.com>
parents: 26574
diff changeset
972
34034
7558917f291e filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents: 34033
diff changeset
973 def _workingpath(repo, ctx):
7558917f291e filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents: 34033
diff changeset
974 return repo.wjoin(ctx.path())
7558917f291e filemerge: add `_workingpath`
Phil Cohen <phillco@fb.com>
parents: 34033
diff changeset
975
34122
c0ce60459d84 merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents: 34076
diff changeset
976 def premerge(repo, wctx, mynode, orig, fcd, fco, fca, labels=None):
c0ce60459d84 merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents: 34076
diff changeset
977 return _filemerge(True, repo, wctx, mynode, orig, fcd, fco, fca,
c0ce60459d84 merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents: 34076
diff changeset
978 labels=labels)
26607
45a6233d5f50 filemerge: introduce a premerge flag and function
Siddharth Agarwal <sid0@fb.com>
parents: 26606
diff changeset
979
34122
c0ce60459d84 merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents: 34076
diff changeset
980 def filemerge(repo, wctx, mynode, orig, fcd, fco, fca, labels=None):
c0ce60459d84 merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents: 34076
diff changeset
981 return _filemerge(False, repo, wctx, mynode, orig, fcd, fco, fca,
c0ce60459d84 merge: pass wctx to premerge, filemerge
Phil Cohen <phillco@fb.com>
parents: 34076
diff changeset
982 labels=labels)
26605
ef21a2c41629 filemerge: add a wrapper around the filemerge function
Siddharth Agarwal <sid0@fb.com>
parents: 26589
diff changeset
983
33699
50c44dee741a filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33523
diff changeset
984 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
985 """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
986 """
50c44dee741a filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33523
diff changeset
987 for name, func in registrarobj._table.iteritems():
50c44dee741a filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33523
diff changeset
988 fullname = ':' + name
50c44dee741a filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33523
diff changeset
989 internals[fullname] = func
50c44dee741a filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33523
diff changeset
990 internals['internal:' + name] = func
50c44dee741a filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33523
diff changeset
991 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
992
39126
e09fad982ef5 filemerge: show actual capabilities of internal merge tools
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39125
diff changeset
993 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
994 if capabilities:
39267
88c5a3ef54b1 filemerge: avoid putting translated text into docstring
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39266
diff changeset
995 capdesc = " (actual capabilities: %s)" % ', '.join(capabilities)
39126
e09fad982ef5 filemerge: show actual capabilities of internal merge tools
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39125
diff changeset
996 func.__doc__ = (func.__doc__ +
39267
88c5a3ef54b1 filemerge: avoid putting translated text into docstring
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39266
diff changeset
997 pycompat.sysstr("\n\n%s" % capdesc))
88c5a3ef54b1 filemerge: avoid putting translated text into docstring
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39266
diff changeset
998
88c5a3ef54b1 filemerge: avoid putting translated text into docstring
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39266
diff changeset
999 # 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
1000
88c5a3ef54b1 filemerge: avoid putting translated text into docstring
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39266
diff changeset
1001 # i18n: "binary" and "symlik" are keywords
88c5a3ef54b1 filemerge: avoid putting translated text into docstring
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39266
diff changeset
1002 # i18n: this text is added automatically
88c5a3ef54b1 filemerge: avoid putting translated text into docstring
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39266
diff changeset
1003 _(" (actual capabilities: binary, symlink)")
88c5a3ef54b1 filemerge: avoid putting translated text into docstring
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39266
diff changeset
1004 # i18n: "binary" is keyword
88c5a3ef54b1 filemerge: avoid putting translated text into docstring
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39266
diff changeset
1005 # i18n: this text is added automatically
88c5a3ef54b1 filemerge: avoid putting translated text into docstring
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39266
diff changeset
1006 _(" (actual capabilities: binary)")
88c5a3ef54b1 filemerge: avoid putting translated text into docstring
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39266
diff changeset
1007 # i18n: "symlink" is keyword
88c5a3ef54b1 filemerge: avoid putting translated text into docstring
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39266
diff changeset
1008 # i18n: this text is added automatically
88c5a3ef54b1 filemerge: avoid putting translated text into docstring
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39266
diff changeset
1009 _(" (actual capabilities: symlink)")
39126
e09fad982ef5 filemerge: show actual capabilities of internal merge tools
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 39125
diff changeset
1010
33699
50c44dee741a filemerge: move decorator definition for internal merge tools to registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33523
diff changeset
1011 # 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
1012 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
1013
16126
0c4bec9596d8 filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16125
diff changeset
1014 # 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
1015 i18nfunctions = internals.values()