mercurial/merge.py
author Brendan Cully <brendan@kublai.com>
Fri, 18 Aug 2006 10:05:44 -0700
changeset 2931 0843bd53dcff
parent 2899 8743188f4d2e
child 2968 545d33aa3f82
permissions -rw-r--r--
Fix bug #345. The last hit for a file might have been before the last window, so we can't clear copies. To reduce the load, we only store real copy entries instead of storing hashes for every revision.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     1
# merge.py - directory-level update/merge handling for Mercurial
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     2
#
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     3
# Copyright 2006 Matt Mackall <mpm@selenic.com>
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     4
#
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     6
# of the GNU General Public License, incorporated herein by reference.
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     7
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     8
from node import *
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     9
from i18n import gettext as _
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    10
from demandload import *
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    11
demandload(globals(), "util os tempfile")
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    12
2892
dd41ad984f71 merge: factor out exec bit merge function
Matt Mackall <mpm@selenic.com>
parents: 2891
diff changeset
    13
def fmerge(f, local, other, ancestor):
dd41ad984f71 merge: factor out exec bit merge function
Matt Mackall <mpm@selenic.com>
parents: 2891
diff changeset
    14
    """merge executable flags"""
dd41ad984f71 merge: factor out exec bit merge function
Matt Mackall <mpm@selenic.com>
parents: 2891
diff changeset
    15
    a, b, c = ancestor.execf(f), local.execf(f), other.execf(f)
dd41ad984f71 merge: factor out exec bit merge function
Matt Mackall <mpm@selenic.com>
parents: 2891
diff changeset
    16
    return ((a^b) | (a^c)) ^ a
dd41ad984f71 merge: factor out exec bit merge function
Matt Mackall <mpm@selenic.com>
parents: 2891
diff changeset
    17
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    18
def merge3(repo, fn, my, other, p1, p2):
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    19
    """perform a 3-way merge in the working directory"""
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    20
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    21
    def temp(prefix, node):
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    22
        pre = "%s~%s." % (os.path.basename(fn), prefix)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    23
        (fd, name) = tempfile.mkstemp(prefix=pre)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    24
        f = os.fdopen(fd, "wb")
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    25
        repo.wwrite(fn, fl.read(node), f)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    26
        f.close()
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    27
        return name
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    28
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    29
    fl = repo.file(fn)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    30
    base = fl.ancestor(my, other)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    31
    a = repo.wjoin(fn)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    32
    b = temp("base", base)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    33
    c = temp("other", other)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    34
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    35
    repo.ui.note(_("resolving %s\n") % fn)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    36
    repo.ui.debug(_("file %s: my %s other %s ancestor %s\n") %
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    37
                          (fn, short(my), short(other), short(base)))
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    38
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    39
    cmd = (os.environ.get("HGMERGE") or repo.ui.config("ui", "merge")
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    40
           or "hgmerge")
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    41
    r = util.system('%s "%s" "%s" "%s"' % (cmd, a, b, c), cwd=repo.root,
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    42
                    environ={'HG_FILE': fn,
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    43
                             'HG_MY_NODE': p1,
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    44
                             'HG_OTHER_NODE': p2,
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    45
                             'HG_FILE_MY_NODE': hex(my),
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    46
                             'HG_FILE_OTHER_NODE': hex(other),
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    47
                             'HG_FILE_BASE_NODE': hex(base)})
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    48
    if r:
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    49
        repo.ui.warn(_("merging %s failed!\n") % fn)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    50
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    51
    os.unlink(b)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    52
    os.unlink(c)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    53
    return r
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    54
2811
1ea086bc2086 Merge: combine choose and moddirstate to partial
Matt Mackall <mpm@selenic.com>
parents: 2810
diff changeset
    55
def update(repo, node, branchmerge=False, force=False, partial=None,
2815
4870f795f681 Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents: 2814
diff changeset
    56
           wlock=None, show_stats=True, remind=True):
4870f795f681 Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents: 2814
diff changeset
    57
4870f795f681 Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents: 2814
diff changeset
    58
    overwrite = force and not branchmerge
4870f795f681 Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents: 2814
diff changeset
    59
    forcemerge = force and branchmerge
2812
3aeab7bb5adc Refactor update locking slightly
Matt Mackall <mpm@selenic.com>
parents: 2811
diff changeset
    60
3aeab7bb5adc Refactor update locking slightly
Matt Mackall <mpm@selenic.com>
parents: 2811
diff changeset
    61
    if not wlock:
3aeab7bb5adc Refactor update locking slightly
Matt Mackall <mpm@selenic.com>
parents: 2811
diff changeset
    62
        wlock = repo.wlock()
3aeab7bb5adc Refactor update locking slightly
Matt Mackall <mpm@selenic.com>
parents: 2811
diff changeset
    63
2814
0f787997e3c2 Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents: 2813
diff changeset
    64
    ### check phase
0f787997e3c2 Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents: 2813
diff changeset
    65
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    66
    pl = repo.dirstate.parents()
2815
4870f795f681 Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents: 2814
diff changeset
    67
    if not overwrite and pl[1] != nullid:
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    68
        raise util.Abort(_("outstanding uncommitted merges"))
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    69
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    70
    p1, p2 = pl[0], node
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    71
    pa = repo.changelog.ancestor(p1, p2)
2814
0f787997e3c2 Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents: 2813
diff changeset
    72
0f787997e3c2 Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents: 2813
diff changeset
    73
    # is there a linear path from p1 to p2?
0f787997e3c2 Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents: 2813
diff changeset
    74
    linear_path = (pa == p1 or pa == p2)
0f787997e3c2 Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents: 2813
diff changeset
    75
    if branchmerge and linear_path:
0f787997e3c2 Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents: 2813
diff changeset
    76
        raise util.Abort(_("there is nothing to merge, just use "
0f787997e3c2 Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents: 2813
diff changeset
    77
                           "'hg update' or look at 'hg heads'"))
0f787997e3c2 Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents: 2813
diff changeset
    78
2815
4870f795f681 Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents: 2814
diff changeset
    79
    if not overwrite and not linear_path and not branchmerge:
4870f795f681 Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents: 2814
diff changeset
    80
        raise util.Abort(_("update spans branches, use 'hg merge' "
2814
0f787997e3c2 Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents: 2813
diff changeset
    81
                           "or 'hg update -C' to lose changes"))
0f787997e3c2 Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents: 2813
diff changeset
    82
2875
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2838
diff changeset
    83
    modified, added, removed, deleted, unknown = repo.status()[:5]
2814
0f787997e3c2 Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents: 2813
diff changeset
    84
    if branchmerge and not forcemerge:
0f787997e3c2 Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents: 2813
diff changeset
    85
        if modified or added or removed:
0f787997e3c2 Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents: 2813
diff changeset
    86
            raise util.Abort(_("outstanding uncommitted changes"))
0f787997e3c2 Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents: 2813
diff changeset
    87
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    88
    m1n = repo.changelog.read(p1)[0]
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    89
    m2n = repo.changelog.read(p2)[0]
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    90
    man = repo.manifest.ancestor(m1n, m2n)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    91
    m1 = repo.manifest.read(m1n)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    92
    m2 = repo.manifest.read(m2n).copy()
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    93
    ma = repo.manifest.read(man)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    94
2842
06c05c675a35 merge: minor simplification
Matt Mackall <mpm@selenic.com>
parents: 2838
diff changeset
    95
    if not force:
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    96
        for f in unknown:
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    97
            if f in m2:
2891
95cc73523983 Use revlog hash comparison technique in merge
Matt Mackall <mpm@selenic.com>
parents: 2886
diff changeset
    98
                if repo.file(f).cmp(m2[f], repo.wread(f)):
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    99
                    raise util.Abort(_("'%s' already exists in the working"
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   100
                                       " dir and differs from remote") % f)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   101
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   102
    # resolve the manifest to determine which files
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   103
    # we care about merging
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   104
    repo.ui.note(_("resolving manifests\n"))
2815
4870f795f681 Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents: 2814
diff changeset
   105
    repo.ui.debug(_(" overwrite %s branchmerge %s partial %s linear %s\n") %
2896
834e147842d7 trivial bool() cleanup
Matt Mackall <mpm@selenic.com>
parents: 2894
diff changeset
   106
                  (overwrite, branchmerge, bool(partial), linear_path))
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   107
    repo.ui.debug(_(" ancestor %s local %s remote %s\n") %
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   108
                  (short(man), short(m1n), short(m2n)))
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   109
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   110
    merge = {}
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   111
    get = {}
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   112
    remove = []
