# HG changeset patch # User Pierre-Yves David # Date 2020-09-16 19:00:02 # Node ID a8fb29b05f92c402987113bfa1bc7cc50242f35e # Parent e53778ad64bf159126bb64ed81ceb526f3a9f425 salvaged: properly deal with salvaged file during copy tracing When salvaged files are encountered, the removal have been reverted and we should keep the rename information from the other side. The conditional was starting to be quite hairy, so we spell it out in multiple elif case for readability. This fixes the associated test cases introduced a while back. The changeset centric copy tracing is now (known) bug free. Differential Revision: https://phab.mercurial-scm.org/D9130 diff --git a/mercurial/copies.py b/mercurial/copies.py --- a/mercurial/copies.py +++ b/mercurial/copies.py @@ -371,11 +371,15 @@ def _merge_copies_dict(minor, major, isa 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 @@ -892,15 +892,15 @@ copy tracing chain. 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 @@ -955,17 +955,17 @@ copy tracing chain. 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