mercurial/dirstatemap.py
changeset 48059 5d68c4eedd66
parent 48056 cd13d3c2ad2e
child 48060 a660d8a53267
--- a/mercurial/dirstatemap.py	Wed Sep 22 09:46:37 2021 +0200
+++ b/mercurial/dirstatemap.py	Wed Sep 22 15:17:12 2021 +0200
@@ -428,9 +428,40 @@
 
         return self._parents
 
-    def setparents(self, p1, p2):
+    def setparents(self, p1, p2, fold_p2=False):
         self._parents = (p1, p2)
         self._dirtyparents = True
+        copies = {}
+        if fold_p2:
+            candidatefiles = self.non_normal_or_other_parent_paths()
+
+            for f in candidatefiles:
+                s = self.get(f)
+                if s is None:
+                    continue
+
+                # Discard "merged" markers when moving away from a merge state
+                if s.merged:
+                    source = self.copymap.get(f)
+                    if source:
+                        copies[f] = source
+                    self.reset_state(
+                        f,
+                        wc_tracked=True,
+                        p1_tracked=True,
+                        possibly_dirty=True,
+                    )
+                # Also fix up otherparent markers
+                elif s.from_p2:
+                    source = self.copymap.get(f)
+                    if source:
+                        copies[f] = source
+                    self.reset_state(
+                        f,
+                        p1_tracked=False,
+                        wc_tracked=True,
+                    )
+        return copies
 
     def read(self):
         # ignore HG_PENDING because identity is used only for writing
@@ -769,9 +800,40 @@
                 # File doesn't exist, so the current state is empty
                 return b''
 
-        def setparents(self, p1, p2):
+        def setparents(self, p1, p2, fold_p2=False):
             self._parents = (p1, p2)
             self._dirtyparents = True
+            copies = {}
+            if fold_p2:
+                candidatefiles = self.non_normal_or_other_parent_paths()
+
+                for f in candidatefiles:
+                    s = self.get(f)
+                    if s is None:
+                        continue
+
+                    # Discard "merged" markers when moving away from a merge state
+                    if s.merged:
+                        source = self.copymap.get(f)
+                        if source:
+                            copies[f] = source
+                        self.reset_state(
+                            f,
+                            wc_tracked=True,
+                            p1_tracked=True,
+                            possibly_dirty=True,
+                        )
+                    # Also fix up otherparent markers
+                    elif s.from_p2:
+                        source = self.copymap.get(f)
+                        if source:
+                            copies[f] = source
+                        self.reset_state(
+                            f,
+                            p1_tracked=False,
+                            wc_tracked=True,
+                        )
+            return copies
 
         def parents(self):
             if not self._parents: