changeset 41753:3158cb74fbca

copies: make _backwardrenames() filter out copies by destination As shown by the test case, _backwardrenames() doesn't filter by the matcher. It doesn't show up in `hg status --copies` because that only prints files changed between the two commits. I wouldn't be surprised if some other command that replies on pathcopies() was broken before this patch, but I haven't bothered to check other commands. Differential Revision: https://phab.mercurial-scm.org/D5988
author Martin von Zweigbergk <martinvonz@google.com>
date Tue, 19 Feb 2019 10:45:22 -0800
parents 012f695546aa
children d5edb5d3a337
files mercurial/copies.py tests/test-copies.t
diffstat 2 files changed, 8 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/copies.py	Tue Feb 19 10:31:06 2019 -0800
+++ b/mercurial/copies.py	Tue Feb 19 10:45:22 2019 -0800
@@ -228,16 +228,21 @@
         return _chain(a, b, cm, _dirstatecopies(b._repo, match))
     return _committedforwardcopies(a, b, match)
 
-def _backwardrenames(a, b):
+def _backwardrenames(a, b, match):
     if a._repo.ui.config('experimental', 'copytrace') == 'off':
         return {}
 
     # Even though we're not taking copies into account, 1:n rename situations
     # can still exist (e.g. hg cp a b; hg mv a c). In those cases we
     # arbitrarily pick one of the renames.
+    # We don't want to pass in "match" here, since that would filter
+    # the destination by it. Since we're reversing the copies, we want
+    # to filter the source instead.
     f = _forwardcopies(b, a)
     r = {}
     for k, v in sorted(f.iteritems()):
+        if match and not match(v):
+            continue
         # remove copies
         if v in a:
             continue
@@ -261,10 +266,10 @@
     if a == y:
         if debug:
             repo.ui.debug('debug.copies: search mode: backward\n')
-        return _backwardrenames(x, y)
+        return _backwardrenames(x, y, match=match)
     if debug:
         repo.ui.debug('debug.copies: search mode: combined\n')
-    return _chain(x, y, _backwardrenames(x, a),
+    return _chain(x, y, _backwardrenames(x, a, match=match),
                   _forwardcopies(a, y, match=match))
 
 def _computenonoverlap(repo, c1, c2, addedinm1, addedinm2, baselabel=''):
--- a/tests/test-copies.t	Tue Feb 19 10:31:06 2019 -0800
+++ b/tests/test-copies.t	Tue Feb 19 10:45:22 2019 -0800
@@ -33,9 +33,7 @@
   y -> x
   $ hg debugpathcopies 0 1 y
   x -> y
-BROKEN: the following command should not include the copy
   $ hg debugpathcopies 1 0 y
-  y -> x
 
 Copy a file onto another file
   $ newrepo