2897
dd032b0f02ac merge: move forgets to the apply stage
Matt Mackall <mpm@selenic.com>
parents: 2896
diff changeset
   113
    forget = []
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   114
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   115
    # construct a working dir manifest
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   116
    mw = m1.copy()
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   117
    umap = dict.fromkeys(unknown)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   118
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   119
    for f in added + modified + unknown:
2894
f28f4c850cd8 merge: hoist some working manifest logic out of merge loop
Matt Mackall <mpm@selenic.com>
parents: 2893
diff changeset
   120
        mw[f] = ""
f28f4c850cd8 merge: hoist some working manifest logic out of merge loop
Matt Mackall <mpm@selenic.com>
parents: 2893
diff changeset
   121
        # is the wfile new and matches m2?
f28f4c850cd8 merge: hoist some working manifest logic out of merge loop
Matt Mackall <mpm@selenic.com>
parents: 2893
diff changeset
   122
        if (f not in m1 and f in m2 and
f28f4c850cd8 merge: hoist some working manifest logic out of merge loop
Matt Mackall <mpm@selenic.com>
parents: 2893
diff changeset
   123
            not repo.file(f).cmp(m2[f], repo.wread(f))):
f28f4c850cd8 merge: hoist some working manifest logic out of merge loop
Matt Mackall <mpm@selenic.com>
parents: 2893
diff changeset
   124
            mw[f] = m2[f]
f28f4c850cd8 merge: hoist some working manifest logic out of merge loop
Matt Mackall <mpm@selenic.com>
parents: 2893
diff changeset
   125
2838
b11c014dcbd9 Merge: use single objects for tracking manifests
Matt Mackall <mpm@selenic.com>
parents: 2837
diff changeset
   126
        mw.set(f, util.is_exec(repo.wjoin(f), mw.execf(f)))
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   127
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   128
    for f in deleted + removed:
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   129
        if f in mw:
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   130
            del mw[f]
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   131
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   132
        # If we're jumping between revisions (as opposed to merging),
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   133
        # and if neither the working directory nor the target rev has
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   134
        # the file, then we need to remove it from the dirstate, to
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   135
        # prevent the dirstate from listing the file when it is no
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   136
        # longer in the manifest.
2897
dd032b0f02ac merge: move forgets to the apply stage
Matt Mackall <mpm@selenic.com>
parents: 2896
diff changeset
   137
        if linear_path and f not in m2:
dd032b0f02ac merge: move forgets to the apply stage
Matt Mackall <mpm@selenic.com>
parents: 2896
diff changeset
   138
            forget.append(f)
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   139
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   140
    # Compare manifests
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   141
    for f, n in mw.iteritems():
2811
1ea086bc2086 Merge: combine choose and moddirstate to partial
Matt Mackall <mpm@selenic.com>
parents: 2810
diff changeset
   142
        if partial and not partial(f):
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   143
            continue
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   144
        if f in m2:
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   145
            s = 0
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   146
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   147
            # are files different?
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   148
            if n != m2[f]:
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   149
                a = ma.get(f, nullid)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   150
                # are both different from the ancestor?
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   151
                if n != a and m2[f] != a:
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   152
                    repo.ui.debug(_(" %s versions differ, resolve\n") % f)
2892
dd41ad984f71 merge: factor out exec bit merge function
Matt Mackall <mpm@selenic.com>
parents: 2891
diff changeset
   153
                    merge[f] = (fmerge(f, mw, m2, ma), m1.get(f, nullid), m2[f])
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   154
                    s = 1
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   155
                # are we clobbering?
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   156
                # is remote's version newer?
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   157
                # or are we going back in time?
2815
4870f795f681 Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents: 2814
diff changeset
   158
                elif overwrite or m2[f] != a or (p2 == pa and mw[f] == m1[f]):
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   159
                    repo.ui.debug(_(" remote %s is newer, get\n") % f)
2837
19b3bc840182 Merge: save away mode bit so that we don't need manifest later
Matt Mackall <mpm@selenic.com>
parents: 2836
diff changeset
   160
                    get[f] = (m2.execf(f), m2[f])
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   161
                    s = 1
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   162
            elif f in umap or f in added:
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   163
                # this unknown file is the same as the checkout
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   164
                # we need to reset the dirstate if the file was added
2837
19b3bc840182 Merge: save away mode bit so that we don't need manifest later
Matt Mackall <mpm@selenic.com>
parents: 2836
diff changeset
   165
                get[f] = (m2.execf(f), m2[f])
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   166
2838
b11c014dcbd9 Merge: use single objects for tracking manifests
Matt Mackall <mpm@selenic.com>
parents: 2837
diff changeset
   167
            if not s and mw.execf(f) != m2.execf(f):
2815
4870f795f681 Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents: 2814
diff changeset
   168
                if overwrite:
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   169
                    repo.ui.debug(_(" updating permissions for %s\n") % f)
2838
b11c014dcbd9 Merge: use single objects for tracking manifests
Matt Mackall <mpm@selenic.com>
parents: 2837
diff changeset
   170
                    util.set_exec(repo.wjoin(f), m2.execf(f))
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   171
                else:
2892
dd41ad984f71 merge: factor out exec bit merge function
Matt Mackall <mpm@selenic.com>
parents: 2891
diff changeset
   172
                    if fmerge(f, mw, m2, ma) != mw.execf(f):
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   173
                        repo.ui.debug(_(" updating permissions for %s\n")
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   174
                                      % f)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   175
                        util.set_exec(repo.wjoin(f), mode)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   176
            del m2[f]
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   177
        elif f in ma:
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   178
            if n != ma[f]:
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   179
                r = _("d")
2815
4870f795f681 Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents: 2814
diff changeset
   180
                if not overwrite and (linear_path or branchmerge):
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   181
                    r = repo.ui.prompt(
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   182
                        (_(" local changed %s which remote deleted\n") % f) +
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   183
                         _("(k)eep or (d)elete?"), _("[kd]"), _("k"))
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   184
                if r == _("d"):
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   185
                    remove.append(f)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   186
            else:
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   187
                repo.ui.debug(_("other deleted %s\n") % f)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   188
                remove.append(f) # other deleted it
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   189
        else:
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   190
            # file is created on branch or in working directory
2815
4870f795f681 Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents: 2814
diff changeset
   191
            if overwrite and f not in umap:
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   192
                repo.ui.debug(_("remote deleted %s, clobbering\n") % f)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   193
                remove.append(f)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   194
            elif n == m1.get(f, nullid): # same as parent
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   195
                if p2 == pa: # going backwards?
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   196
                    repo.ui.debug(_("remote deleted %s\n") % f)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   197
                    remove.append(f)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   198
                else:
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   199
                    repo.ui.debug(_("local modified %s, keeping\n") % f)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   200
            else:
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   201
                repo.ui.debug(_("working dir created %s, keeping\n") % f)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   202
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   203
    for f, n in m2.iteritems():
2811
1ea086bc2086 Merge: combine choose and moddirstate to partial
Matt Mackall <mpm@selenic.com>
parents: 2810
diff changeset
   204
        if partial and not partial(f):
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   205
            continue
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   206
        if f[0] == "/":
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   207
            continue
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   208
        if f in ma and n != ma[f]:
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   209
            r = _("k")
2815
4870f795f681 Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents: 2814
diff changeset
   210
            if not overwrite and (linear_path or branchmerge):
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   211
                r = repo.ui.prompt(
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   212
                    (_("remote changed %s which local deleted\n") % f) +
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   213
                     _("(k)eep or (d)elete?"), _("[kd]"), _("k"))
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   214
            if r == _("k"):
2837
19b3bc840182 Merge: save away mode bit so that we don't need manifest later
Matt Mackall <mpm@selenic.com>
parents: 2836
diff changeset
   215
                get[f] = (m2.execf(f), n)
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   216
        elif f not in ma:
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   217
            repo.ui.debug(_("remote created %s\n") % f)
2837
19b3bc840182 Merge: save away mode bit so that we don't need manifest later
Matt Mackall <mpm@selenic.com>
parents: 2836
diff changeset
   218
            get[f] = (m2.execf(f), n)
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   219
        else:
2815
4870f795f681 Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents: 2814
diff changeset
   220
            if overwrite or p2 == pa: # going backwards?
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   221
                repo.ui.debug(_("local deleted %s, recreating\n") % f)
2837
19b3bc840182 Merge: save away mode bit so that we don't need manifest later
Matt Mackall <mpm@selenic.com>
parents: 2836
diff changeset
   222
                get[f] = (m2.execf(f), n)
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   223
            else:
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   224
                repo.ui.debug(_("local deleted %s\n") % f)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   225
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   226
    del mw, m1, m2, ma
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   227
2897
dd032b0f02ac merge: move forgets to the apply stage
Matt Mackall <mpm@selenic.com>
parents: 2896
diff changeset
   228
    ### apply phase
dd032b0f02ac merge: move forgets to the apply stage
Matt Mackall <mpm@selenic.com>
parents: 2896
diff changeset
   229
2815
4870f795f681 Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents: 2814
diff changeset
   230
    if overwrite:
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   231
        for f in merge:
2837
19b3bc840182 Merge: save away mode bit so that we don't need manifest later
Matt Mackall <mpm@selenic.com>
parents: 2836
diff changeset
   232
            get[f] = merge[f][:2]
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   233
        merge = {}
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   234
2815
4870f795f681 Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents: 2814
diff changeset
   235
    if linear_path or overwrite:
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   236
        # we don't need to do any magic, just jump to the new rev
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   237
        p1, p2 = p2, nullid
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   238
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   239
    xp1 = hex(p1)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   240
    xp2 = hex(p2)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   241
    if p2 == nullid: xxp2 = ''
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   242
    else: xxp2 = xp2
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   243
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   244
    repo.hook('preupdate', throw=True, parent1=xp1, parent2=xxp2)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   245
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   246
    # get the files we don't need to change
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   247
    files = get.keys()
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   248
    files.sort()
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   249
    for f in files:
2837
19b3bc840182 Merge: save away mode bit so that we don't need manifest later
Matt Mackall <mpm@selenic.com>
parents: 2836
diff changeset
   250
        flag, node = get[f]
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   251
        if f[0] == "/":
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   252
            continue
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   253
        repo.ui.note(_("getting %s\n") % f)
2837
19b3bc840182 Merge: save away mode bit so that we don't need manifest later
Matt Mackall <mpm@selenic.com>
parents: 2836
diff changeset
   254
        t = repo.file(f).read(node)
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   255
        repo.wwrite(f, t)
2837
19b3bc840182 Merge: save away mode bit so that we don't need manifest later
Matt Mackall <mpm@selenic.com>
parents: 2836
diff changeset
   256
        util.set_exec(repo.wjoin(f), flag)
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   257
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   258
    # merge the tricky bits
2813
56f99f5aab34 Merge: refactor err and failedmerge -> unresolved
Matt Mackall <mpm@selenic.com>
parents: 2812
diff changeset
   259
    unresolved = []
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   260
    files = merge.keys()
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   261
    files.sort()
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   262
    for f in files:
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   263
        repo.ui.status(_("merging %s\n") % f)
2837
19b3bc840182 Merge: save away mode bit so that we don't need manifest later
Matt Mackall <mpm@selenic.com>
parents: 2836
diff changeset
   264
        flag, my, other = merge[f]
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   265
        ret = merge3(repo, f, my, other, xp1, xp2)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   266
        if ret:
2813
56f99f5aab34 Merge: refactor err and failedmerge -> unresolved
Matt Mackall <mpm@selenic.com>
parents: 2812
diff changeset
   267
            unresolved.append(f)
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   268
        util.set_exec(repo.wjoin(f), flag)
2899
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   269
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   270
    remove.sort()
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   271
    for f in remove:
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   272
        repo.ui.note(_("removing %s\n") % f)
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   273
        util.audit_path(f)
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   274
        try:
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   275
            util.unlink(repo.wjoin(f))
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   276
        except OSError, inst:
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   277
            if inst.errno != errno.ENOENT:
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   278
                repo.ui.warn(_("update failed to remove %s: %s!\n") %
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   279
                             (f, inst.strerror))
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   280
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   281
    # update dirstate
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   282
    if not partial:
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   283
        repo.dirstate.setparents(p1, p2)
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   284
        repo.dirstate.forget(forget)
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   285
        if branchmerge:
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   286
            repo.dirstate.update(remove, 'r')
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   287
        else:
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   288
            repo.dirstate.forget(remove)
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   289
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   290
        files = get.keys()
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   291
        files.sort()
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   292
        for f in files:
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   293
            if branchmerge:
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   294
                repo.dirstate.update([f], 'n', st_mtime=-1)
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   295
            else:
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   296
                repo.dirstate.update([f], 'n')
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   297
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   298
        files = merge.keys()
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   299
        files.sort()
8743188f4d2e merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents: 2898
diff changeset
   300
        for f in files:
2810
ca06d35af65e Rename merge.allow -> merge.branchmerge
Matt Mackall <mpm@selenic.com>
parents: 2803
diff changeset
   301
            if branchmerge:
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   302
                # We've done a branch merge, mark this file as merged
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   303
                # so that we properly record the merger later
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   304
                repo.dirstate.update([f], 'm')
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   305
            else:
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   306
                # We've update-merged a locally modified file, so
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   307
                # we set the dirstate to emulate a normal checkout
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   308
                # of that file some time in the past. Thus our
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   309
                # merge will appear as a normal local file
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   310
                # modification.
2898
db397c38005d merge: use file size stored in revlog index
Matt Mackall <mpm@selenic.com>
parents: 2897
diff changeset
   311
                fl = repo.file(f)
db397c38005d merge: use file size stored in revlog index
Matt Mackall <mpm@selenic.com>
parents: 2897
diff changeset
   312
                f_len = fl.size(fl.rev(other))
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   313
                repo.dirstate.update([f], 'n', st_size=f_len, st_mtime=-1)
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   314
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   315
    if show_stats:
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   316
        stats = ((len(get), _("updated")),
2813
56f99f5aab34 Merge: refactor err and failedmerge -> unresolved
Matt Mackall <mpm@selenic.com>
parents: 2812
diff changeset
   317
                 (len(merge) - len(unresolved), _("merged")),
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   318
                 (len(remove), _("removed")),
2813
56f99f5aab34 Merge: refactor err and failedmerge -> unresolved
Matt Mackall <mpm@selenic.com>
parents: 2812
diff changeset
   319
                 (len(unresolved), _("unresolved")))
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   320
        note = ", ".join([_("%d files %s") % s for s in stats])
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   321
        repo.ui.status("%s\n" % note)
2811
1ea086bc2086 Merge: combine choose and moddirstate to partial
Matt Mackall <mpm@selenic.com>
parents: 2810
diff changeset
   322
    if not partial:
2810
ca06d35af65e Rename merge.allow -> merge.branchmerge
Matt Mackall <mpm@selenic.com>
parents: 2803
diff changeset
   323
        if branchmerge:
2813
56f99f5aab34 Merge: refactor err and failedmerge -> unresolved
Matt Mackall <mpm@selenic.com>
parents: 2812
diff changeset
   324
            if unresolved:
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   325
                repo.ui.status(_("There are unresolved merges,"
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   326
                                " you can redo the full merge using:\n"
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   327
                                "  hg update -C %s\n"
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   328
                                "  hg merge %s\n"
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   329
                                % (repo.changelog.rev(p1),
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   330
                                    repo.changelog.rev(p2))))
2803
987c31e2a08c Merge with crew
Matt Mackall <mpm@selenic.com>
parents: 2775
diff changeset
   331
            elif remind:
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   332
                repo.ui.status(_("(branch merge, don't forget to commit)\n"))
2813
56f99f5aab34 Merge: refactor err and failedmerge -> unresolved
Matt Mackall <mpm@selenic.com>
parents: 2812
diff changeset
   333
        elif unresolved:
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   334
            repo.ui.status(_("There are unresolved merges with"
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   335
                             " locally modified files.\n"))
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   336
2813
56f99f5aab34 Merge: refactor err and failedmerge -> unresolved
Matt Mackall <mpm@selenic.com>
parents: 2812
diff changeset
   337
    repo.hook('update', parent1=xp1, parent2=xxp2, error=len(unresolved))
56f99f5aab34 Merge: refactor err and failedmerge -> unresolved
Matt Mackall <mpm@selenic.com>
parents: 2812
diff changeset
   338
    return len(unresolved)
2775
b550cd82f92a Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   339