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