diff --git a/mercurial/merge.py b/mercurial/merge.py --- a/mercurial/merge.py +++ b/mercurial/merge.py @@ -340,7 +340,7 @@ def _checkcollision(repo, wmf, actions): pmmf.discard(f) pmmf.add(fd) def mergeop(f, args): - f2, fd, move = args + f2, fa, fd, move = args if move: pmmf.discard(f) pmmf.add(fd) @@ -468,7 +468,7 @@ def manifestmerge(repo, wctx, p2, pa, br elif nol and n1 == a: # local only changed 'x' actions.append((f, "g", (fl1,), "remote is newer")) else: # both changed something - actions.append((f, "m", (f, f, False), "versions differ")) + actions.append((f, "m", (f, fa, f, False), "versions differ")) elif f in copied: # files we'll deal with on m2 side pass elif n1 and f in movewithdir: # directory rename @@ -477,7 +477,7 @@ def manifestmerge(repo, wctx, p2, pa, br "remote renamed directory to " + f2)) elif n1 and f in copy: f2 = copy[f] - actions.append((f, "m", (f2, f, False), + actions.append((f, "m", (f2, f2, f, False), "local copied/moved to " + f2)) elif n1 and f in ma: # clean, a different, no remote if n1 != ma[f]: @@ -496,10 +496,10 @@ def manifestmerge(repo, wctx, p2, pa, br elif n2 and f in copy: f2 = copy[f] if f2 in m2: - actions.append((f2, "m", (f, f, False), + actions.append((f2, "m", (f, f2, f, False), "remote copied to " + f)) else: - actions.append((f2, "m", (f, f, True), + actions.append((f2, "m", (f, f2, f, True), "remote moved to " + f)) elif n2 and f not in ma: # local unknown, remote created: the logic is described by the @@ -519,7 +519,8 @@ def manifestmerge(repo, wctx, p2, pa, br else: different = _checkunknownfile(repo, wctx, p2, f) if force and branchmerge and different: - actions.append((f, "m", (f, f, False), + # FIXME: This is wrong - f is not in ma ... + actions.append((f, "m", (f, f, f, False), "remote differs from untracked local")) elif not force and different: aborts.append((f, "ud")) @@ -617,7 +618,7 @@ def applyupdates(repo, actions, wctx, mc f, m, args, msg = a repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m)) if m == "m": # merge - f2, fd, move = args + f2, fa, fd, move = args if fd == '.hgsubstate': # merged internally continue repo.ui.debug(" preserving %s for resolve of %s\n" % (f, fd)) @@ -628,9 +629,9 @@ def applyupdates(repo, actions, wctx, mc fca = fcl.p1() else: fca = repo.filectx(f, fileid=nullrev) + elif fa in actx: + fca = actx[fa] else: - fca = fcl.ancestor(fco, actx) - if not fca: fca = repo.filectx(f, fileid=nullrev) ms.add(fcl, fco, fca, fd) if f != fd and move: @@ -682,7 +683,7 @@ def applyupdates(repo, actions, wctx, mc f, m, args, msg = a progress(_updating, z + i + 1, item=f, total=numupdates, unit=_files) if m == "m": # merge - f2, fd, move = args + f2, fa, fd, move = args if fd == '.hgsubstate': # subrepo states need updating subrepo.submerge(repo, wctx, mctx, wctx.ancestor(mctx), overwrite) @@ -792,7 +793,7 @@ def recordupdates(repo, actions, branchm else: repo.dirstate.normal(f) elif m == "m": # merge - f2, fd, move = args + f2, fa, fd, move = args if branchmerge: # We've done a branch merge, mark this file as merged # so that we properly record the merger later diff --git a/tests/test-merge-types.t b/tests/test-merge-types.t --- a/tests/test-merge-types.t +++ b/tests/test-merge-types.t @@ -268,6 +268,7 @@ h: l vs l, different merging b warning: conflicts during merge. merging b incomplete! (edit conflicts, then use 'hg resolve --mark') + warning: cannot merge flags for c merging d warning: internal:merge cannot merge symlinks for d merging d incomplete! (edit conflicts, then use 'hg resolve --mark') @@ -328,6 +329,7 @@ h: l vs l, different merging b warning: conflicts during merge. merging b incomplete! (edit conflicts, then use 'hg resolve --mark') + warning: cannot merge flags for c merging d warning: internal:merge cannot merge symlinks for d merging d incomplete! (edit conflicts, then use 'hg resolve --mark') @@ -355,7 +357,7 @@ h: l vs l, different 2 >>>>>>> other $ tellmeabout c - c is a plain file with content: + c is an executable file with content: x $ tellmeabout d d is an executable file with content: