D5988: copies: make _backwardrenames() filter out copies by destination

martinvonz (Martin von Zweigbergk) phabricator at mercurial-scm.org
Wed Feb 20 19:27:51 EST 2019

martinvonz created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

  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.

  rHG Mercurial




diff --git a/tests/test-copies.t b/tests/test-copies.t
--- a/tests/test-copies.t
+++ b/tests/test-copies.t
@@ -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
diff --git a/mercurial/copies.py b/mercurial/copies.py
--- a/mercurial/copies.py
+++ b/mercurial/copies.py
@@ -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:
@@ -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=''):

To: martinvonz, #hg-reviewers
Cc: mercurial-devel

More information about the Mercurial-devel mailing list