# HG changeset patch # User Pierre-Yves David # Date 2020-12-14 23:29:29 # Node ID cb8b2ee89a5d1a85cd3d63676562c955fc97c53b # Parent ee63c1173c1b8ba28ea95cf73d803303bfdef3e8 copies: stop attempt to avoid extra dict copies around branching In the python code, we attempt to avoid unnecessary dict copies when gathering copy information. However that logic is wobbly and I keep running into case where independent branches affects each others. With the current code we can't ensure we are the only "user" of dict when dealing with merge. This caused havoc in the next series on tests I am about to introduce. So for now I am disabling the faulty optimisation. I believe we will need a dedicated overlay to deal with the "copy on write logic" to have something correct. I am also hoping to find time to build dedicated test case for this category of problem instead of relying on side effect in other tests. However for now I am focussing on another issue. Differential Revision: https://phab.mercurial-scm.org/D9608 diff --git a/mercurial/copies.py b/mercurial/copies.py --- a/mercurial/copies.py +++ b/mercurial/copies.py @@ -383,9 +383,11 @@ def _combine_changeset_copies( if copies is None: # this is a root - copies = {} - - newcopies = copies + newcopies = copies = {} + elif remaining_children: + newcopies = copies.copy() + else: + newcopies = copies # chain the data in the edge with the existing data if changes is not None: childcopies = {} @@ -403,8 +405,6 @@ def _combine_changeset_copies( newcopies[dest] = (current_rev, source) assert newcopies is not copies if changes.removed: - if newcopies is copies: - newcopies = copies.copy() for f in changes.removed: if f in newcopies: if newcopies is copies: @@ -417,9 +417,6 @@ def _combine_changeset_copies( # that child). See comment below for details. if current_copies is None: current_copies = newcopies - elif current_copies is newcopies: - # nothing to merge: - pass else: # we are the second parent to work on c, we need to merge our # work with the other.