diff --git a/rust/hg-core/src/copy_tracing.rs b/rust/hg-core/src/copy_tracing.rs
index d2ad44b8ef6a63a7b74a122975a6dc6b8b26caaa_cnVzdC9oZy1jb3JlL3NyYy9jb3B5X3RyYWNpbmcucnM=..a34cd9aa33234c67d658c1a487111e7ca376a025_cnVzdC9oZy1jb3JlL3NyYy9jb3B5X3RyYWNpbmcucnM= 100644
--- a/rust/hg-core/src/copy_tracing.rs
+++ b/rust/hg-core/src/copy_tracing.rs
@@ -107,7 +107,8 @@
     Removed(&'a HgPath),
     /// The parent ? children edge introduce copy information between (dest,
     /// source)
-    Copied(&'a HgPath, &'a HgPath),
+    CopiedFromP1(&'a HgPath, &'a HgPath),
+    CopiedFromP2(&'a HgPath, &'a HgPath),
 }
 
 /// This express the possible "special" case we can get in a merge
@@ -246,6 +247,6 @@
     }
 
     /// Return an iterator over all the `Action` in this instance.
-    fn iter_actions(&self, parent: Parent) -> ActionsIterator {
+    fn iter_actions(&self) -> ActionsIterator {
         ActionsIterator {
             changes: &self,
@@ -250,6 +251,5 @@
         ActionsIterator {
             changes: &self,
-            parent: parent,
             current: 0,
         }
     }
@@ -283,7 +283,6 @@
 
 struct ActionsIterator<'a> {
     changes: &'a ChangedFiles<'a>,
-    parent: Parent,
     current: u32,
 }
 
@@ -291,10 +290,6 @@
     type Item = Action<'a>;
 
     fn next(&mut self) -> Option<Action<'a>> {
-        let copy_flag = match self.parent {
-            Parent::FirstParent => P1_COPY,
-            Parent::SecondParent => P2_COPY,
-        };
         while self.current < self.changes.nb_items {
             let (flags, file, source) = self.changes.entry(self.current);
             self.current += 1;
@@ -302,8 +297,10 @@
                 return Some(Action::Removed(file));
             }
             let copy = flags & COPY_MASK;
-            if copy == copy_flag {
-                return Some(Action::Copied(file, source));
+            if copy == P1_COPY {
+                return Some(Action::CopiedFromP1(file, source));
+            } else if copy == P2_COPY {
+                return Some(Action::CopiedFromP2(file, source));
             }
         }
         return None;
@@ -500,5 +497,5 @@
     current_rev: Revision,
 ) -> InternalPathCopies {
     let mut copies = base_copies.clone();
-    for action in changes.iter_actions(parent) {
+    for action in changes.iter_actions() {
         match action {
@@ -504,13 +501,29 @@
         match action {
-            Action::Copied(path_dest, path_source) => {
-                add_one_copy(
-                    current_rev,
-                    &mut path_map,
-                    &mut copies,
-                    &base_copies,
-                    path_dest,
-                    path_source,
-                );
+            Action::CopiedFromP1(path_dest, path_source) => {
+                match parent {
+                    _ => (), // not the parent we are looking for
+                    Parent::FirstParent => add_one_copy(
+                        current_rev,
+                        path_map,
+                        &mut copies,
+                        &base_copies,
+                        path_dest,
+                        path_source,
+                    ),
+                };
+            }
+            Action::CopiedFromP2(path_dest, path_source) => {
+                match parent {
+                    _ => (), //not the parent we are looking for
+                    Parent::SecondParent => add_one_copy(
+                        current_rev,
+                        path_map,
+                        &mut copies,
+                        &base_copies,
+                        path_dest,
+                        path_source,
+                    ),
+                };
             }
             Action::Removed(deleted_path) => {
                 // We must drop copy information for removed file.