diff --git a/mercurial/copies.py b/mercurial/copies.py
index 2545ca662c64a5d10078dfdb03bdd375d3037e84_bWVyY3VyaWFsL2NvcGllcy5weQ==..c716c95d30275e883d9b70765a73cf7fdfd3de10_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: