hgext3rd/evolve/stablerange.py
author Pierre-Yves David <pierre-yves.david@ens-lyon.org>
Sun, 19 Mar 2017 04:43:33 +0100
changeset 2132 d77262807411
parent 2131 86dd39478638
child 2133 323480863248
permissions -rw-r--r--
stablerange: move standard slice point definition in main class More migration of code away from the doomed individual class.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     1
# Code dedicated to the computation and properties of "stable ranges"
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     2
#
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     3
# These stable ranges are use for obsolescence markers discovery
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     4
#
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     5
# Copyright 2017 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     6
#
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     7
# This software may be used and distributed according to the terms of the
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     8
# GNU General Public License version 2 or any later version.
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     9
2129
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    10
import collections
2130
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
    11
import math
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
    12
import hashlib
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
    13
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    14
from mercurial import (
2129
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    15
    commands,
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    16
    cmdutil,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    17
    localrepo,
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    18
    node as nodemod,
2129
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    19
    scmutil,
2130
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
    20
    util,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    21
)
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    22
2129
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    23
from mercurial.i18n import _
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    24
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    25
from . import (
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    26
    exthelper,
2130
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
    27
    obsolete,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    28
)
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    29
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    30
eh = exthelper.exthelper()
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    31
2129
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    32
##################################
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    33
### Stable topological sorting ###
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    34
##################################
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    35
@eh.command(
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    36
    'debugstablesort',
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    37
    [
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    38
        ('', 'rev', [], 'heads to start from'),
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    39
    ] + commands.formatteropts,
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    40
    _(''))
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    41
def debugstablesort(ui, repo, **opts):
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    42
    """display the ::REVS set topologically sorted in a stable way
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    43
    """
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    44
    revs = scmutil.revrange(repo, opts['rev'])
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    45
    displayer = cmdutil.show_changeset(ui, repo, opts, buffered=True)
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    46
    for r in stablesort(repo, revs):
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    47
        ctx = repo[r]
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    48
        displayer.show(ctx)
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    49
        displayer.flush(ctx)
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    50
    displayer.close()
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    51
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    52
def stablesort(repo, revs):
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    53
    """return '::revs' topologically sorted in "stable" order
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    54
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    55
    This is a depth first traversal starting from 'nullrev', using node as a
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    56
    tie breaker.
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    57
    """
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    58
    # Various notes:
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    59
    #
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    60
    # * Bitbucket is used dates as tie breaker, that might be a good idea.
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    61
    #
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    62
    # * It seemds we can traverse in the same order from (one) head to bottom,
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    63
    #   if we the following record data for each merge:
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    64
    #
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    65
    #  - highest (stablesort-wise) common ancestors,
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    66
    #  - order of parents (tablesort-wise)
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    67
    cl = repo.changelog
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    68
    parents = cl.parentrevs
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    69
    nullrev = nodemod.nullrev
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    70
    n = cl.node
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    71
    # step 1: We need a parents -> children mapping for 2 reasons.
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    72
    #
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    73
    # * we build the order from nullrev to tip
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    74
    #
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    75
    # * we need to detect branching
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    76
    children = collections.defaultdict(list)
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    77
    for r in cl.ancestors(revs, inclusive=True):
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    78
        p1, p2 = parents(r)
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    79
        children[p1].append(r)
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    80
        if p2 != nullrev:
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    81
            children[p2].append(r)
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    82
    # step two: walk back up
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    83
    # * pick lowest node in case of branching
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    84
    # * stack disregarded part of the branching
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    85
    # * process merge when both parents are yielded
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    86
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    87
    # track what changeset has been
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    88
    seen = [0] * (max(revs) + 2)
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    89
    seen[-1] = True # nullrev is known
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    90
    # starts from repository roots
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    91
    # reuse the list form the mapping as we won't need it again anyway
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    92
    stack = children[nullrev]
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    93
    if not stack:
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    94
        return []
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    95
    if 1 < len(stack):
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    96
        stack.sort(key=n, reverse=True)
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    97
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    98
    # list of rev, maybe we should yield, but since we built a children mapping we are 'O(N)' already
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    99
    result = []
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   100
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   101
    current = stack.pop()
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   102
    while current is not None or stack:
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   103
        if current is None:
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   104
            # previous iteration reached a merge or an unready merge,
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   105
            current = stack.pop()
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   106
            if seen[current]:
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   107
                current = None
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   108
                continue
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   109
        p1, p2 = parents(current)
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   110
        if not (seen[p1] and seen[p2]):
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   111
            # we can't iterate on this merge yet because other child is not
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   112
            # yielded yet (and we are topo sorting) we can discard it for now
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   113
            # because it will be reached from the other child.
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   114
            current = None
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   115
            continue
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   116
        assert not seen[current]
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   117
        seen[current] = True
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   118
        result.append(current) # could be yield, cf earlier comment
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   119
        cs = children[current]
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   120
        if not cs:
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   121
            current = None
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   122
        elif 1 == len(cs):
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   123
            current = cs[0]
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   124
        else:
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   125
            cs.sort(key=n, reverse=True)
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   126
            current = cs.pop() # proceed on smallest
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   127
            stack.extend(cs)   # stack the rest for later
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   128
    assert len(result) == len(set(result))
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   129
    return result
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   130
2130
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   131
#################################
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   132
### Stable Range computation  ###
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   133
#################################
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   134
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   135
class stablerangecache(dict):
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   136
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   137
    def __init__(self):
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   138
        self._depthcache = {}
2127
e2770faac2df stablerange: move the subrange cache into our new class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2126
diff changeset
   139
        self._subrangescache = {}
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   140
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   141
    def depthrev(self, repo, rev):
2126
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   142
        repo = repo.unfiltered()
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   143
        cl = repo.changelog
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   144
        cache = self._depthcache
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   145
        nullrev = nodemod.nullrev
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   146
        stack = [rev]
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   147
        while stack:
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   148
            revdepth = None
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   149
            current = stack[-1]
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   150
            revdepth = cache.get(current)
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   151
            if revdepth is not None:
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   152
                stack.pop()
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   153
                continue
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   154
            p1, p2 = cl.parentrevs(current)
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   155
            if p1 == nullrev:
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   156
                # root case
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   157
                revdepth = 1
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   158
            elif p2 == nullrev:
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   159
                # linear commit case
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   160
                parentdepth = cache.get(p1)
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   161
                if parentdepth is None:
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   162
                    stack.append(p1)
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   163
                else:
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   164
                    revdepth = parentdepth + 1
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   165
            else:
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   166
                # merge case
2126
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   167
                revdepth = self._depthmerge(cl, current, p1, p2, stack, cache)
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   168
            if revdepth is not None:
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   169
                cache[current] = revdepth
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   170
                stack.pop()
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   171
        # actual_depth = len(list(cl.ancestors([rev], inclusive=True)))
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   172
        # assert revdepth == actual_depth, (rev, revdepth, actual_depth)
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   173
        return revdepth
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   174
2126
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   175
    @staticmethod
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   176
    def _depthmerge(cl, rev, p1, p2, stack, cache):
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   177
        # sub method to simplify the main 'depthrev' one
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   178
        revdepth = None
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   179
        depth_p1 = cache.get(p1)
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   180
        depth_p2 = cache.get(p2)
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   181
        missingparent = False
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   182
        if depth_p1 is None:
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   183
            stack.append(p1)
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   184
            missingparent = True
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   185
        if depth_p2 is None:
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   186
            stack.append(p2)
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   187
            missingparent = True
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   188
        if missingparent:
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   189
            return None
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   190
        # computin depth of a merge
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   191
        # XXX the common ancestors heads could be cached
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   192
        ancnodes = cl.commonancestorsheads(cl.node(p1), cl.node(p2))
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   193
        ancrevs = [cl.rev(a) for a in ancnodes]
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   194
        anyunkown = False
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   195
        ancdepth = []
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   196
        for r in ancrevs:
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   197
            d = cache.get(r)
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   198
            if d is None:
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   199
                anyunkown = True
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   200
                stack.append(r)
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   201
            ancdepth.append((r, d))
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   202
        if anyunkown:
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   203
            return None
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   204
        if not ancrevs:
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   205
            # unrelated branch, (no common root)
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   206
            revdepth = depth_p1 + depth_p2 + 1
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   207
        elif len(ancrevs) == 1:
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   208
            # one unique branch point:
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   209
            # we can compute depth without any walk
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   210
            depth_anc = ancdepth[0][1]
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   211
            revdepth = depth_p1 + (depth_p2 - depth_anc) + 1
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   212
        else:
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   213
            # multiple ancestors, we pick one that is
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   214
            # * the deepest (less changeset outside of it),
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   215
            # * lowest revs because more chance to have descendant of other "above"
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   216
            anc, revdepth = max(ancdepth, key=lambda x: (x[1], -x[0]))
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   217
            revdepth += len(cl.findmissingrevs(common=[anc], heads=[rev]))
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   218
        return revdepth
839e96521c5a depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2125
diff changeset
   219
2128
318aba30dec3 subranges: migrate handling of single element range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2127
diff changeset
   220
    def rangelength(self, repo, rangeid):
318aba30dec3 subranges: migrate handling of single element range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2127
diff changeset
   221
        headrev, index = rangeid.head, rangeid.index
318aba30dec3 subranges: migrate handling of single element range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2127
diff changeset
   222
        return self.depthrev(repo, headrev) - index
318aba30dec3 subranges: migrate handling of single element range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2127
diff changeset
   223
2127
e2770faac2df stablerange: move the subrange cache into our new class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2126
diff changeset
   224
    def subranges(self, repo, rangeid):
e2770faac2df stablerange: move the subrange cache into our new class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2126
diff changeset
   225
        cached = self._subrangescache.get(rangeid)
e2770faac2df stablerange: move the subrange cache into our new class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2126
diff changeset
   226
        if cached is not None:
e2770faac2df stablerange: move the subrange cache into our new class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2126
diff changeset
   227
            return cached
2128
318aba30dec3 subranges: migrate handling of single element range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2127
diff changeset
   228
        if self.rangelength(repo, rangeid) == 1:
318aba30dec3 subranges: migrate handling of single element range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2127
diff changeset
   229
            value = []
318aba30dec3 subranges: migrate handling of single element range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2127
diff changeset
   230
            self._subrangescache[rangeid] = value
318aba30dec3 subranges: migrate handling of single element range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2127
diff changeset
   231
            return value
318aba30dec3 subranges: migrate handling of single element range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2127
diff changeset
   232
        return None
2127
e2770faac2df stablerange: move the subrange cache into our new class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2126
diff changeset
   233
e2770faac2df stablerange: move the subrange cache into our new class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2126
diff changeset
   234
    def setsubranges(self, rangeid, value):
e2770faac2df stablerange: move the subrange cache into our new class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2126
diff changeset
   235
        # XXX temporary cache setter as value computation are performed outside
e2770faac2df stablerange: move the subrange cache into our new class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2126
diff changeset
   236
        # this class reach.
e2770faac2df stablerange: move the subrange cache into our new class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2126
diff changeset
   237
        return self._subrangescache.get(rangeid)
e2770faac2df stablerange: move the subrange cache into our new class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2126
diff changeset
   238
2132
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   239
    def _slicepoint(self, repo, rangeid):
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   240
        rangedepth = self.depthrev(repo, rangeid.head)
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   241
        step = _hlp2(rangedepth)
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   242
        standard_start = 0
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   243
        while standard_start < rangeid.index and 0 < step:
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   244
            if standard_start + step < rangedepth:
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   245
                standard_start += step
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   246
            step //= 2
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   247
        if rangeid.index == standard_start:
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   248
            slicesize = _hlp2(len(rangeid))
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   249
            slicepoint = rangeid.index + slicesize
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   250
        else:
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   251
            assert standard_start < rangedepth
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   252
            slicepoint = standard_start
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   253
        return slicepoint
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   254
2131
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   255
    def _slicesrangeat(self, repo, rangeid, globalindex):
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   256
        localindex = globalindex - rangeid.index
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   257
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   258
        cl = repo.changelog
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   259
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   260
        result = []
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   261
        bottom = rangeid._revs[:localindex]
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   262
        top = stablerange(repo, rangeid.head, globalindex, rangeid._revs[localindex:])
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   263
        #
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   264
        toprootdepth = repo.stablerange.depthrev(repo, top._revs[0])
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   265
        if toprootdepth + len(top) == rangeid.depth + 1:
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   266
            bheads = [bottom[-1]]
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   267
        else:
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   268
            bheads = set(bottom)
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   269
            parentrevs = cl.parentrevs
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   270
            du = bheads.difference_update
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   271
            for r in bottom:
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   272
                du(parentrevs(r))
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   273
            # if len(bheads) == 1:
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   274
            #     assert 1 == len(repo.revs('roots(%ld)', top._revs))
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   275
        if len(bheads) == 1:
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   276
            newhead = bottom[-1]
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   277
            bottomdepth = repo.stablerange.depthrev(repo, newhead)
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   278
            newstart = bottomdepth - len(bottom)
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   279
            result.append(stablerange(repo, newhead, newstart, bottom))
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   280
        else:
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   281
            # assert 1 < len(bheads), (toprootdepth, len(top), len(rangeid))
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   282
            cl = repo.changelog
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   283
            for h in bheads:
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   284
                subset = cl.ancestors([h], inclusive=True)
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   285
                hrevs = [r for r in bottom if r in subset]
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   286
                start = repo.stablerange.depthrev(repo, h) - len(hrevs)
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   287
                entry = stablerange(repo, h, start, [r for r in bottom if r in subset])
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   288
                result.append(entry)
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   289
        result.append(top)
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   290
        return result
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   291
2130
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   292
def _hlp2(i):
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   293
    """return highest power of two lower than 'i'"""
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   294
    return 2 ** int(math.log(i - 1, 2))
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   295
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   296
class stablerange(object):
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   297
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   298
    def __init__(self, repo, head, index, revs=None):
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   299
        self._repo = repo.unfiltered()
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   300
        self.head = head
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   301
        self.index = index
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   302
        if revs is not None:
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   303
            assert len(revs) == len(self)
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   304
            self._revs = revs
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   305
        assert index < self.depth, (head, index, self.depth, revs)
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   306
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   307
    def __repr__(self):
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   308
        return '%s %d %d %s' % (nodemod.short(self.node), self.depth, self.index, nodemod.short(self.obshash))
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   309
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   310
    def __hash__(self):
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   311
        return self._id
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   312
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   313
    def __eq__(self, other):
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   314
        if type(self) != type(other):
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   315
            raise NotImplementedError()
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   316
        return self.stablekey == other.stablekey
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   317
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   318
    @util.propertycache
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   319
    def _id(self):
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   320
        return hash(self.stablekey)
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   321
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   322
    @util.propertycache
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   323
    def stablekey(self):
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   324
        return (self.node, self.index)
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   325
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   326
    @util.propertycache
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   327
    def node(self):
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   328
        return self._repo.changelog.node(self.head)
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   329
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   330
    def __len__(self):
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   331
        return self.depth - self.index
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   332
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   333
    @util.propertycache
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   334
    def depth(self):
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   335
        return self._repo.stablerange.depthrev(self._repo, self.head)
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   336
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   337
    @util.propertycache
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   338
    def _revs(self):
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   339
        r = stablesort(self._repo, [self.head])[self.index:]
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   340
        assert len(r) == len(self), (self.head, self.index, len(r), len(self))
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   341
        return r
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   342
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   343
    def subranges(self):
2131
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   344
        cache = self._repo.stablerange
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   345
        cached = cache.subranges(self._repo, self)
2130
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   346
        if cached is not None:
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   347
            return cached
2132
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   348
        slicepoint = cache._slicepoint(self._repo, self)
2131
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   349
        result = cache._slicesrangeat(self._repo, self, slicepoint)
2130
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   350
        self._repo.stablerange.setsubranges(self, result)
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   351
        return result
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   352
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   353
    @util.propertycache
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   354
    def obshash(self):
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   355
        cache = self._repo.obsstore.rangeobshashcache
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   356
        obshash = cache.get(self)
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   357
        if obshash is not None:
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   358
            return obshash
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   359
        pieces = []
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   360
        nullid = nodemod.nullid
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   361
        if len(self) == 1:
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   362
            tmarkers = self._repo.obsstore.relevantmarkers([self.node])
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   363
            pieces = []
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   364
            for m in tmarkers:
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   365
                mbin = obsolete._fm1encodeonemarker(m)
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   366
                pieces.append(mbin)
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   367
            pieces.sort()
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   368
        else:
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   369
            for subrange in self.subranges():
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   370
                obshash = subrange.obshash
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   371
                if obshash != nullid:
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   372
                    pieces.append(obshash)
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   373
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   374
        sha = hashlib.sha1()
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   375
        # note: if there is only one subrange with actual data, we'll just
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   376
        # reuse the same hash.
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   377
        if not pieces:
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   378
            obshash = nodemod.nullid
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   379
        elif len(pieces) != 1 or obshash is None:
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   380
            sha = hashlib.sha1()
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   381
            for p in pieces:
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   382
                sha.update(p)
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   383
            obshash = cache[self] = sha.digest()
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   384
        return obshash
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   385
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   386
@eh.reposetup
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   387
def setupcache(ui, repo):
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   388
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   389
    class stablerangerepo(repo.__class__):
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   390
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   391
        @localrepo.unfilteredpropertycache
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   392
        def stablerange(self):
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   393
            return stablerangecache()
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   394
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   395
    repo.__class__ = stablerangerepo