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