mercurial/stabletailgraph/stabletailsort.py
author Mads Kiilerich <mads@kiilerich.com>
Tue, 27 Jun 2023 13:05:03 +0200
changeset 51750 c87c56ad6913
parent 50528 8fb3e942473a
child 51864 1c5810ce737e
permissions -rw-r--r--
utils: avoid using internal _imp.is_frozen() imp has been deprecated for a long time, and were removed in Python 3.12 . As a workaround, we started using the internal _imp. That is ugly and risky. It seems less risky to get the functionality in some other way. Here, we just inspect if 'origin' of the '__main__' module is set and 'frozen'. That seems to work and do the same, and might be better than using the internal _imp directly. This way of inspecting module attributes seems to work in some test cases, but it is a risky change. This level of importlib doesn't have much documentation, a complicated implementation, and we are dealing with some odd use cases.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50426
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
     1
# stabletailsort.py - stable ordering of revisions
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
     2
#
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
     3
# Copyright 2021-2023 Pacien TRAN-GIRARD <pacien.trangirard@pacien.net>
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
     4
#
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
     7
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
     8
"""
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
     9
Stable-tail sort computation.
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    10
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    11
The "stable-tail sort", or STS, is a reverse topological ordering of the
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    12
ancestors of a node, which tends to share large suffixes with the stable-tail
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    13
sort of ancestors and other nodes, giving it its name.
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    14
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    15
Its properties should make it suitable for making chunks of ancestors with high
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    16
reuse and incrementality for example.
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    17
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    18
This module and implementation are experimental. Most functions are not yet
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    19
optimised to operate on large production graphs.
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    20
"""
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    21
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    22
import itertools
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    23
from ..node import nullrev
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    24
from .. import ancestor
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    25
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    26
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    27
def _sorted_parents(cl, p1, p2):
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    28
    """
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    29
    Chooses and returns the pair (px, pt) from (p1, p2).
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    30
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    31
    Where
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    32
    "px" denotes the parent starting the "exclusive" part, and
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    33
    "pt" denotes the parent starting the "Tail" part.
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    34
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    35
    "px" is chosen as the parent with the lowest rank with the goal of
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    36
    minimising the size of the exclusive part and maximise the size of the
50459
e1496403b08c stabletailgraph: fix terminology in doc
pacien <pacien.trangirard@pacien.net>
parents: 50426
diff changeset
    37
    tail part, hopefully reducing the overall complexity of the stable-tail
e1496403b08c stabletailgraph: fix terminology in doc
pacien <pacien.trangirard@pacien.net>
parents: 50426
diff changeset
    38
    sort.
50426
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    39
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    40
    In case of equal ranks, the stable node ID is used as a tie-breaker.
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    41
    """
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    42
    r1, r2 = cl.fast_rank(p1), cl.fast_rank(p2)
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    43
    if r1 < r2:
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    44
        return (p1, p2)
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    45
    elif r1 > r2:
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    46
        return (p2, p1)
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    47
    elif cl.node(p1) < cl.node(p2):
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    48
        return (p1, p2)
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    49
    else:
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    50
        return (p2, p1)
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    51
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    52
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    53
def _nonoedipal_parent_revs(cl, rev):
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    54
    """
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    55
    Returns the non-œdipal parent pair of the given revision.
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    56
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    57
    An œdipal merge is a merge with parents p1, p2 with either
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    58
    p1 in ancestors(p2) or p2 in ancestors(p1).
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    59
    In the first case, p1 is the œdipal parent.
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    60
    In the second case, p2 is the œdipal parent.
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    61
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    62
    Œdipal edges start empty exclusive parts. They do not bring new ancestors.
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    63
    As such, they can be skipped when computing any topological sort or any
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    64
    iteration over the ancestors of a node.
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    65
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    66
    The œdipal edges are eliminated here using the rank information.
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    67
    """
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    68
    p1, p2 = cl.parentrevs(rev)
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    69
    if p1 == nullrev or cl.fast_rank(p2) == cl.fast_rank(rev) - 1:
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    70
        return p2, nullrev
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    71
    elif p2 == nullrev or cl.fast_rank(p1) == cl.fast_rank(rev) - 1:
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    72
        return p1, nullrev
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    73
    else:
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    74
        return p1, p2
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    75
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    76
50527
dc372251d4dc stabletailgraph: extract _parents util func
pacien <pacien.trangirard@pacien.net>
parents: 50526
diff changeset
    77
def _parents(cl, rev):
dc372251d4dc stabletailgraph: extract _parents util func
pacien <pacien.trangirard@pacien.net>
parents: 50526
diff changeset
    78
    p1, p2 = _nonoedipal_parent_revs(cl, rev)
dc372251d4dc stabletailgraph: extract _parents util func
pacien <pacien.trangirard@pacien.net>
parents: 50526
diff changeset
    79
    if p2 == nullrev:
dc372251d4dc stabletailgraph: extract _parents util func
pacien <pacien.trangirard@pacien.net>
parents: 50526
diff changeset
    80
        return p1, p2
dc372251d4dc stabletailgraph: extract _parents util func
pacien <pacien.trangirard@pacien.net>
parents: 50526
diff changeset
    81
dc372251d4dc stabletailgraph: extract _parents util func
pacien <pacien.trangirard@pacien.net>
parents: 50526
diff changeset
    82
    return _sorted_parents(cl, p1, p2)
dc372251d4dc stabletailgraph: extract _parents util func
pacien <pacien.trangirard@pacien.net>
parents: 50526
diff changeset
    83
dc372251d4dc stabletailgraph: extract _parents util func
pacien <pacien.trangirard@pacien.net>
parents: 50526
diff changeset
    84
50525
1a4f54574e3d stabletailgraph: clarify naiveness of current implementation
pacien <pacien.trangirard@pacien.net>
parents: 50459
diff changeset
    85
def _stable_tail_sort_naive(cl, head_rev):
50426
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    86
    """
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    87
    Naive topological iterator of the ancestors given by the stable-tail sort.
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    88
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    89
    The stable-tail sort of a node "h" is defined as the sequence:
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    90
    sts(h) := [h] + excl(h) + sts(pt(h))
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    91
    where excl(h) := u for u in sts(px(h)) if u not in ancestors(pt(h))
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    92
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    93
    This implementation uses a call-stack whose size is
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    94
    O(number of open merges).
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    95
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    96
    As such, this implementation exists mainly as a defining reference.
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    97
    """
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    98
    cursor_rev = head_rev
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
    99
    while cursor_rev != nullrev:
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
   100
        yield cursor_rev
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
   101
50527
dc372251d4dc stabletailgraph: extract _parents util func
pacien <pacien.trangirard@pacien.net>
parents: 50526
diff changeset
   102
        px, pt = _parents(cl, cursor_rev)
dc372251d4dc stabletailgraph: extract _parents util func
pacien <pacien.trangirard@pacien.net>
parents: 50526
diff changeset
   103
        if pt == nullrev:
dc372251d4dc stabletailgraph: extract _parents util func
pacien <pacien.trangirard@pacien.net>
parents: 50526
diff changeset
   104
            cursor_rev = px
50426
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
   105
        else:
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
   106
            tail_ancestors = ancestor.lazyancestors(
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
   107
                cl.parentrevs, (pt,), inclusive=True
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
   108
            )
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
   109
            exclusive_ancestors = (
50525
1a4f54574e3d stabletailgraph: clarify naiveness of current implementation
pacien <pacien.trangirard@pacien.net>
parents: 50459
diff changeset
   110
                a
1a4f54574e3d stabletailgraph: clarify naiveness of current implementation
pacien <pacien.trangirard@pacien.net>
parents: 50459
diff changeset
   111
                for a in _stable_tail_sort_naive(cl, px)
1a4f54574e3d stabletailgraph: clarify naiveness of current implementation
pacien <pacien.trangirard@pacien.net>
parents: 50459
diff changeset
   112
                if a not in tail_ancestors
50426
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
   113
            )
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
   114
50526
4fd2f7ab4177 stabletailgraph: clarify excl part size computation
pacien <pacien.trangirard@pacien.net>
parents: 50525
diff changeset
   115
            # Notice that excl(cur) is disjoint from ancestors(pt),
4fd2f7ab4177 stabletailgraph: clarify excl part size computation
pacien <pacien.trangirard@pacien.net>
parents: 50525
diff changeset
   116
            # so there is no double-counting:
4fd2f7ab4177 stabletailgraph: clarify excl part size computation
pacien <pacien.trangirard@pacien.net>
parents: 50525
diff changeset
   117
            # rank(cur) = len([cur]) + len(excl(cur)) + rank(pt)
50426
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
   118
            excl_part_size = cl.fast_rank(cursor_rev) - cl.fast_rank(pt) - 1
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
   119
            yield from itertools.islice(exclusive_ancestors, excl_part_size)
f0d2b18f0274 stabletailgraph: implement stable-tail sort
pacien <pacien.trangirard@pacien.net>
parents:
diff changeset
   120
            cursor_rev = pt
50528
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   121
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   122
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   123
def _find_all_leaps_naive(cl, head_rev):
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   124
    """
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   125
    Yields the leaps in the stable-tail sort of the given revision.
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   126
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   127
    A leap is a pair of revisions (source, target) consecutive in the
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   128
    stable-tail sort of a head, for which target != px(source).
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   129
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   130
    Leaps are yielded in the same order as encountered in the stable-tail sort,
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   131
    from head to root.
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   132
    """
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   133
    sts = _stable_tail_sort_naive(cl, head_rev)
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   134
    prev = next(sts)
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   135
    for current in sts:
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   136
        if current != _parents(cl, prev)[0]:
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   137
            yield (prev, current)
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   138
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   139
        prev = current
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   140
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   141
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   142
def _find_specific_leaps_naive(cl, head_rev):
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   143
    """
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   144
    Returns the specific leaps in the stable-tail sort of the given revision.
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   145
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   146
    Specific leaps are leaps appear in the stable-tail sort of a given
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   147
    revision, but not in the stable-tail sort of any of its ancestors.
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   148
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   149
    The final leaps (leading to the pt of the considered merge) are omitted.
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   150
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   151
    Only merge nodes can have associated specific leaps.
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   152
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   153
    This implementations uses the whole leap sets of the given revision and
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   154
    of its parents.
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   155
    """
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   156
    px, pt = _parents(cl, head_rev)
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   157
    if px == nullrev or pt == nullrev:
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   158
        return  # linear nodes cannot have specific leaps
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   159
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   160
    parents_leaps = set(_find_all_leaps_naive(cl, px))
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   161
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   162
    sts = _stable_tail_sort_naive(cl, head_rev)
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   163
    prev = next(sts)
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   164
    for current in sts:
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   165
        if current == pt:
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   166
            break
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   167
        if current != _parents(cl, prev)[0]:
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   168
            leap = (prev, current)
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   169
            if leap not in parents_leaps:
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   170
                yield leap
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   171
8fb3e942473a stabletailgraph: naive version of leap computation
pacien <pacien.trangirard@pacien.net>
parents: 50527
diff changeset
   172
        prev = current