# HG changeset patch # User Pierre-Yves David # Date 2019-09-09 15:32:21 # Node ID a4ca0610c754a65262a81ee327af1e4bf6875331 # Parent 344a086bb7647509624102ffdc6dc52bfe9beeba merge: respect parents order when using `graft` on a merge The previous code did not record the index of the replaced parent. It was always using the "graft" destination as `p1`. This could switch parents order in some situation (eg: some of the evolve evolving merge case). Recording and using the information fixes the issue in evolve. We are not aware of core commands calling graft in that fashion, so we could not build a simple test case for it using core commands. diff --git a/mercurial/merge.py b/mercurial/merge.py --- a/mercurial/merge.py +++ b/mercurial/merge.py @@ -2249,17 +2249,23 @@ def graft(repo, ctx, pctx, labels=None, mergeancestor=mergeancestor, labels=labels) + potherp1 = False if keepconflictparent and stats.unresolvedcount: pother = ctx.node() else: pother = nullid parents = ctx.parents() if keepparent and len(parents) == 2 and pctx in parents: + if pctx == parents[0]: + potherp1 = True parents.remove(pctx) pother = parents[0].node() with repo.dirstate.parentchange(): - repo.setparents(repo['.'].node(), pother) + if potherp1: + repo.setparents(pother, repo['.'].node()) + else: + repo.setparents(repo['.'].node(), pother) repo.dirstate.write(repo.currenttransaction()) # fix up dirstate for copies and renames copies.duplicatecopies(repo, repo[None], ctx.rev(), pctx.rev())