diff --git a/mercurial/copies.py b/mercurial/copies.py
index 5f2da1c026d8ecc0140a30acf221d137cc4c9c7d_bWVyY3VyaWFsL2NvcGllcy5weQ==..92739143bb6f8d6574bbbd86e7935dd918ce225b_bWVyY3VyaWFsL2NvcGllcy5weQ== 100644
--- a/mercurial/copies.py
+++ b/mercurial/copies.py
@@ -17,6 +17,7 @@
     match as matchmod,
     node,
     pathutil,
+    policy,
     pycompat,
     util,
 )
@@ -26,6 +27,8 @@
 
 from .revlogutils import flagutil
 
+rustmod = policy.importrust("copy_tracing")
+
 
 def _filter(src, dst, t):
     """filters out invalid copies after chaining"""
@@ -310,4 +313,12 @@
 
     It returns the aggregated copies information for `targetrev`.
     """
+
+    alwaysmatch = match.always()
+
+    if rustmod is not None and alwaysmatch:
+        return rustmod.combine_changeset_copies(
+            list(revs), children, targetrev, revinfo, isancestor
+        )
+
     all_copies = {}
@@ -313,5 +324,4 @@
     all_copies = {}
-    alwaysmatch = match.always()
     for r in revs:
         copies = all_copies.pop(r, None)
         if copies is None: