Mercurial > hg
changeset 46148:70a9eb899637
copies: document the current algorithm step
We are about to reorganise everything and we document the "old" way to clarify
the change that leads to the "new way".
Differential Revision: https://phab.mercurial-scm.org/D9581
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Mon, 14 Dec 2020 11:32:20 +0100 |
parents | d109dda4a3e7 |
children | 294d5aca4ff5 |
files | mercurial/copies.py |
diffstat | 1 files changed, 14 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/copies.py Sat Dec 12 15:27:58 2020 +0530 +++ b/mercurial/copies.py Mon Dec 14 11:32:20 2020 +0100 @@ -1,3 +1,4 @@ +# coding: utf8 # copies.py - copy detection for Mercurial # # Copyright 2008 Matt Mackall <mpm@selenic.com> @@ -351,14 +352,21 @@ isancestor = cached_is_ancestor(isancestor) all_copies = {} + # iterate over all the "parent" side of copy tracing "edge" for r in revs: + # fetch potential previously computed data for that parent copies = all_copies.pop(r, None) if copies is None: # this is a root copies = {} + + # iterate over all known children to chain the existing data with the + # data from the parent → child edge. for i, c in enumerate(children[r]): p1, p2, changes = revinfo(c) childcopies = {} + + # select the right parent → child edge if r == p1: parent = 1 if changes is not None: @@ -372,6 +380,8 @@ childcopies = { dst: src for dst, src in childcopies.items() if match(dst) } + + # chain the data in the edge with the existing data newcopies = copies if childcopies: newcopies = copies.copy() @@ -392,6 +402,9 @@ # could be avoided. newcopies = copies.copy() newcopies[f] = (c, None) + + # check potential need to combine the data from another parent (for + # that child). See comment below for details. othercopies = all_copies.get(c) if othercopies is None: all_copies[c] = newcopies @@ -418,6 +431,7 @@ copies = _merge_copies_dict(minor, major, isancestor, changes) all_copies[c] = copies + # filter out internal details and return a {dest: source mapping} final_copies = {} for dest, (tt, source) in all_copies[targetrev].items(): if source is not None: