diff --git a/mercurial/copies.py b/mercurial/copies.py --- a/mercurial/copies.py +++ b/mercurial/copies.py @@ -371,11 +371,15 @@ continue # content from "major" wins, unless it is older # than the branch point or there is a merge - if ( - new_tt == other_tt - or not isancestor(new_tt, other_tt) - or dest in changes.merged - ): + if new_tt == other_tt: + minor[dest] = value + elif value[1] is None and dest in changes.salvaged: + pass + elif other[1] is None and dest in changes.salvaged: + minor[dest] = value + elif not isancestor(new_tt, other_tt): + minor[dest] = value + elif dest in changes.merged: minor[dest] = value diff --git a/tests/test-copies-chain-merge.t b/tests/test-copies-chain-merge.t --- a/tests/test-copies-chain-merge.t +++ b/tests/test-copies-chain-merge.t @@ -897,15 +897,15 @@ o 0 i-0 initial commit: a b h -BROKEN: 'a' should be the the source of 'd' in the changeset centric algorithm too +'a' is the copy source of 'd' $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCGm-0")' A d - a (filelog !) + a (no-compatibility !) R a $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mGCm-0")' A d - a (filelog !) + a (no-compatibility !) R a $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mCGm-0")' A d @@ -960,17 +960,17 @@ o 0 i-0 initial commit: a b h -BROKEN: 'a' should be the the source of 'd' in the changeset centric algorithm too +'a' is the the copy source of 'd' $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCB-revert-m-0")' M b A d - a (filelog !) + a (no-compatibility !) R a $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBC-revert-m-0")' M b A d - a (filelog !) + a (no-compatibility !) R a $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mCB-revert-m-0")' M b