From patchwork Thu Oct 17 23:47:02 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: D7124: copies: move from a copy on branchpoint to a copy on write approach From: phabricator X-Patchwork-Id: 42465 Message-Id: <719b6d66d9faceafec870560d4e62e37@localhost.localdomain> To: Phabricator Cc: mercurial-devel@mercurial-scm.org Date: Thu, 17 Oct 2019 23:47:02 +0000 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 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: