mercurial/filemerge.py
author Durham Goode <durham@fb.com>
Mon, 24 Aug 2015 19:33:36 -0700
changeset 26076 cebf7e48365e
parent 26071 ff12a6c63c3d
child 26224 a4da463df6cf
permissions -rw-r--r--
paths: move path validation logic to its own function Hard coding the '.hg' path in the paths class made it difficult for the hggit extension to pull from gitrepos. This patch moves the logic out to it's own function so extensions can add additional checks to what is a valid path (i.e. a git repo is valid when hggit is enabled).
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
80aba76e29c1 filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25835
diff changeset
    10
import filecmp
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
80aba76e29c1 filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25835
diff changeset
    13
import tempfile
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 _
80aba76e29c1 filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25835
diff changeset
    16
from .node import short
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 (
80aba76e29c1 filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25835
diff changeset
    19
    error,
80aba76e29c1 filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25835
diff changeset
    20
    match,
80aba76e29c1 filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25835
diff changeset
    21
    simplemerge,
80aba76e29c1 filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25835
diff changeset
    22
    tagmerge,
80aba76e29c1 filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25835
diff changeset
    23
    templatekw,
80aba76e29c1 filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25835
diff changeset
    24
    templater,
80aba76e29c1 filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25835
diff changeset
    25
    util,
80aba76e29c1 filemerge: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25835
diff changeset
    26
)
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
    27
6013
bb441d77df99 filemerge: handle missing regappend
Matt Mackall <mpm@selenic.com>
parents: 6007
diff changeset
    28
def _toolstr(ui, tool, part, default=""):
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
    29
    return ui.config("merge-tools", tool + "." + part, default)
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
    30
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
    31
def _toolbool(ui, tool, part, default=False):
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
    32
    return ui.configbool("merge-tools", tool + "." + part, default)
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
    33
11148
a912f26777d3 merge: introduce tool.check parameter
David Champion <dgc@uchicago.edu>
parents: 11146
diff changeset
    34
def _toollist(ui, tool, part, default=[]):
a912f26777d3 merge: introduce tool.check parameter
David Champion <dgc@uchicago.edu>
parents: 11146
diff changeset
    35
    return ui.configlist("merge-tools", tool + "." + part, default)
a912f26777d3 merge: introduce tool.check parameter
David Champion <dgc@uchicago.edu>
parents: 11146
diff changeset
    36
16126
0c4bec9596d8 filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16125
diff changeset
    37
internals = {}
24099
be83fd9d46d5 help.merge-tools: do not double document merge tools
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23270
diff changeset
    38
# Merge tools to document.
be83fd9d46d5 help.merge-tools: do not double document merge tools
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23270
diff changeset
    39
internalsdoc = {}
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
    40
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
    41
def internaltool(name, trymerge, onfailure=None):
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
    42
    '''return a decorator for populating internal merge tool table'''
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
    43
    def decorator(func):
22707
38e0363dcbe0 filemerge: switch the default name for internal tools from internal:x to :x
Mads Kiilerich <madski@unity3d.com>
parents: 22706
diff changeset
    44
        fullname = ':' + name
16127
14dc2bbba6d2 filemerge: remove some redundancy in decorators/docstrings
Matt Mackall <mpm@selenic.com>
parents: 16126
diff changeset
    45
        func.__doc__ = "``%s``\n" % fullname + func.__doc__.strip()
14dc2bbba6d2 filemerge: remove some redundancy in decorators/docstrings
Matt Mackall <mpm@selenic.com>
parents: 16126
diff changeset
    46
        internals[fullname] = func
22707
38e0363dcbe0 filemerge: switch the default name for internal tools from internal:x to :x
Mads Kiilerich <madski@unity3d.com>
parents: 22706
diff changeset
    47
        internals['internal:' + name] = func
24099
be83fd9d46d5 help.merge-tools: do not double document merge tools
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23270
diff changeset
    48
        internalsdoc[fullname] = func
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
    49
        func.trymerge = trymerge
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
    50
        func.onfailure = onfailure
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
    51
        return func
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
    52
    return decorator
8830
a9850eda2973 filemerge: add internal:prompt target
Matt Mackall <mpm@selenic.com>
parents: 8615
diff changeset
    53
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
    54
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
    55
    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
    56
        return tool
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
    57
    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
    58
b405dd6c90bf filemerge: split the logic for finding an external tool to its own function
Matt Harbison <matt_harbison@yahoo.com>
parents: 22707
diff changeset
    59
def findexternaltool(ui, tool):
13565
984175605311 filemerge: introduce a 'regkeyalt' merge tool variable
Steve Borho <steve@borho.org>
parents: 12788
diff changeset
    60
    for kn in ("regkey", "regkeyalt"):
984175605311 filemerge: introduce a 'regkeyalt' merge tool variable
Steve Borho <steve@borho.org>
parents: 12788
diff changeset
    61
        k = _toolstr(ui, tool, kn)
984175605311 filemerge: introduce a 'regkeyalt' merge tool variable
Steve Borho <steve@borho.org>
parents: 12788
diff changeset
    62
        if not k:
984175605311 filemerge: introduce a 'regkeyalt' merge tool variable
Steve Borho <steve@borho.org>
parents: 12788
diff changeset
    63
            continue
14230
d51630301241 rename util.lookup_reg to lookupreg
Adrian Buehlmann <adrian@cadifra.com>
parents: 14168
diff changeset
    64
        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
    65
        if p:
14271
4030630fb59c rename util.find_exe to findexe
Adrian Buehlmann <adrian@cadifra.com>
parents: 14230
diff changeset
    66
            p = util.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
    67
            if p:
3c9dbb743d20 merge: add registry look up bits to tool search
Matt Mackall <mpm@selenic.com>
parents: 6005
diff changeset
    68
                return p
15264
157d93c41c10 merge: expand environment variables and ~/ in tool.executable
Greg Ward <greg@gerg.ca>
parents: 14749
diff changeset
    69
    exe = _toolstr(ui, tool, "executable", tool)
157d93c41c10 merge: expand environment variables and ~/ in tool.executable
Greg Ward <greg@gerg.ca>
parents: 14749
diff changeset
    70
    return util.findexe(util.expandpath(exe))
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
    71
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
    72
def _picktool(repo, ui, path, binary, symlink):
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
    73
    def check(tool, pat, symlink, binary):
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
    74
        tmsg = tool
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
    75
        if pat:
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
    76
            tmsg += " specified for " + pat
7397
4c92d8971809 More verbose logging when filemerge searches for merge-tool
Mads Kiilerich <mads@kiilerich.com>
parents: 6762
diff changeset
    77
        if not _findtool(ui, tool):
4c92d8971809 More verbose logging when filemerge searches for merge-tool
Mads Kiilerich <mads@kiilerich.com>
parents: 6762
diff changeset
    78
            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
    79
                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
    80
            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
    81
                ui.note(_("couldn't find merge tool %s\n") % tmsg)
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
    82
        elif symlink and not _toolbool(ui, tool, "symlink"):
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
    83
            ui.warn(_("tool %s can't handle symlinks\n") % tmsg)
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
    84
        elif binary and not _toolbool(ui, tool, "binary"):
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
    85
            ui.warn(_("tool %s can't handle binary\n") % tmsg)
6007
090b1a665901 filemerge: add config item for GUI tools
Matt Mackall <mpm@selenic.com>
parents: 6006
diff changeset
    86
        elif not util.gui() and _toolbool(ui, tool, "gui"):
090b1a665901 filemerge: add config item for GUI tools
Matt Mackall <mpm@selenic.com>
parents: 6006
diff changeset
    87
            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
    88
        else:
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
    89
            return True
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
    90
        return False
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
    91
25835
34ffe4c29782 filemerge: mark internal-only config option
Matt Mackall <mpm@selenic.com>
parents: 24987
diff changeset
    92
    # internal config: ui.forcemerge
12788
de793925862e merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents: 12047
diff changeset
    93
    # 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
    94
    force = ui.config('ui', 'forcemerge')
de793925862e merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents: 12047
diff changeset
    95
    if force:
de793925862e merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents: 12047
diff changeset
    96
        toolpath = _findtool(ui, force)
de793925862e merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents: 12047
diff changeset
    97
        if toolpath:
17885
9a2cf955db84 filemerge: use util.shellquote when calling merge (issue3581)
Keegan Carruthers-Smith <keegancsmith@fb.com>
parents: 16256
diff changeset
    98
            return (force, util.shellquote(toolpath))
12788
de793925862e merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents: 12047
diff changeset
    99
        else:
de793925862e merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents: 12047
diff changeset
   100
            # mimic HGMERGE if given tool not found
de793925862e merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents: 12047
diff changeset
   101
            return (force, force)
de793925862e merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents: 12047
diff changeset
   102
de793925862e merge: implement --tool arguments using new ui.forcemerge configurable
Steve Borho <steve@borho.org>
parents: 12047
diff changeset
   103
    # HGMERGE takes next precedence
6025
f2335246e5c7 filemerge: wrap quotes around tool path
Steve Borho <steve@borho.org>
parents: 6016
diff changeset
   104
    hgmerge = os.environ.get("HGMERGE")
f2335246e5c7 filemerge: wrap quotes around tool path
Steve Borho <steve@borho.org>
parents: 6016
diff changeset
   105
    if hgmerge:
f2335246e5c7 filemerge: wrap quotes around tool path
Steve Borho <steve@borho.org>
parents: 6016
diff changeset
   106
        return (hgmerge, hgmerge)
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
   107
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
   108
    # then patterns
6016
288ec2f6faa2 filemerge: fix pattern matching
dhruva <dhruvakm@gmail.com>
parents: 6015
diff changeset
   109
    for pat, tool in ui.configitems("merge-patterns"):
8567
fea40a677d43 match: add some default args
Matt Mackall <mpm@selenic.com>
parents: 8566
diff changeset
   110
        mf = match.match(repo.root, '', [pat])
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
   111
        if mf(path) and check(tool, pat, symlink, False):
10339
23e608f42f2c fix spaces/identation issues
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10282
diff changeset
   112
            toolpath = _findtool(ui, tool)
17885
9a2cf955db84 filemerge: use util.shellquote when calling merge (issue3581)
Keegan Carruthers-Smith <keegancsmith@fb.com>
parents: 16256
diff changeset
   113
            return (tool, util.shellquote(toolpath))
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
   114
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
   115
    # then merge tools
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
   116
    tools = {}
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   117
    for k, v in ui.configitems("merge-tools"):
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
   118
        t = k.split('.')[0]
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
   119
        if t not in tools:
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
   120
            tools[t] = int(_toolstr(ui, t, "priority", "0"))
6076
0ee885fea464 filemerge: more backwards compatible behavior for ui.merge
Steve Borho <steve@borho.org>
parents: 6075
diff changeset
   121
    names = tools.keys()
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   122
    tools = sorted([(-p, t) for t, p in tools.items()])
6076
0ee885fea464 filemerge: more backwards compatible behavior for ui.merge
Steve Borho <steve@borho.org>
parents: 6075
diff changeset
   123
    uimerge = ui.config("ui", "merge")
0ee885fea464 filemerge: more backwards compatible behavior for ui.merge
Steve Borho <steve@borho.org>
parents: 6075
diff changeset
   124
    if uimerge:
0ee885fea464 filemerge: more backwards compatible behavior for ui.merge
Steve Borho <steve@borho.org>
parents: 6075
diff changeset
   125
        if uimerge not in names:
0ee885fea464 filemerge: more backwards compatible behavior for ui.merge
Steve Borho <steve@borho.org>
parents: 6075
diff changeset
   126
            return (uimerge, uimerge)
0ee885fea464 filemerge: more backwards compatible behavior for ui.merge
Steve Borho <steve@borho.org>
parents: 6075
diff changeset
   127
        tools.insert(0, (None, uimerge)) # highest priority
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
   128
    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
   129
    for p, t in tools:
7397
4c92d8971809 More verbose logging when filemerge searches for merge-tool
Mads Kiilerich <mads@kiilerich.com>
parents: 6762
diff changeset
   130
        if check(t, None, symlink, binary):
4c92d8971809 More verbose logging when filemerge searches for merge-tool
Mads Kiilerich <mads@kiilerich.com>
parents: 6762
diff changeset
   131
            toolpath = _findtool(ui, t)
17885
9a2cf955db84 filemerge: use util.shellquote when calling merge (issue3581)
Keegan Carruthers-Smith <keegancsmith@fb.com>
parents: 16256
diff changeset
   132
            return (t, util.shellquote(toolpath))
16254
c7eef052c9e3 filemerge: restore default prompt for binary/symlink lost in 83925d3a4559
Matt Mackall <mpm@selenic.com>
parents: 16205
diff changeset
   133
c7eef052c9e3 filemerge: restore default prompt for binary/symlink lost in 83925d3a4559
Matt Mackall <mpm@selenic.com>
parents: 16205
diff changeset
   134
    # internal merge or prompt as last resort
c7eef052c9e3 filemerge: restore default prompt for binary/symlink lost in 83925d3a4559
Matt Mackall <mpm@selenic.com>
parents: 16205
diff changeset
   135
    if symlink or binary:
22707
38e0363dcbe0 filemerge: switch the default name for internal tools from internal:x to :x
Mads Kiilerich <madski@unity3d.com>
parents: 22706
diff changeset
   136
        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
   137
    return ":merge", None
6003
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   138
6005
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
   139
def _eoltype(data):
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
   140
    "Guess the EOL type of a file"
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
   141
    if '\0' in data: # binary
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
   142
        return None
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
   143
    if '\r\n' in data: # Windows
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
   144
        return '\r\n'
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
   145
    if '\r' in data: # Old Mac
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
   146
        return '\r'
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
   147
    if '\n' in data: # UNIX
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
   148
        return '\n'
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
   149
    return None # unknown
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
   150
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
   151
def _matcheol(file, origfile):
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
   152
    "Convert EOL markers in a file to match origfile"
14168
135e244776f0 prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13565
diff changeset
   153
    tostyle = _eoltype(util.readfile(origfile))
6005
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
   154
    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
   155
        data = util.readfile(file)
6005
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
   156
        style = _eoltype(data)
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
   157
        if style:
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
   158
            newdata = data.replace(style, tostyle)
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
   159
            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
   160
                util.writefile(file, newdata)
6005
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
   161
16127
14dc2bbba6d2 filemerge: remove some redundancy in decorators/docstrings
Matt Mackall <mpm@selenic.com>
parents: 16126
diff changeset
   162
@internaltool('prompt', False)
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   163
def _iprompt(repo, mynode, orig, fcd, fco, fca, toolconf):
16127
14dc2bbba6d2 filemerge: remove some redundancy in decorators/docstrings
Matt Mackall <mpm@selenic.com>
parents: 16126
diff changeset
   164
    """Asks the user which of the local or the other version to keep as
16126
0c4bec9596d8 filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16125
diff changeset
   165
    the merged version."""
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   166
    ui = repo.ui
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   167
    fd = fcd.path()
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   168
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   169
    if ui.promptchoice(_(" no tool found to merge %s\n"
19226
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 18325
diff changeset
   170
                         "keep (l)ocal or take (o)ther?"
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 18325
diff changeset
   171
                         "$$ &Local $$ &Other") % fd, 0):
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   172
        return _iother(repo, mynode, orig, fcd, fco, fca, toolconf)
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   173
    else:
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   174
        return _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf)
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   175
16127
14dc2bbba6d2 filemerge: remove some redundancy in decorators/docstrings
Matt Mackall <mpm@selenic.com>
parents: 16126
diff changeset
   176
@internaltool('local', False)
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   177
def _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf):
16127
14dc2bbba6d2 filemerge: remove some redundancy in decorators/docstrings
Matt Mackall <mpm@selenic.com>
parents: 16126
diff changeset
   178
    """Uses the local version of files as the merged version."""
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   179
    return 0
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   180
16127
14dc2bbba6d2 filemerge: remove some redundancy in decorators/docstrings
Matt Mackall <mpm@selenic.com>
parents: 16126
diff changeset
   181
@internaltool('other', False)
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   182
def _iother(repo, mynode, orig, fcd, fco, fca, toolconf):
16127
14dc2bbba6d2 filemerge: remove some redundancy in decorators/docstrings
Matt Mackall <mpm@selenic.com>
parents: 16126
diff changeset
   183
    """Uses the other version of files as the merged version."""
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   184
    repo.wwrite(fcd.path(), fco.data(), fco.flags())
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   185
    return 0
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   186
16127
14dc2bbba6d2 filemerge: remove some redundancy in decorators/docstrings
Matt Mackall <mpm@selenic.com>
parents: 16126
diff changeset
   187
@internaltool('fail', False)
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   188
def _ifail(repo, mynode, orig, fcd, fco, fca, toolconf):
16127
14dc2bbba6d2 filemerge: remove some redundancy in decorators/docstrings
Matt Mackall <mpm@selenic.com>
parents: 16126
diff changeset
   189
    """
16126
0c4bec9596d8 filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16125
diff changeset
   190
    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
   191
    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
   192
    used to resolve these conflicts."""
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   193
    return 1
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   194
21273
20b8090d8125 merge: define conflict marker labels in filemerge()
Durham Goode <durham@fb.com>
parents: 21100
diff changeset
   195
def _premerge(repo, toolconf, files, labels=None):
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   196
    tool, toolpath, binary, symlink = toolconf
18257
a35d0128545e merge: never do premerge on symlinks
Mads Kiilerich <mads@kiilerich.com>
parents: 18256
diff changeset
   197
    if symlink:
a35d0128545e merge: never do premerge on symlinks
Mads Kiilerich <mads@kiilerich.com>
parents: 18256
diff changeset
   198
        return 1
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   199
    a, b, c, back = files
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   200
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   201
    ui = repo.ui
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   202
22032
d7f25834ffbb merge-tools: add a `premerge=keep-merge3` config option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22031
diff changeset
   203
    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
   204
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   205
    # do we attempt to simplemerge first?
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   206
    try:
18257
a35d0128545e merge: never do premerge on symlinks
Mads Kiilerich <mads@kiilerich.com>
parents: 18256
diff changeset
   207
        premerge = _toolbool(ui, tool, "premerge", not binary)
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   208
    except error.ConfigError:
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   209
        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
   210
        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
   211
            _valid = ', '.join(["'" + v + "'" for v in validkeep])
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   212
            raise error.ConfigError(_("%s.premerge not valid "
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   213
                                      "('%s' is neither boolean nor %s)") %
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   214
                                    (tool, premerge, _valid))
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   215
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   216
    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
   217
        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
   218
            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
   219
                labels = _defaultconflictlabels
d7f25834ffbb merge-tools: add a `premerge=keep-merge3` config option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22031
diff changeset
   220
            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
   221
                labels.append('base')
22023
f18830651811 simplemerge: burn "minimal" feature to the ground
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22022
diff changeset
   222
        r = simplemerge.simplemerge(ui, a, b, c, quiet=True, label=labels)
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   223
        if not r:
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   224
            ui.debug(" premerge successful\n")
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   225
            return 0
22031
b36c60cfe46f merge-tools: make premerge valid values extensible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22028
diff changeset
   226
        if premerge not in validkeep:
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   227
            util.copyfile(back, a) # restore from backup and try again
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   228
    return 1 # continue merging
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   229
26070
e15966216aec filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents: 25949
diff changeset
   230
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
   231
    """
16126
0c4bec9596d8 filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16125
diff changeset
   232
    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
   233
    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
   234
    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
   235
    of merge, unless mode equals 'union' which suppresses the markers."""
18256
d084df89d948 merge: make internal merge fail cleanly on symlinks
Mads Kiilerich <mads@kiilerich.com>
parents: 17885
diff changeset
   236
    tool, toolpath, binary, symlink = toolconf
d084df89d948 merge: make internal merge fail cleanly on symlinks
Mads Kiilerich <mads@kiilerich.com>
parents: 17885
diff changeset
   237
    if symlink:
22707
38e0363dcbe0 filemerge: switch the default name for internal tools from internal:x to :x
Mads Kiilerich <madski@unity3d.com>
parents: 22706
diff changeset
   238
        repo.ui.warn(_('warning: internal :merge cannot merge symlinks '
18325
297bf69966a0 merge: warn when internal:merge cannot merge symlinks
Mads Kiilerich <mads@kiilerich.com>
parents: 18257
diff changeset
   239
                       'for %s\n') % fcd.path())
18256
d084df89d948 merge: make internal merge fail cleanly on symlinks
Mads Kiilerich <mads@kiilerich.com>
parents: 17885
diff changeset
   240
        return False, 1
21273
20b8090d8125 merge: define conflict marker labels in filemerge()
Durham Goode <durham@fb.com>
parents: 21100
diff changeset
   241
    r = _premerge(repo, toolconf, files, labels=labels)
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   242
    if r:
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   243
        a, b, c, back = files
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   244
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   245
        ui = repo.ui
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   246
26070
e15966216aec filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents: 25949
diff changeset
   247
        r = simplemerge.simplemerge(ui, a, b, c, label=labels, mode=mode)
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   248
        return True, r
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   249
    return False, 0
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   250
26071
ff12a6c63c3d filemerge: add 'union' merge to internal merge tool
Erik Huelsmann <ehuels@gmail.com>
parents: 26070
diff changeset
   251
@internaltool('union', True,
ff12a6c63c3d filemerge: add 'union' merge to internal merge tool
Erik Huelsmann <ehuels@gmail.com>
parents: 26070
diff changeset
   252
              _("merging %s incomplete! "
ff12a6c63c3d filemerge: add 'union' merge to internal merge tool
Erik Huelsmann <ehuels@gmail.com>
parents: 26070
diff changeset
   253
                "(edit conflicts, then use 'hg resolve --mark')\n"))
ff12a6c63c3d filemerge: add 'union' merge to internal merge tool
Erik Huelsmann <ehuels@gmail.com>
parents: 26070
diff changeset
   254
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
   255
    """
ff12a6c63c3d filemerge: add 'union' merge to internal merge tool
Erik Huelsmann <ehuels@gmail.com>
parents: 26070
diff changeset
   256
    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
   257
    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
   258
    No markers are inserted."""
ff12a6c63c3d filemerge: add 'union' merge to internal merge tool
Erik Huelsmann <ehuels@gmail.com>
parents: 26070
diff changeset
   259
    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
   260
                  files, labels, 'union')
ff12a6c63c3d filemerge: add 'union' merge to internal merge tool
Erik Huelsmann <ehuels@gmail.com>
parents: 26070
diff changeset
   261
26070
e15966216aec filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents: 25949
diff changeset
   262
@internaltool('merge', True,
e15966216aec filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents: 25949
diff changeset
   263
              _("merging %s incomplete! "
e15966216aec filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents: 25949
diff changeset
   264
                "(edit conflicts, then use 'hg resolve --mark')\n"))
e15966216aec filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents: 25949
diff changeset
   265
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
   266
    """
e15966216aec filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents: 25949
diff changeset
   267
    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
   268
    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
   269
    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
   270
    of merge."""
e15966216aec filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents: 25949
diff changeset
   271
    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
   272
                  files, labels, 'merge')
e15966216aec filemerge: split internal merge into api entry point and internal helper
Erik Huelsmann <ehuels@gmail.com>
parents: 25949
diff changeset
   273
22028
3d0572ab3b4a merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 22027
diff changeset
   274
@internaltool('merge3', True,
3d0572ab3b4a merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 22027
diff changeset
   275
              _("merging %s incomplete! "
3d0572ab3b4a merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 22027
diff changeset
   276
                "(edit conflicts, then use 'hg resolve --mark')\n"))
3d0572ab3b4a merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 22027
diff changeset
   277
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
   278
    """
3d0572ab3b4a merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 22027
diff changeset
   279
    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
   280
    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
   281
    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
   282
    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
   283
    if not labels:
3d0572ab3b4a merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 22027
diff changeset
   284
        labels = _defaultconflictlabels
3d0572ab3b4a merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 22027
diff changeset
   285
    if len(labels) < 3:
3d0572ab3b4a merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 22027
diff changeset
   286
        labels.append('base')
3d0572ab3b4a merge: add an internal:merge3 tool
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 22027
diff changeset
   287
    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
   288
21922
50e20154cb68 filemerge: add internal:tagmerge merge tool
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21921
diff changeset
   289
@internaltool('tagmerge', True,
50e20154cb68 filemerge: add internal:tagmerge merge tool
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21921
diff changeset
   290
              _("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
   291
                "(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
   292
                "tool of your choice)\n"))
50e20154cb68 filemerge: add internal:tagmerge merge tool
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21921
diff changeset
   293
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
   294
    """
50e20154cb68 filemerge: add internal:tagmerge merge tool
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21921
diff changeset
   295
    Uses the internal tag merge algorithm (experimental).
50e20154cb68 filemerge: add internal:tagmerge merge tool
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21921
diff changeset
   296
    """
50e20154cb68 filemerge: add internal:tagmerge merge tool
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21921
diff changeset
   297
    return tagmerge.merge(repo, fcd, fco, fca)
50e20154cb68 filemerge: add internal:tagmerge merge tool
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21921
diff changeset
   298
16127
14dc2bbba6d2 filemerge: remove some redundancy in decorators/docstrings
Matt Mackall <mpm@selenic.com>
parents: 16126
diff changeset
   299
@internaltool('dump', True)
21273
20b8090d8125 merge: define conflict marker labels in filemerge()
Durham Goode <durham@fb.com>
parents: 21100
diff changeset
   300
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
   301
    """
16126
0c4bec9596d8 filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16125
diff changeset
   302
    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
   303
    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
   304
    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
   305
    ``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
   306
    ``a.txt.other`` and ``a.txt.base`` and they will be placed in the
