diff --git a/mercurial/patch.py b/mercurial/patch.py --- a/mercurial/patch.py +++ b/mercurial/patch.py @@ -2258,14 +2258,21 @@ def diff(repo, node1=None, node2=None, m modifiedset = set(modified) addedset = set(added) + removedset = set(removed) for f in modified: if f not in ctx1: # Fix up added, since merged-in additions appear as # modifications during merges modifiedset.remove(f) addedset.add(f) + for f in removed: + if f not in ctx1: + # Merged-in additions that are then removed are reported as removed. + # They are not in ctx1, so We don't want to show them in the diff. + removedset.remove(f) modified = sorted(modifiedset) added = sorted(addedset) + removed = sorted(removedset) def difffn(opts, losedata): return trydiff(repo, revs, ctx1, ctx2, modified, added, removed, diff --git a/tests/test-diffdir.t b/tests/test-diffdir.t --- a/tests/test-diffdir.t +++ b/tests/test-diffdir.t @@ -38,3 +38,33 @@ $ hg diff -r tip -r "" hg: parse error: empty query [255] + +Remove a file that was added via merge. Since the file is not in parent 1, +it should not be in the diff. + + $ hg ci -m 'a=foo' a + $ hg co -Cq null + $ echo 123 > b + $ hg add b + $ hg ci -m "b" + created new head + $ hg merge 1 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ hg rm -f a + $ hg diff --nodates + +Rename a file that was added via merge. Since the rename source is not in +parent 1, the diff should be relative to /dev/null + + $ hg co -Cq 2 + $ hg merge 1 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ hg mv a a2 + $ hg diff --nodates + diff -r cf44b38435e5 a2 + --- /dev/null + +++ b/a2 + @@ -0,0 +1,1 @@ + +foo