Patchwork D9585: copies: properly match result during changeset centric copy tracing

login
register
mail settings
Submitter phabricator
Date Dec. 14, 2020, 11:17 a.m.
Message ID <differential-rev-PHID-DREV-qr62iiciqna2xv6mu4fd-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/47884/
State Superseded
Headers show

Comments

phabricator - Dec. 14, 2020, 11:17 a.m.
marmoute created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  By filtering "during" the iteration we were excluding rename information that
  were not in the matched set but that file served as base information for the
  matched set.
  
  We now do all copy tracing matching at the end of the process to ensure we raise
  proper result.
  
  If we were aggregating information top down instead of bottom up we could do
  filtering during processing. However, we don't.

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D9585

AFFECTED FILES
  mercurial/copies.py
  tests/test-copies-chain-merge.t

CHANGE DETAILS




To: marmoute, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

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
@@ -872,6 +872,19 @@ 
 Test copy information chaining
 ==============================
 
+Check that matching only affect the destination and not intermediate path
+-------------------------------------------------------------------------
+
+The two status call should give the same value for f
+
+  $ hg status --copies --rev 'desc("i-0")' --rev 'desc("a-2")'
+  A f
+    a
+  R a
+  $ hg status --copies --rev 'desc("i-0")' --rev 'desc("a-2")' f
+  A f
+    a (no-changeset no-compatibility !)
+
 merging with unrelated change does not interfere with the renames
 ---------------------------------------------------------------
 
diff --git a/mercurial/copies.py b/mercurial/copies.py
--- a/mercurial/copies.py
+++ b/mercurial/copies.py
@@ -196,7 +196,7 @@ 
 
     alwaysmatch = match.always()
 
-    if rustmod is not None and alwaysmatch:
+    if rustmod is not None:
 
         def revinfo(rev):
             p1, p2 = parents(rev)
@@ -355,7 +355,7 @@ 
 
     alwaysmatch = match.always()
 
-    if rustmod is not None and alwaysmatch:
+    if rustmod is not None:
         final_copies = rustmod.combine_changeset_copies(
             list(revs), children_count, targetrev, revinfo, isancestor
         )
@@ -395,12 +395,6 @@ 
                     elif parent == 2:
                         childcopies = changes.copied_from_p2
 
-                    if not alwaysmatch:
-                        childcopies = {
-                            dst: src
-                            for dst, src in childcopies.items()
-                            if match(dst)
-                        }
                     if childcopies:
                         newcopies = copies.copy()
                         for dest, source in pycompat.iteritems(childcopies):
@@ -446,6 +440,10 @@ 
         for dest, (tt, source) in all_copies[targetrev].items():
             if source is not None:
                 final_copies[dest] = source
+    if not alwaysmatch:
+        for filename in list(final_copies.keys()):
+            if not match(filename):
+                del final_copies[filename]
     return final_copies