0c4bec9596d8 filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16125
diff changeset
   307
    same directory as ``a.txt``."""
21273
20b8090d8125 merge: define conflict marker labels in filemerge()
Durham Goode <durham@fb.com>
parents: 21100
diff changeset
   308
    r = _premerge(repo, toolconf, files, labels=labels)
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   309
    if r:
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   310
        a, b, c, back = files
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   311
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   312
        fd = fcd.path()
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   313
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   314
        util.copyfile(a, a + ".local")
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   315
        repo.wwrite(fd + ".other", fco.data(), fco.flags())
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   316
        repo.wwrite(fd + ".base", fca.data(), fca.flags())
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   317
    return False, r
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   318
21273
20b8090d8125 merge: define conflict marker labels in filemerge()
Durham Goode <durham@fb.com>
parents: 21100
diff changeset
   319
def _xmerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
20b8090d8125 merge: define conflict marker labels in filemerge()
Durham Goode <durham@fb.com>
parents: 21100
diff changeset
   320
    r = _premerge(repo, toolconf, files, labels=labels)
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   321
    if r:
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   322
        tool, toolpath, binary, symlink = toolconf
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   323
        a, b, c, back = files
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   324
        out = ""
20676
89b2336e5ccf filemerge: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 19226
diff changeset
   325
        env = {'HG_FILE': fcd.path(),
89b2336e5ccf filemerge: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 19226
diff changeset
   326
               'HG_MY_NODE': short(mynode),
89b2336e5ccf filemerge: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 19226
diff changeset
   327
               'HG_OTHER_NODE': str(fco.changectx()),
89b2336e5ccf filemerge: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 19226
diff changeset
   328
               'HG_BASE_NODE': str(fca.changectx()),
89b2336e5ccf filemerge: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 19226
diff changeset
   329
               'HG_MY_ISLINK': 'l' in fcd.flags(),
89b2336e5ccf filemerge: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 19226
diff changeset
   330
               'HG_OTHER_ISLINK': 'l' in fco.flags(),
89b2336e5ccf filemerge: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 19226
diff changeset
   331
               'HG_BASE_ISLINK': 'l' in fca.flags(),
89b2336e5ccf filemerge: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 19226
diff changeset
   332
               }
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   333
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   334
        ui = repo.ui
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   335
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   336
        args = _toolstr(ui, tool, "args", '$local $base $other')
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   337
        if "$output" in args:
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   338
            out, a = a, back # read input from backup, write to original
20676
89b2336e5ccf filemerge: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 19226
diff changeset
   339
        replace = {'local': a, 'base': b, 'other': c, 'output': out}
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   340
        args = util.interpolate(r'\$', replace, args,
17885
9a2cf955db84 filemerge: use util.shellquote when calling merge (issue3581)
Keegan Carruthers-Smith <keegancsmith@fb.com>
parents: 16256
diff changeset
   341
                                lambda s: util.shellquote(util.localpath(s)))
24727
5668202cfaaf merge: better debug messages before/after invoking external merge tool
Mads Kiilerich <mads@kiilerich.com>
parents: 24099
diff changeset
   342
        cmd = toolpath + ' ' + args
5668202cfaaf merge: better debug messages before/after invoking external merge tool
Mads Kiilerich <mads@kiilerich.com>
parents: 24099
diff changeset
   343
        repo.ui.debug('launching merge tool: %s\n' % cmd)
5668202cfaaf merge: better debug messages before/after invoking external merge tool
Mads Kiilerich <mads@kiilerich.com>
parents: 24099
diff changeset
   344
        r = ui.system(cmd, cwd=repo.root, environ=env)
5668202cfaaf merge: better debug messages before/after invoking external merge tool
Mads Kiilerich <mads@kiilerich.com>
parents: 24099
diff changeset
   345
        repo.ui.debug('merge tool returned: %s\n' % r)
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   346
        return True, r
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   347
    return False, 0
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   348
21519
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   349
def _formatconflictmarker(repo, ctx, template, label, pad):
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   350
    """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
   351
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   352
    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
   353
    can have aligned templated parts.
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   354
    """
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   355
    if ctx.node() is None:
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   356
        ctx = ctx.p1()
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   357
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   358
    props = templatekw.keywords.copy()
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   359
    props['templ'] = template
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   360
    props['ctx'] = ctx
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   361
    props['repo'] = repo
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   362
    templateresult = template('conflictmarker', **props)
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   363
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   364
    label = ('%s:' % label).ljust(pad + 1)
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   365
    mark = '%s %s' % (label, templater.stringify(templateresult))
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   366
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
   367
    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
   368
        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
   369
21865
78e56e70c70a filemerge: use 'util.ellipsis' to trim custom conflict markers correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21864
diff changeset
   370
    # 8 for the prefix of conflict marker lines (e.g. '<<<<<<< ')
78e56e70c70a filemerge: use 'util.ellipsis' to trim custom conflict markers correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21864
diff changeset
   371
    return util.ellipsis(mark, 80 - 8)
21519
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   372
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   373
_defaultconflictmarker = ('{node|short} ' +
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   374
    '{ifeq(tags, "tip", "", "{tags} ")}' +
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   375
    '{if(bookmarks, "{bookmarks} ")}' +
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   376
    '{ifeq(branch, "default", "", "{branch} ")}' +
21693
9c35f3a8cac4 merge: drop the quotes around commit description
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21524
diff changeset
   377
    '- {author|user}: {desc|firstline}')
21519
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   378
21524
47b97d9af27e merge: add labels parameter from merge.update to filemerge
Durham Goode <durham@fb.com>
parents: 21519
diff changeset
   379
_defaultconflictlabels = ['local', 'other']
47b97d9af27e merge: add labels parameter from merge.update to filemerge
Durham Goode <durham@fb.com>
parents: 21519
diff changeset
   380
22026
6966542768ff filemerge: allow the formatting of three labels instead of two
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22025
diff changeset
   381
def _formatlabels(repo, fcd, fco, fca, labels):
21519
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   382
    """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
   383
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   384
    Returns a list of formatted labels.
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   385
    """
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   386
    cd = fcd.changectx()
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   387
    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
   388
    ca = fca.changectx()
21519
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   389
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   390
    ui = repo.ui
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   391
    template = ui.config('ui', 'mergemarkertemplate', _defaultconflictmarker)
22025
5f22975d320d filemerge: drop extra white space
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22023
diff changeset
   392
    tmpl = templater.templater(None, cache={'conflictmarker': template})
21519
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   393
22026
6966542768ff filemerge: allow the formatting of three labels instead of two
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22025
diff changeset
   394
    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
   395
22026
6966542768ff filemerge: allow the formatting of three labels instead of two
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22025
diff changeset
   396
    newlabels = [_formatconflictmarker(repo, cd, tmpl, labels[0], pad),
6966542768ff filemerge: allow the formatting of three labels instead of two
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22025
diff changeset
   397
                 _formatconflictmarker(repo, co, tmpl, labels[1], pad)]
6966542768ff filemerge: allow the formatting of three labels instead of two
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22025
diff changeset
   398
    if len(labels) > 2:
6966542768ff filemerge: allow the formatting of three labels instead of two
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22025
diff changeset
   399
        newlabels.append(_formatconflictmarker(repo, ca, tmpl, labels[2], pad))
6966542768ff filemerge: allow the formatting of three labels instead of two
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22025
diff changeset
   400
    return newlabels
21519
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   401
21524
47b97d9af27e merge: add labels parameter from merge.update to filemerge
Durham Goode <durham@fb.com>
parents: 21519
diff changeset
   402
def filemerge(repo, 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
   403
    """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
   404
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
   405
    mynode = parent node before merge
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
   406
    orig = original local filename before merge
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
   407
    fco = other file context
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
   408
    fca = ancestor file context
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
   409
    fcd = local file context for current/destination file
6003
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   410
    """
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   411
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   412
    def temp(prefix, ctx):
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   413
        pre = "%s~%s." % (os.path.basename(ctx.path()), prefix)
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   414
        (fd, name) = tempfile.mkstemp(prefix=pre)
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   415
        data = repo.wwritedata(ctx.path(), ctx.data())
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   416
        f = os.fdopen(fd, "wb")
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   417
        f.write(data)
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   418
        f.close()
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   419
        return name
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   420
11702
eb07fbc21e9c filectx: use cmp(self, fctx) instead of cmp(self, text)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11149
diff changeset
   421
    if not fco.cmp(fcd): # files identical?
6003
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   422
        return None
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   423
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
   424
    ui = repo.ui
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
   425
    fd = fcd.path()
15738
e86dd8dfdea0 context: add isbinary function
Laurens Holst <laurens.hg@grauw.nl>
parents: 15501
diff changeset
   426
    binary = fcd.isbinary() or fco.isbinary() or fca.isbinary()
6744
d3691d31fc9c context: remove islink and isexec methods
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
   427
    symlink = 'l' in fcd.flags() + fco.flags()
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
   428
    tool, toolpath = _picktool(repo, ui, fd, binary, symlink)
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9049
diff changeset
   429
    ui.debug("picked tool '%s' for %s (binary %s symlink %s)\n" %
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
   430
               (tool, fd, binary, symlink))
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
   431
16126
0c4bec9596d8 filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16125
diff changeset
   432
    if tool in internals:
0c4bec9596d8 filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16125
diff changeset
   433
        func = internals[tool]
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   434
        trymerge = func.trymerge
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   435
        onfailure = func.onfailure
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   436
    else:
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   437
        func = _xmerge
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   438
        trymerge = True
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   439
        onfailure = _("merging %s failed!\n")
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
   440
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   441
    toolconf = tool, toolpath, binary, symlink
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   442
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   443
    if not trymerge:
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   444
        return func(repo, mynode, orig, fcd, fco, fca, toolconf)
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   445
6003
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   446
    a = repo.wjoin(fd)
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   447
    b = temp("base", fca)
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   448
    c = temp("other", fco)
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
   449
    back = a + ".orig"
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
   450
    util.copyfile(a, back)
6003
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   451
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
   452
    if orig != fco.path():
8615
94ca38e63576 use ui instead of repo.ui when the former is in scope
Martin Geisler <mg@lazybytes.net>
parents: 8567
diff changeset
   453
        ui.status(_("merging %s and %s to %s\n") % (orig, fco.path(), fd))
6003
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   454
    else:
8615
94ca38e63576 use ui instead of repo.ui when the former is in scope
Martin Geisler <mg@lazybytes.net>
parents: 8567
diff changeset
   455
        ui.status(_("merging %s\n") % fd)
6512
368a4ec603cc merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents: 6212
diff changeset
   456
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9049
diff changeset
   457
    ui.debug("my %s other %s ancestor %s\n" % (fcd, fco, fca))
6003
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   458
21918
10abc3a5c6b2 filemerge: use 'basic' as the default of '[ui] mergemarkers' for safety
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21865
diff changeset
   459
    markerstyle = ui.config('ui', 'mergemarkers', 'basic')
22021
e9801c7b6ff0 merge: refactor labels selection code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21922
diff changeset
   460
    if not labels:
e9801c7b6ff0 merge: refactor labels selection code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21922
diff changeset
   461
        labels = _defaultconflictlabels
e9801c7b6ff0 merge: refactor labels selection code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21922
diff changeset
   462
    if markerstyle != 'basic':
22026
6966542768ff filemerge: allow the formatting of three labels instead of two
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22025
diff changeset
   463
        labels = _formatlabels(repo, fcd, fco, fca, labels)
21519
25d5a9ecbb85 merge: add conflict marker formatter (BC)
Durham Goode <durham@fb.com>
parents: 21273
diff changeset
   464
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   465
    needcheck, r = func(repo, mynode, orig, fcd, fco, fca, toolconf,
22021
e9801c7b6ff0 merge: refactor labels selection code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21922
diff changeset
   466
                        (a, b, c, back), labels=labels)
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   467
    if not needcheck:
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   468
        if r:
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   469
            if onfailure:
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   470
                ui.warn(onfailure % fd)
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   471
        else:
21100
098a274764b3 filemerge: better handling of failing remove of temporary files
Mads Kiilerich <madski@unity3d.com>
parents: 20676
diff changeset
   472
            util.unlink(back)
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
   473
21100
098a274764b3 filemerge: better handling of failing remove of temporary files
Mads Kiilerich <madski@unity3d.com>
parents: 20676
diff changeset
   474
        util.unlink(b)
098a274764b3 filemerge: better handling of failing remove of temporary files
Mads Kiilerich <madski@unity3d.com>
parents: 20676
diff changeset
   475
        util.unlink(c)
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   476
        return r
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
   477
11148
a912f26777d3 merge: introduce tool.check parameter
David Champion <dgc@uchicago.edu>
parents: 11146
diff changeset
   478
    if not r and (_toolbool(ui, tool, "checkconflicts") or
a912f26777d3 merge: introduce tool.check parameter
David Champion <dgc@uchicago.edu>
parents: 11146
diff changeset
   479
                  'conflicts' in _toollist(ui, tool, "check")):
12046
8e7960feb139 Fix merge-tools.checkconflicts
Thomas Arendsen Hein <thomas@intevation.de>
parents: 12008
diff changeset
   480
        if re.search("^(<<<<<<< .*|=======|>>>>>>> .*)$", fcd.data(),
8e7960feb139 Fix merge-tools.checkconflicts
Thomas Arendsen Hein <thomas@intevation.de>
parents: 12008
diff changeset
   481
                     re.MULTILINE):
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
   482
            r = 1
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
   483
11149
d3c1eddfdbcf merge: tool.check = prompt will force an interactive merge check
David Champion <dgc@uchicago.edu>
parents: 11148
diff changeset
   484
    checked = False
d3c1eddfdbcf merge: tool.check = prompt will force an interactive merge check
David Champion <dgc@uchicago.edu>
parents: 11148
diff changeset
   485
    if 'prompt' in _toollist(ui, tool, "check"):
d3c1eddfdbcf merge: tool.check = prompt will force an interactive merge check
David Champion <dgc@uchicago.edu>
parents: 11148
diff changeset
   486
        checked = True
19226
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 18325
diff changeset
   487
        if ui.promptchoice(_("was merge of '%s' successful (yn)?"
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 18325
diff changeset
   488
                             "$$ &Yes $$ &No") % fd, 1):
11149
d3c1eddfdbcf merge: tool.check = prompt will force an interactive merge check
David Champion <dgc@uchicago.edu>
parents: 11148
diff changeset
   489
            r = 1
d3c1eddfdbcf merge: tool.check = prompt will force an interactive merge check
David Champion <dgc@uchicago.edu>
parents: 11148
diff changeset
   490
d3c1eddfdbcf merge: tool.check = prompt will force an interactive merge check
David Champion <dgc@uchicago.edu>
parents: 11148
diff changeset
   491
    if not r and not checked and (_toolbool(ui, tool, "checkchanged") or
d3c1eddfdbcf merge: tool.check = prompt will force an interactive merge check
David Champion <dgc@uchicago.edu>
parents: 11148
diff changeset
   492
                                  'changed' in _toollist(ui, tool, "check")):
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   493
        if filecmp.cmp(a, back):
9048
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8861
diff changeset
   494
            if ui.promptchoice(_(" output file %s appears unchanged\n"
19226
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 18325
diff changeset
   495
                                 "was merge successful (yn)?"
c58b6ab4c26f ui: merge prompt text components into a singe string
Matt Mackall <mpm@selenic.com>
parents: 18325
diff changeset
   496
                                 "$$ &Yes $$ &No") % fd, 1):
6075
63e0e57ab157 filemerge: add 'checkchanged' merge tool property
Steve Borho <steve@borho.org>
parents: 6025
diff changeset
   497
                r = 1
63e0e57ab157 filemerge: add 'checkchanged' merge tool property
Steve Borho <steve@borho.org>
parents: 6025
diff changeset
   498
6005
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
   499
    if _toolbool(ui, tool, "fixeol"):
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   500
        _matcheol(a, back)
6005
3c33032d8906 merge: add support for tool EOL fixups
Matt Mackall <mpm@selenic.com>
parents: 6004
diff changeset
   501
6003
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   502
    if r:
16125
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   503
        if onfailure:
83925d3a4559 filemerge: refactoring of 'filemerge()'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15738
diff changeset
   504
            ui.warn(onfailure % fd)
6004
5af5f0f9d724 merge: allow smarter tool configuration
Matt Mackall <mpm@selenic.com>
parents: 6003
diff changeset
   505
    else:
21100
098a274764b3 filemerge: better handling of failing remove of temporary files
Mads Kiilerich <madski@unity3d.com>
parents: 20676
diff changeset
   506
        util.unlink(back)
6003
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   507
21100
098a274764b3 filemerge: better handling of failing remove of temporary files
Mads Kiilerich <madski@unity3d.com>
parents: 20676
diff changeset
   508
    util.unlink(b)
098a274764b3 filemerge: better handling of failing remove of temporary files
Mads Kiilerich <madski@unity3d.com>
parents: 20676
diff changeset
   509
    util.unlink(c)
6003
7855b88ba838 filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   510
    return r
16126
0c4bec9596d8 filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16125
diff changeset
   511
0c4bec9596d8 filemerge: create detail of internal merge tools from documentation string
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16125
diff changeset
   512
# 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
   513
i18nfunctions = internals.values()