Patchwork D7124: copies: move from a copy on branchpoint to a copy on write approach

login
register
mail settings
Submitter phabricator
Date Oct. 17, 2019, 11:47 p.m.
Message ID <719b6d66d9faceafec870560d4e62e37@localhost.localdomain>
Download mbox | patch
Permalink /patch/42465/
State Not Applicable
Headers show

Comments

phabricator - Oct. 17, 2019, 11:47 p.m.
marmoute updated this revision to Diff 17331.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D7124?vs=17280&id=17331

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D7124/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D7124

AFFECTED FILES
  mercurial/copies.py

CHANGE DETAILS




To: marmoute, #hg-reviewers
Cc: mercurial-devel

Patch

diff --git a/mercurial/copies.py b/mercurial/copies.py
--- a/mercurial/copies.py
+++ b/mercurial/copies.py
@@ -270,15 +270,19 @@ 
                 childcopies = {
                     dst: src for dst, src in childcopies.items() if match(dst)
                 }
-            # Copy the dict only if later iterations will also need it
-            if i != len(children[r]) - 1:
-                newcopies = copies.copy()
-            else:
-                newcopies = copies
+            newcopies = copies
             if childcopies:
                 newcopies = _chain(newcopies, childcopies)
+                # _chain makes a copies, we can avoid doing so in some
+                # simple/linear cases.
+                assert newcopies is not copies
             for f in removed:
                 if f in newcopies:
+                    if newcopies is copies:
+                        # copy on write to avoid affecting potential other
+                        # branches.  when there are no other branches, this
+                        # could be avoided.
+                        newcopies = copies.copy()
                     del newcopies[f]
             othercopies = all_copies.get(c)
             if othercopies is None: