diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -2233,14 +2233,14 @@ def merge(ui, repo, node=None, **opts): node = parent == bheads[0] and bheads[-1] or bheads[0] if opts.get('preview'): - p1 = repo['.'] - p2 = repo[node] - common = p1.ancestor(p2) - roots, heads = [common.node()], [p2.node()] + # find nodes that are ancestors of p2 but not of p1 + p1 = repo.lookup('.') + p2 = repo.lookup(node) + nodes = repo.changelog.findmissing(common=[p1], heads=[p2]) + displayer = cmdutil.show_changeset(ui, repo, opts) - for node in repo.changelog.nodesbetween(roots=roots, heads=heads)[0]: - if node not in roots: - displayer.show(repo[node]) + for node in nodes: + displayer.show(repo[node]) displayer.close() return 0 diff --git a/tests/test-merge-default b/tests/test-merge-default --- a/tests/test-merge-default +++ b/tests/test-merge-default @@ -50,4 +50,11 @@ hg commit -mf echo % should fail because merge with other branch hg merge +# Test for issue2043: ensure that 'merge -P' shows ancestors of 6 that +# are not ancestors of 7, regardless of where their least common +# ancestor is. +echo % merge preview not affected by common ancestor +hg up -q 7 +hg merge -q -P 6 # expect: 2, 4, 5, 6 + true diff --git a/tests/test-merge-default.out b/tests/test-merge-default.out --- a/tests/test-merge-default.out +++ b/tests/test-merge-default.out @@ -34,3 +34,8 @@ created new head % should fail because merge with other branch abort: branch 'foobranch' has one head - please merge with an explicit rev (run 'hg heads' to see all heads) +% merge preview not affected by common ancestor +2:2d95304fed5d +4:f25cbe84d8b3 +5:a431fabd6039 +6:e88e33f3bf62