copies: properly copies parent dictionary before updating it
authorPierre-Yves David <pierre-yves.david@octobus.net>
Fri, 20 Nov 2020 10:51:07 +0100
changeset 46036 8d54944eaeb0
parent 46035 6c960b708ac4
child 46037 9624bf057c2a
copies: properly copies parent dictionary before updating it This enforces the copy on write logic. Otherwise independant unrelated branches could affected each other. More testing of these case are coming, but I need that code landed to unlock other performance work in parallel. Differential Revision: https://phab.mercurial-scm.org/D9419
mercurial/copies.py
--- a/mercurial/copies.py	Mon Nov 30 14:07:23 2020 +0100
+++ b/mercurial/copies.py	Fri Nov 20 10:51:07 2020 +0100
@@ -380,9 +380,14 @@
                 # changeset based copies. It was made without regards with
                 # potential filelog related behavior.
                 if parent == 1:
+                    if newcopies is copies:
+                        newcopies = copies.copy()
                     minor, major = othercopies, newcopies
                 else:
-                    minor, major = newcopies, othercopies
+                    # we do not know if the other dict is a copy or not, so we
+                    # need to blindly copy it. Future change should make this
+                    # unnecessary.
+                    minor, major = newcopies, othercopies.copy()
                 copies = _merge_copies_dict(minor, major, isancestor, changes)
                 all_copies[c] = copies