# HG changeset patch # User Martin von Zweigbergk # Date 2019-06-28 16:01:45 # Node ID bcb4b5c5964bdd668c23de5770079be4340a8790 # Parent ab416b5d9b91ab4425b2b08f64e87fff324170df copies: move short-circuiting of dirstate copies out of _forwardcopies() I'd like to move the filtering of copies we do after chaining to the end of all chaining (in a single place in pathcopies()). One problem that came up when trying that was that we allow things like `hg cp -f ` so the user can later amend that in. Filtering at the end would mean that we remove those copies. That would break `hg st -C`. This patch therefore moves the short-circuiting of dirstate copies into pathcopies() so we can more easily handle the dirstate-only case differently. I initially thought this might change some behavior when the user does `hg status --rev 'wdir()' --rev .` during an uncommitted merge, since _backwardrenames() would reverse the copies in that case. However, I couldn't come up with a test case where it made a difference. Differential Revision: https://phab.mercurial-scm.org/D6600 diff --git a/mercurial/copies.py b/mercurial/copies.py --- a/mercurial/copies.py +++ b/mercurial/copies.py @@ -324,10 +324,6 @@ def _forwardcopies(a, b, match=None): match = a.repo().narrowmatch(match) # check for working copy if b.rev() is None: - if a == b.p1(): - # short-circuit to avoid issues with merge states - return _dirstatecopies(b._repo, match) - cm = _committedforwardcopies(a, b.p1(), match) # combine copies from dirstate if necessary return _chainandfilter(a, b, cm, _dirstatecopies(b._repo, match)) @@ -367,6 +363,9 @@ def pathcopies(x, y, match=None): if a == x: if debug: repo.ui.debug('debug.copies: search mode: forward\n') + if y.rev() is None and x == y.p1(): + # short-circuit to avoid issues with merge states + return _dirstatecopies(repo, match) return _forwardcopies(x, y, match=match) if a == y: if debug: