# HG changeset patch # User Pierre-Yves David # Date 2020-12-14 00:30:32 # Node ID 3a0c413369613bad5934c927765ea91a362e50a1 # Parent 1d6aac94e6d5fd4b126221e479dbf6eb6bb17bcb copies: extract value comparison in the python copy tracing This mirror what we did in the Rust code. This is useful to prepare rework for this comparison logic that we will need to handle more advanced chaining cases (when merges are chained). Differential Revision: https://phab.mercurial-scm.org/D9590 diff --git a/mercurial/copies.py b/mercurial/copies.py --- a/mercurial/copies.py +++ b/mercurial/copies.py @@ -446,6 +446,12 @@ def _combine_changeset_copies( return final_copies +# constant to decide which side to pick with _merge_copies_dict +PICK_MINOR = 0 +PICK_MAJOR = 1 +PICK_EITHER = 2 + + def _merge_copies_dict(minor, major, isancestor, changes): """merge two copies-mapping together, minor and major @@ -464,36 +470,37 @@ def _merge_copies_dict(minor, major, isa if other is None: minor[dest] = value else: - new_tt = value[0] - other_tt = other[0] - if value[1] == other[1]: - continue - # content from "major" wins, unless it is older - # than the branch point or there is a merge - if new_tt == other_tt: + pick = _compare_values(changes, isancestor, dest, other, value) + if pick == PICK_MAJOR: minor[dest] = value - elif ( - changes is not None - and value[1] is None - and dest in changes.salvaged - ): - pass - elif ( - changes is not None - and other[1] is None - and dest in changes.salvaged - ): - minor[dest] = value - elif changes is not None and dest in changes.merged: - minor[dest] = value - elif not isancestor(new_tt, other_tt): - if value[1] is not None: - minor[dest] = value - elif isancestor(other_tt, new_tt): - minor[dest] = value return minor +def _compare_values(changes, isancestor, dest, other, value): + """compare two value within a _merge_copies_dict loop iteration""" + new_tt = value[0] + other_tt = other[0] + + if value[1] == other[1]: + return PICK_EITHER + # content from "major" wins, unless it is older + # than the branch point or there is a merge + if new_tt == other_tt: + return PICK_MAJOR + elif changes is not None and value[1] is None and dest in changes.salvaged: + return PICK_MINOR + elif changes is not None and other[1] is None and dest in changes.salvaged: + return PICK_MAJOR + elif changes is not None and dest in changes.merged: + return PICK_MAJOR + elif not isancestor(new_tt, other_tt): + if value[1] is not None: + return PICK_MAJOR + elif isancestor(other_tt, new_tt): + return PICK_MAJOR + return PICK_MINOR + + def _revinfo_getter_extra(repo): """return a function that return multiple data given a "i