# HG changeset patch # User Mads Kiilerich # Date 1393356608 -3600 # Node ID 0b50788c160c05962bc3d147431fd1bc61dc2f28 # Parent 9fae01831deab65c66879a2b0eb7fd13427c1c52 merge: use ancestor filename from planning phase instead of filectx ancestor test-merge-types.t changes a bit in flag merging. It relied on the implementation detail that 100% identical revlog entries are reused. The revlog reuse did that fctx.ancestor() saw an ancestor where there really not was one. diff -r 9fae01831dea -r 0b50788c160c mercurial/merge.py --- a/mercurial/merge.py Wed Apr 02 00:01:21 2014 -0700 +++ b/mercurial/merge.py Tue Feb 25 20:30:08 2014 +0100 @@ -340,7 +340,7 @@ 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 @@ 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 @@ "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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 -r 9fae01831dea -r 0b50788c160c tests/test-merge-types.t --- a/tests/test-merge-types.t Wed Apr 02 00:01:21 2014 -0700 +++ b/tests/test-merge-types.t Tue Feb 25 20:30:08 2014 +0100 @@ -268,6 +268,7 @@ 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 @@ 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 @@ 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: