Skip to content
Snippets Groups Projects
Commit 3a0c41336961 authored by Pierre-Yves David's avatar Pierre-Yves David :octopus:
Browse files

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
parent 1d6aac94e6d5
No related branches found
No related tags found
No related merge requests found
......@@ -446,6 +446,12 @@
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,11 +470,6 @@
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
......@@ -474,23 +475,4 @@
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
......@@ -494,6 +476,31 @@
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 <rev>"i
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment