hgext3rd/evolve/stablerange.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Wed, 20 Dec 2017 17:49:41 +0100
changeset 3327 0abc8fb7f49f
parent 3324 6ba8eaffe8f6
child 3329 c056f125e17d
permissions -rw-r--r--
stablerange: compute jump size after jump retrieval only This prepares the caching of jump sizes.
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
3250
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
    10
import abc
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
    11
import functools
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
    12
import heapq
2130
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
    13
import math
2424
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
    14
import os
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
    15
import time
2130
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
    16
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    17
from mercurial import (
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    18
    error,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    19
    node as nodemod,
2424
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
    20
    pycompat,
2129
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    21
    scmutil,
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    22
    util,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    23
)
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    24
2129
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    25
from mercurial.i18n import _
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    26
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    27
from . import (
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3240
diff changeset
    28
    stablesort,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    29
    exthelper,
3312
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
    30
    utility,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    31
)
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    32
3312
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
    33
filterparents = utility.filterparents
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
    34
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    35
eh = exthelper.exthelper()
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3240
diff changeset
    36
eh.merge(stablesort.eh)
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    37
2424
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
    38
# prior to hg-4.2 there are not util.timer
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
    39
if util.safehasattr(util, 'timer'):
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
    40
    timer = util.timer
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
    41
elif util.safehasattr(time, "perf_counter"):
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
    42
    timer = time.perf_counter
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
    43
elif getattr(pycompat, 'osname', os.name) == 'nt':
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
    44
    timer = time.clock
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
    45
else:
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
    46
    timer = time.time
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
    47
2129
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    48
2130
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
    49
#################################
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
    50
### 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
    51
#################################
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
    52
2198
ab392bd1c518 stablerange: move a utility function around
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2197
diff changeset
    53
def _hlp2(i):
ab392bd1c518 stablerange: move a utility function around
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2197
diff changeset
    54
    """return highest power of two lower than 'i'"""
ab392bd1c518 stablerange: move a utility function around
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2197
diff changeset
    55
    return 2 ** int(math.log(i - 1, 2))
ab392bd1c518 stablerange: move a utility function around
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2197
diff changeset
    56
3248
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    57
def subrangesclosure(repo, stablerange, heads):
2137
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    58
    """set of all standard subrange under heads
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    59
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    60
    This is intended for debug purposes. Range are returned from largest to
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    61
    smallest in terms of number of revision it contains."""
3248
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    62
    subranges = stablerange.subranges
2196
2ecc88baabf9 stablerange: directly use tuple to refer to a stable range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2194
diff changeset
    63
    toproceed = [(r, 0, ) for r in heads]
2137
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    64
    ranges = set(toproceed)
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    65
    while toproceed:
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    66
        entry = toproceed.pop()
2176
f5e1e43915a1 stablerange: use subranges from the main class in subrangesclosure
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2173
diff changeset
    67
        for r in subranges(repo, entry):
2137
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    68
            if r not in ranges:
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    69
                ranges.add(r)
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    70
                toproceed.append(r)
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    71
    ranges = list(ranges)
2142
7dc66a526b21 stablerange: stop using '.node' in subrangesclosure
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2141
diff changeset
    72
    n = repo.changelog.node
3248
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    73
    rangelength = stablerange.rangelength
2167
d37f0423c072 stablerange: use rangelength in subrangesclosure
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2163
diff changeset
    74
    ranges.sort(key=lambda r: (-rangelength(repo, r), n(r[0])))
2137
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    75
    return ranges
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    76
3248
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    77
_stablerangemethodmap = {
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    78
    'branchpoint': lambda repo: repo.stablerange,
3251
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
    79
    'basic-branchpoint': lambda repo: stablerangebasic(),
3258
af1f8f0687e1 stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3253
diff changeset
    80
    'basic-mergepoint': lambda repo: stablerangedummy_mergepoint(),
3260
2f0c113b35f8 stablerange: introduce a smarte version of stablerange for 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3259
diff changeset
    81
    'mergepoint': lambda repo: stablerange_mergepoint(),
3248
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    82
}
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    83
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    84
@eh.command(
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    85
    'debugstablerange',
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    86
    [
3248
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    87
        ('r', 'rev', [], 'operate on (rev, 0) ranges for rev in REVS'),
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    88
        ('', 'subranges', False, 'recursively display data for subranges too'),
2232
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
    89
        ('', 'verify', False, 'checks subranges content (EXPENSIVE)'),
3248
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    90
        ('', 'method', 'branchpoint',
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    91
         'method to use, one of "branchpoint", "mergepoint"')
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    92
    ],
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    93
    _(''))
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    94
def debugstablerange(ui, repo, **opts):
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    95
    """display standard stable subrange for a set of ranges
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    96
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    97
    Range as displayed as '<node>-<index> (<rev>, <depth>, <length>)', use
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    98
    --verbose to get the extra details in ().
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    99
    """
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   100
    short = nodemod.short
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   101
    revs = scmutil.revrange(repo, opts['rev'])
2505
7fd55c5efffb debugstablerange: cleanly "Abort" when no revision are specified
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2504
diff changeset
   102
    if not revs:
7fd55c5efffb debugstablerange: cleanly "Abort" when no revision are specified
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2504
diff changeset
   103
        raise error.Abort('no revisions specified')
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   104
    if ui.verbose:
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   105
        template = '%s-%d (%d, %d, %d)'
2232
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   106
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   107
        def _rangestring(repo, rangeid):
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   108
            return template % (
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   109
                short(node(rangeid[0])),
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   110
                rangeid[1],
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   111
                rangeid[0],
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   112
                depth(unfi, rangeid[0]),
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   113
                length(unfi, rangeid)
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   114
            )
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   115
    else:
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   116
        template = '%s-%d'
2232
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   117
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   118
        def _rangestring(repo, rangeid):
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   119
            return template % (
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   120
                short(node(rangeid[0])),
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   121
                rangeid[1],
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   122
            )
3248
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   123
    # prewarm depth cache
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   124
    unfi = repo.unfiltered()
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   125
    node = unfi.changelog.node
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   126
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   127
    method = opts['method']
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   128
    getstablerange = _stablerangemethodmap.get(method)
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   129
    if getstablerange is None:
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   130
        raise error.Abort('unknown stable sort method: "%s"' % method)
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   131
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   132
    stablerange = getstablerange(unfi)
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   133
    depth = stablerange.depthrev
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   134
    length = stablerange.rangelength
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   135
    subranges = stablerange.subranges
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   136
    stablerange.warmup(repo, max(revs))
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   137
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   138
    if opts['subranges']:
3268
10badf5951e5 stablerange: compute the subrange closure on an unfiltered repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3264
diff changeset
   139
        ranges = subrangesclosure(unfi, stablerange, revs)
3248
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   140
    else:
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   141
        ranges = [(r, 0) for r in revs]
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   142
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   143
    for r in ranges:
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   144
        subs = subranges(unfi, r)
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   145
        subsstr = ', '.join(_rangestring(unfi, s) for s in subs)
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   146
        rstr = _rangestring(unfi, r)
2232
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   147
        if opts['verify']:
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   148
            status = 'leaf'
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   149
            if 1 < length(unfi, r):
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   150
                status = 'complete'
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   151
                revs = set(stablerange.revsfromrange(unfi, r))
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   152
                subrevs = set()
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   153
                for s in subs:
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   154
                    subrevs.update(stablerange.revsfromrange(unfi, s))
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   155
                if revs != subrevs:
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   156
                    status = 'missing'
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   157
            ui.status('%s [%s] - %s\n' % (rstr, status, subsstr))
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   158
        else:
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   159
            ui.status('%s - %s\n' % (rstr, subsstr))
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   160
3250
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   161
class abstractstablerange(object):
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   162
    """The official API for a stablerange"""
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   163
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   164
    __metaclass__ = abc.ABCMeta
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   165
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   166
    @abc.abstractmethod
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   167
    def subranges(self, repo, rangeid):
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   168
        """return the stable sub-ranges of a rangeid"""
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   169
        raise NotImplemented()
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   170
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   171
    @abc.abstractmethod
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   172
    def revsfromrange(self, repo, rangeid):
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   173
        """return revision contained in a range"""
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   174
        raise NotImplemented()
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   175
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   176
    @abc.abstractmethod
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   177
    def depthrev(self, repo, rev):
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   178
        """depth a revision"""
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   179
        # Exist to allow basic implementation to ignore the depthcache
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   180
        # Could be demoted to _depthrev.
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   181
        raise NotImplemented()
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   182
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   183
    @abc.abstractmethod
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   184
    def warmup(self, repo, upto=None):
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   185
        """warmup the stable range cache"""
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   186
        raise NotImplemented()
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   187
3259
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   188
    @abc.abstractmethod
3250
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   189
    def rangelength(self, repo, rangeid):
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   190
        """number of revision in <range>"""
3259
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   191
        raise NotImplemented()
3250
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   192
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   193
    def _slicepoint(self, repo, rangeid):
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   194
        """find the standard slicing point for a range"""
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   195
        rangedepth = self.depthrev(repo, rangeid[0])
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   196
        step = _hlp2(rangedepth)
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   197
        standard_start = 0
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   198
        while standard_start < rangeid[1] and 0 < step:
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   199
            if standard_start + step < rangedepth:
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   200
                standard_start += step
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   201
            step //= 2
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   202
        if rangeid[1] == standard_start:
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   203
            slicesize = _hlp2(self.rangelength(repo, rangeid))
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   204
            slicepoint = rangeid[1] + slicesize
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   205
        else:
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   206
            assert standard_start < rangedepth
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   207
            slicepoint = standard_start
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   208
        return slicepoint
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   209
3251
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   210
class stablerangebasic(abstractstablerange):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   211
    """a very dummy implementation of stablerange
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   212
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   213
    the implementation is here to lay down the basic algorithm in the stable
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   214
    range in a inefficient but easy to read manners. It should be used by test
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   215
    to validate output."""
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   216
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   217
    __metaclass__ = abc.ABCMeta
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   218
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   219
    def _sortfunction(self, repo, headrev):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   220
        return stablesort.stablesort_branchpoint(repo, [headrev])
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   221
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   222
    def warmup(self, repo, upto=None):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   223
        # no cache to warm for basic implementation
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   224
        pass
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   225
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   226
    def depthrev(self, repo, rev):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   227
        """depth a revision"""
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   228
        return len(repo.revs('::%d', rev))
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   229
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   230
    def revsfromrange(self, repo, rangeid):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   231
        """return revision contained in a range
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   232
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   233
        The range `(<head>, <skip>)` contains all revisions stable-sorted from
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   234
        <head>, skipping the <index>th lower revisions.
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   235
        """
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   236
        headrev, index = rangeid[0], rangeid[1]
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   237
        revs = self._sortfunction(repo, headrev)
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   238
        return revs[index:]
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   239
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   240
    def rangelength(self, repo, rangeid):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   241
        """number of revision in <range>"""
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   242
        return len(self.revsfromrange(repo, rangeid))
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   243
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   244
    def subranges(self, repo, rangeid):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   245
        """return the stable sub-ranges of a rangeid"""
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   246
        headrev, index = rangeid[0], rangeid[1]
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   247
        if self.rangelength(repo, rangeid) == 1:
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   248
            return []
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   249
        slicepoint = self._slicepoint(repo, rangeid)
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   250
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   251
        # search for range defining the lower set of revision
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   252
        #
3252
d57400a0f4c3 stablebranch: avoid overlap between subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3251
diff changeset
   253
        # we walk the lower set from the top following the stable order of the
d57400a0f4c3 stablebranch: avoid overlap between subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3251
diff changeset
   254
        # current "head" of the lower range.
d57400a0f4c3 stablebranch: avoid overlap between subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3251
diff changeset
   255
        #
d57400a0f4c3 stablebranch: avoid overlap between subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3251
diff changeset
   256
        # As soon as the revision in the lowerset diverges from the one in the
d57400a0f4c3 stablebranch: avoid overlap between subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3251
diff changeset
   257
        # range being generated, we emit the range and start a new one.
3251
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   258
        result = []
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   259
        lowerrevs = self.revsfromrange(repo, rangeid)[:(slicepoint - index)]
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   260
        head = None
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   261
        headrange = None
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   262
        skip = None
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   263
        for rev in lowerrevs[::-1]:
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   264
            if head is None:
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   265
                head = rev
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   266
                headrange = self.revsfromrange(repo, (head, 0))
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   267
                skip = self.depthrev(repo, rev) - 1
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   268
            elif rev != headrange[skip - 1]:
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   269
                result.append((head, skip))
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   270
                head = rev
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   271
                headrange = self.revsfromrange(repo, (head, 0))
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   272
                skip = self.depthrev(repo, rev) - 1
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   273
            else:
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   274
                skip -= 1
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   275
        result.append((head, skip))
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   276
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   277
        result.reverse()
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   278
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   279
        # top part is trivial
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   280
        top = (headrev, slicepoint)
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   281
        result.append(top)
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   282
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   283
        # double check the result
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   284
        initialrevs = self.revsfromrange(repo, rangeid)
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   285
        subrangerevs = sum((self.revsfromrange(repo, sub) for sub in result),
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   286
                           [])
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   287
        assert initialrevs == subrangerevs
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   288
        return result
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   289
3258
af1f8f0687e1 stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3253
diff changeset
   290
class stablerangedummy_mergepoint(stablerangebasic):
af1f8f0687e1 stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3253
diff changeset
   291
    """a very dummy implementation of stablerange use 'mergepoint' sorting
af1f8f0687e1 stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3253
diff changeset
   292
    """
af1f8f0687e1 stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3253
diff changeset
   293
af1f8f0687e1 stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3253
diff changeset
   294
    def _sortfunction(self, repo, headrev):
af1f8f0687e1 stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3253
diff changeset
   295
        return stablesort.stablesort_mergepoint_head_basic(repo, [headrev])
af1f8f0687e1 stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3253
diff changeset
   296
3259
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   297
class stablerangecached(abstractstablerange):
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   298
    """an implementation of stablerange using caching"""
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   299
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   300
    __metaclass__ = abc.ABCMeta
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   301
3302
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   302
    def __init__(self):
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   303
        # cache the standard stable subranges or a range
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   304
        self._subrangescache = {}
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   305
        super(stablerangecached, self).__init__()
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   306
3259
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   307
    def depthrev(self, repo, rev):
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   308
        return repo.depthcache.get(rev)
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   309
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   310
    def rangelength(self, repo, rangeid):
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   311
        """number of revision in <range>"""
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   312
        headrev, index = rangeid[0], rangeid[1]
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   313
        return self.depthrev(repo, headrev) - index
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   314
3302
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   315
    def subranges(self, repo, rangeid):
3306
b67e0f676a28 stablerange: add an assert to detect buggy range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3305
diff changeset
   316
        assert 0 <= rangeid[1] <= rangeid[0], rangeid
3302
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   317
        cached = self._getsub(rangeid)
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   318
        if cached is not None:
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   319
            return cached
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   320
        value = self._subranges(repo, rangeid)
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   321
        self._setsub(rangeid, value)
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   322
        return value
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   323
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   324
    def _getsub(self, rev):
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   325
        """utility function used to access the subranges cache
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   326
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   327
        This mostly exist to help the on disk persistence"""
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   328
        return self._subrangescache.get(rev)
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   329
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   330
    def _setsub(self, rev, value):
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   331
        """utility function used to set the subranges cache
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   332
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   333
        This mostly exist to help the on disk persistence."""
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   334
        self._subrangescache[rev] = value
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   335
3303
318c938be80d stablerange: drop the basic inheritance from the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3302
diff changeset
   336
class stablerange_mergepoint(stablerangecached):
3260
2f0c113b35f8 stablerange: introduce a smarte version of stablerange for 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3259
diff changeset
   337
    """Stablerange implementation using 'mergepoint' based sorting
2f0c113b35f8 stablerange: introduce a smarte version of stablerange for 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3259
diff changeset
   338
    """
3261
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   339
3264
383ec26247b3 stablerange: use the new cache object in the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   340
    def __init__(self):
383ec26247b3 stablerange: use the new cache object in the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   341
        self._sortcache = stablesort.stablesortcache()
383ec26247b3 stablerange: use the new cache object in the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   342
        super(stablerange_mergepoint, self).__init__()
383ec26247b3 stablerange: use the new cache object in the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   343
3303
318c938be80d stablerange: drop the basic inheritance from the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3302
diff changeset
   344
    def warmup(self, repo, upto=None):
318c938be80d stablerange: drop the basic inheritance from the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3302
diff changeset
   345
        # no cache to warm for basic implementation
318c938be80d stablerange: drop the basic inheritance from the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3302
diff changeset
   346
        pass
3264
383ec26247b3 stablerange: use the new cache object in the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   347
3261
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   348
    def revsfromrange(self, repo, rangeid):
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   349
        """return revision contained in a range
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   350
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   351
        The range `(<head>, <skip>)` contains all revisions stable-sorted from
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   352
        <head>, skipping the <index>th lower revisions.
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   353
        """
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   354
        limit = self.rangelength(repo, rangeid)
3264
383ec26247b3 stablerange: use the new cache object in the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   355
        return self._sortcache.get(repo, rangeid[0], limit=limit)
3260
2f0c113b35f8 stablerange: introduce a smarte version of stablerange for 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3259
diff changeset
   356
3301
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   357
    def _stableparent(self, repo, headrev):
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   358
        """The parent of the changeset with reusable subrange
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   359
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   360
        For non-merge it is simple, there is a single parent. For Mercurial we
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   361
        have to find the right one. Since the stable sort use merge-point, we
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   362
        know that one of REV parents stable sort is a subset of REV stable
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   363
        sort. In other word:
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   364
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   365
            sort(::REV) = sort(::min(parents(REV))
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   366
                          + sort(only(max(parents(REV)), min(parents(REV)))
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   367
                          + [REV]
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   368
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   369
        We are looking for that `min(parents(REV))`. Since the subrange are
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   370
        based on the sort, we can reuse its subrange as well.
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   371
        """
3312
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   372
        ps = filterparents(repo.changelog.parentrevs(headrev))
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   373
        if not ps:
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   374
            return nodemod.nullrev
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   375
        elif len(ps) == 1:
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   376
            return ps[0]
3301
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   377
        else:
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   378
            tiebreaker = stablesort._mergepoint_tie_breaker(repo)
3312
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   379
            return min(ps, key=tiebreaker)
3301
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   380
3304
d942fc5847f9 stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3303
diff changeset
   381
    def _parentrange(self, repo, rangeid):
d942fc5847f9 stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3303
diff changeset
   382
        stable_parent = self._stableparent(repo, rangeid[0])
d942fc5847f9 stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3303
diff changeset
   383
        stable_parent_depth = self.depthrev(repo, stable_parent)
d942fc5847f9 stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3303
diff changeset
   384
        stable_parent_range = (stable_parent, rangeid[1])
d942fc5847f9 stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3303
diff changeset
   385
        return stable_parent_depth, stable_parent_range
d942fc5847f9 stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3303
diff changeset
   386
3305
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   387
    def _warmcachefor(self, repo, rangeid, slicepoint):
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   388
        """warm cache with all the element necessary"""
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   389
        stack = []
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   390
        depth, current = self._parentrange(repo, rangeid)
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   391
        while current not in self._subrangescache and slicepoint < depth:
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   392
            stack.append(current)
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   393
            depth, current = self._parentrange(repo, current)
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   394
        while stack:
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   395
            current = stack.pop()
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   396
            self.subranges(repo, current)
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   397
3302
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   398
    def _subranges(self, repo, rangeid):
3301
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   399
        headrev, initial_index = rangeid
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   400
        # size 1 range can't be sliced
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   401
        if self.rangelength(repo, rangeid) == 1:
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   402
            return []
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   403
        # find were we need to slice
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   404
        slicepoint = self._slicepoint(repo, rangeid)
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   405
3305
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   406
        self._warmcachefor(repo, rangeid, slicepoint)
3301
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   407
3304
d942fc5847f9 stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3303
diff changeset
   408
        stable_parent_data = self._parentrange(repo, rangeid)
d942fc5847f9 stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3303
diff changeset
   409
        stable_parent_depth, stable_parent_range = stable_parent_data
d942fc5847f9 stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3303
diff changeset
   410
3305
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   411
        # top range is always the same, so we can build it early for all
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   412
        top_range = (headrev, slicepoint)
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   413
3301
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   414
        # now find out about the lower range, if we are lucky there is only
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   415
        # one, otherwise we need to issue multiple one to cover every revision
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   416
        # on the lower set. (and cover them only once).
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   417
        if slicepoint == stable_parent_depth:
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   418
            # luckly shot, the parent is actually the head of the lower range
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   419
            subranges = [
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   420
                stable_parent_range,
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   421
                top_range,
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   422
            ]
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   423
        elif slicepoint < stable_parent_depth:
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   424
            # The parent is above the slice point,
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   425
            # it's lower subrange will be the same so we just get them,
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   426
            # (and the top range is always the same)
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   427
            subranges = self.subranges(repo, stable_parent_range)[:-1]
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   428
            subranges.append(top_range)
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   429
        elif initial_index < stable_parent_depth < slicepoint:
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   430
            # the parent is below the range we are considering, we need to
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   431
            # compute these uniques subranges
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   432
            subranges = [stable_parent_range]
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   433
            subranges.extend(self._unique_subranges(repo, headrev,
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   434
                                                    stable_parent_depth,
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   435
                                                    slicepoint))
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   436
            subranges.append(top_range)
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   437
        else:
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   438
            # we cannot reuse the parent range at all
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   439
            subranges = list(self._unique_subranges(repo, headrev,
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   440
                                                    initial_index,
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   441
                                                    slicepoint))
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   442
            subranges.append(top_range)
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   443
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   444
        return subranges
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   445
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   446
    def _unique_subranges(self, repo, headrev, initial_index, slicepoint):
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   447
        """Compute subrange unique to the exclusive part of merge"""
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   448
        result = []
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   449
        depth = repo.depthcache.get
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   450
        walkfrom = functools.partial(self._sortcache.walkfrom, repo)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   451
        getjumps = functools.partial(self._sortcache.getjumps, repo)
3301
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   452
        skips = depth(headrev) - slicepoint
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   453
        tomap = slicepoint - initial_index
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   454
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   455
        jumps = getjumps(headrev)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   456
        # this function is only caled if headrev is a merge
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   457
        # and initial_index is above its lower parents
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   458
        assert jumps is not None
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   459
        jumps = iter(jumps)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   460
        assert 0 < skips, skips
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   461
        assert 0 < tomap, (tomap, (headrev, initial_index), slicepoint)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   462
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   463
        # utility function know the size of segment
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   464
        # (this value could be cached)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   465
        def until(start, stop):
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   466
            revs = walkfrom(start)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   467
            count = 0
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   468
            for count, r in enumerate(revs, 1):
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   469
                if r == stop:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   470
                    break
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   471
            assert 0 < count, (start, stop)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   472
            return count
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   473
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   474
        # utility function to find the next changeset with jump information
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   475
        # (and the distance to it)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   476
        def nextmerge(startrev):
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   477
            for idx, rev in enumerate(walkfrom(startrev)):
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   478
                if getjumps(rev) is not None:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   479
                    return idx, rev
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   480
            idx += 1
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   481
            return idx, None
3301
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   482
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   483
        # skip over all necesary data
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   484
        mainjump = None
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   485
        jumpdest = headrev
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   486
        while 0 < skips:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   487
            jumphead = jumpdest
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   488
            currentjump = next(jumps)
3327
0abc8fb7f49f stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3324
diff changeset
   489
            skipped = size = until(jumphead, currentjump[0])
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   490
            jumpdest = currentjump[1]
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   491
            if size == skips:
3327
0abc8fb7f49f stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3324
diff changeset
   492
                jumphead = jumpdest
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   493
                mainjump = next(jumps)
3327
0abc8fb7f49f stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3324
diff changeset
   494
                mainsize = until(jumphead, mainjump[0])
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   495
            elif skips < size:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   496
                revs = walkfrom(jumphead)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   497
                next(revs)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   498
                for i in xrange(skips):
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   499
                    jumphead = next(revs)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   500
                    assert jumphead is not None
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   501
                skipped = skips
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   502
                size -= skips
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   503
                mainjump = currentjump
3327
0abc8fb7f49f stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3324
diff changeset
   504
                mainsize = size
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   505
            skips -= skipped
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   506
        assert skips == 0, skips
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   507
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   508
        # exiting from the previous block we should have:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   509
        # jumphead: first non-skipped revision (head of the high subrange)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   510
        # mainjump: next jump coming jump on main iteration
3327
0abc8fb7f49f stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3324
diff changeset
   511
        # mainsize: len(mainjump[0]::jumphead)
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   512
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   513
        # Now we need to compare walk on the main iteration with walk from the
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   514
        # current subrange head. Instead of doing a full walk, we just skim
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   515
        # over the jumps for each iteration.
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   516
        rangehead = jumphead
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   517
        refjumps = None
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   518
        size = 0
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   519
        while size < tomap:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   520
            assert mainjump is not None
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   521
            if refjumps is None:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   522
                dist2merge, merge = nextmerge(jumphead)
3327
0abc8fb7f49f stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3324
diff changeset
   523
                if (mainsize <= dist2merge) or merge is None:
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   524
                    refjumps = iter(())
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   525
                    ref = None
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   526
                else:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   527
                    # advance counters
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   528
                    size += dist2merge
3327
0abc8fb7f49f stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3324
diff changeset
   529
                    mainsize -= dist2merge
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   530
                    jumphead = merge
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   531
                    refjumps = iter(getjumps(merge))
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   532
                    ref = next(refjumps, None)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   533
            elif mainjump == ref:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   534
                # both follow the same path
3327
0abc8fb7f49f stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3324
diff changeset
   535
                size += mainsize
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   536
                jumphead = mainjump[1]
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   537
                mainjump = next(jumps, None)
3327
0abc8fb7f49f stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3324
diff changeset
   538
                mainsize = until(jumphead, mainjump[0])
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   539
                ref = next(refjumps, None)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   540
                if ref is None:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   541
                    # we are doing with section specific to the last merge
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   542
                    # reset `refjumps` to trigger the logic that search for the
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   543
                    # next merge
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   544
                    refjumps = None
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   545
            else:
3327
0abc8fb7f49f stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3324
diff changeset
   546
                size += mainsize
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   547
                if size < tomap:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   548
                    subrange = (rangehead, depth(rangehead) - size)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   549
                    assert subrange[1] < depth(subrange[0])
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   550
                    result.append(subrange)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   551
                    tomap -= size
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   552
                    size = 0
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   553
                    jumphead = rangehead = mainjump[1]
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   554
                    mainjump = next(jumps, None)
3327
0abc8fb7f49f stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3324
diff changeset
   555
                    mainsize = until(jumphead, mainjump[0])
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   556
                    refjumps = None
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   557
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   558
        if tomap:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   559
            subrange = (rangehead, depth(rangehead) - tomap)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   560
            assert subrange[1] < depth(subrange[0]), (rangehead, depth(rangehead), tomap)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   561
            result.append(subrange)
3301
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   562
        result.reverse()
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   563
        return result
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   564
3259
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   565
class stablerange(stablerangecached):
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   566
2504
d95006fe4dd0 stablerange: use last recently used caching for revisions associated to ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2503
diff changeset
   567
    def __init__(self, lrusize=2000):
2235
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   568
        # The point up to which we have data in cache
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   569
        self._tiprev = None
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   570
        self._tipnode = None
2184
3ec0be20e365 stablerange: add a cache for stablesort ordering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2183
diff changeset
   571
        # To slices merge, we need to walk their descendant in reverse stable
3ec0be20e365 stablerange: add a cache for stablesort ordering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2183
diff changeset
   572
        # sort order. For now we perform a full stable sort their descendant
3ec0be20e365 stablerange: add a cache for stablesort ordering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2183
diff changeset
   573
        # and then use the relevant top most part. This order is going to be
3ec0be20e365 stablerange: add a cache for stablesort ordering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2183
diff changeset
   574
        # the same for all ranges headed at the same merge. So we cache these
3ec0be20e365 stablerange: add a cache for stablesort ordering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2183
diff changeset
   575
        # value to reuse them accross the same invocation.
2504
d95006fe4dd0 stablerange: use last recently used caching for revisions associated to ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2503
diff changeset
   576
        self._stablesortcache = util.lrucachedict(lrusize)
2213
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   577
        # something useful to compute the above
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   578
        # mergerev -> stablesort, length
2504
d95006fe4dd0 stablerange: use last recently used caching for revisions associated to ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2503
diff changeset
   579
        self._stablesortprepared = util.lrucachedict(lrusize)
2209
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   580
        # caching parent call # as we do so many of them
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   581
        self._parentscache = {}
2220
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   582
        # The first part of the stable sorted list of revision of a merge will
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   583
        # shared with the one of others. This means we can reuse subranges
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   584
        # computed from that point to compute some of the subranges from the
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   585
        # merge.
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   586
        self._inheritancecache = {}
3302
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   587
        super(stablerange, self).__init__()
2184
3ec0be20e365 stablerange: add a cache for stablesort ordering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2183
diff changeset
   588
2233
e922cd76804a stablerange: warmup all upto a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2232
diff changeset
   589
    def warmup(self, repo, upto=None):
e922cd76804a stablerange: warmup all upto a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2232
diff changeset
   590
        """warm the cache up"""
2201
8d371329e8b9 stablecache: warmup on unfiltered repository
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2200
diff changeset
   591
        repo = repo.unfiltered()
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   592
        repo.depthcache.update(repo)
2235
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   593
        cl = repo.changelog
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   594
        # subrange should be warmed from head to range to be able to benefit
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   595
        # from revsfromrange cache. otherwise each merge will trigger its own
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   596
        # stablesort.
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   597
        #
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   598
        # we use the revnumber as an approximation for depth
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   599
        ui = repo.ui
2424
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
   600
        starttime = timer()
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   601
2235
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   602
        if upto is None:
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   603
            upto = len(cl) - 1
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   604
        if self._tiprev is None:
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   605
            revs = cl.revs(stop=upto)
2233
e922cd76804a stablerange: warmup all upto a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2232
diff changeset
   606
            nbrevs = upto + 1
e922cd76804a stablerange: warmup all upto a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2232
diff changeset
   607
        else:
2235
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   608
            assert cl.node(self._tiprev) == self._tipnode
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   609
            if upto <= self._tiprev:
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   610
                return
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   611
            revs = cl.revs(start=self._tiprev + 1, stop=upto)
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   612
            nbrevs = upto - self._tiprev
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   613
        rangeheap = []
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   614
        for idx, r in enumerate(revs):
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   615
            if not idx % 1000:
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   616
                ui.progress(_("filling depth cache"), idx, total=nbrevs)
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   617
            # warm up depth
2135
8f63f4b1c33e stablerange: add an official warmup function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2134
diff changeset
   618
            self.depthrev(repo, r)
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   619
            rangeheap.append((-r, (r, 0)))
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   620
        ui.progress(_("filling depth cache"), None, total=nbrevs)
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   621
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   622
        heappop = heapq.heappop
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   623
        heappush = heapq.heappush
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   624
        heapify = heapq.heapify
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   625
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   626
        original = set(rangeheap)
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   627
        seen = 0
2503
cdf6a0e028c0 stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   628
        # progress report is showing up in the profile for small and fast
cdf6a0e028c0 stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   629
        # repository so we build that complicated work around.
cdf6a0e028c0 stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   630
        progress_each = 100
cdf6a0e028c0 stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   631
        progress_last = time.time()
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   632
        heapify(rangeheap)
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   633
        while rangeheap:
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   634
            value = heappop(rangeheap)
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   635
            if value in original:
2503
cdf6a0e028c0 stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   636
                if not seen % progress_each:
cdf6a0e028c0 stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   637
                    # if a lot of time passed, report more often
cdf6a0e028c0 stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   638
                    progress_new = time.time()
cdf6a0e028c0 stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   639
                    if (1 < progress_each) and (0.1 < progress_new - progress_last):
cdf6a0e028c0 stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   640
                        progress_each /= 10
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   641
                    ui.progress(_("filling stablerange cache"), seen, total=nbrevs)
2503
cdf6a0e028c0 stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   642
                    progress_last = progress_new
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   643
                seen += 1
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   644
                original.remove(value) # might have been added from other source
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   645
            __, rangeid = value
2226
83e6933ae00e subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2225
diff changeset
   646
            if self._getsub(rangeid) is None:
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   647
                for sub in self.subranges(repo, rangeid):
2226
83e6933ae00e subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2225
diff changeset
   648
                    if self._getsub(sub) is None:
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   649
                        heappush(rangeheap, (-sub[0], sub))
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   650
        ui.progress(_("filling stablerange cache"), None, total=nbrevs)
2135
8f63f4b1c33e stablerange: add an official warmup function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2134
diff changeset
   651
2235
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   652
        self._tiprev = upto
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   653
        self._tipnode = cl.node(upto)
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   654
2424
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
   655
        duration = timer() - starttime
2381
07725f25296b stablerange: log time spent updating the stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2368
diff changeset
   656
        repo.ui.log('evoext-cache', 'updated stablerange cache in %.4f seconds\n',
07725f25296b stablerange: log time spent updating the stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2368
diff changeset
   657
                    duration)
07725f25296b stablerange: log time spent updating the stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2368
diff changeset
   658
2182
884f6309eae7 stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2181
diff changeset
   659
    def subranges(self, repo, rangeid):
2226
83e6933ae00e subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2225
diff changeset
   660
        cached = self._getsub(rangeid)
2182
884f6309eae7 stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2181
diff changeset
   661
        if cached is not None:
884f6309eae7 stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2181
diff changeset
   662
            return cached
2204
61a8b51348a1 subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2201
diff changeset
   663
        value = self._subranges(repo, rangeid)
2227
4b621b56e3a1 subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2226
diff changeset
   664
        self._setsub(rangeid, value)
2182
884f6309eae7 stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2181
diff changeset
   665
        return value
884f6309eae7 stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2181
diff changeset
   666
2183
3c2992afee71 stablerange: move revs computation within the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2182
diff changeset
   667
    def revsfromrange(self, repo, rangeid):
2210
37bd878d2e58 more explicite name in revsfromrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2209
diff changeset
   668
        headrev, index = rangeid
2211
ecb46c7ee281 minor simplification around rangelength
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2210
diff changeset
   669
        rangelength = self.rangelength(repo, rangeid)
2214
14e876c5e1c3 stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2213
diff changeset
   670
        if rangelength == 1:
14e876c5e1c3 stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2213
diff changeset
   671
            revs = [headrev]
14e876c5e1c3 stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2213
diff changeset
   672
        else:
14e876c5e1c3 stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2213
diff changeset
   673
            # get all revs under heads in stable order
14e876c5e1c3 stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2213
diff changeset
   674
            #
14e876c5e1c3 stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2213
diff changeset
   675
            # note: In the general case we can just walk down and then request
14e876c5e1c3 stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2213
diff changeset
   676
            # data about the merge. But I'm not sure this function will be even
14e876c5e1c3 stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2213
diff changeset
   677
            # call for the general case.
2529
537058b433ef compat: fix stablerange for mercurial 3.9
Boris Feld <boris.feld@octobus.net>
parents: 2506
diff changeset
   678
3145
ca6650879726 compat: drop 'lru.get' work-around for 3.9
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2551
diff changeset
   679
            allrevs = self._stablesortcache.get(headrev)
2214
14e876c5e1c3 stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2213
diff changeset
   680
            if allrevs is None:
14e876c5e1c3 stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2213
diff changeset
   681
                allrevs = self._getrevsfrommerge(repo, headrev)
2186
57d58f27ffae revsfromramge: hard code the single changeset range case
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2185
diff changeset
   682
                if allrevs is None:
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3240
diff changeset
   683
                    mc = self._filestablesortcache
3245
63d58f7db120 stablesort: rename function to stablesort_branchpoint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3244
diff changeset
   684
                    sorting = stablesort.stablesort_branchpoint
63d58f7db120 stablesort: rename function to stablesort_branchpoint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3244
diff changeset
   685
                    allrevs = sorting(repo, [headrev], mergecallback=mc)
2214
14e876c5e1c3 stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2213
diff changeset
   686
                self._stablesortcache[headrev] = allrevs
14e876c5e1c3 stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2213
diff changeset
   687
            # takes from index
14e876c5e1c3 stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2213
diff changeset
   688
            revs = allrevs[index:]
2183
3c2992afee71 stablerange: move revs computation within the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2182
diff changeset
   689
        # sanity checks
2211
ecb46c7ee281 minor simplification around rangelength
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2210
diff changeset
   690
        assert len(revs) == rangelength
2183
3c2992afee71 stablerange: move revs computation within the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2182
diff changeset
   691
        return revs
3c2992afee71 stablerange: move revs computation within the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2182
diff changeset
   692
2209
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   693
    def _parents(self, rev, func):
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   694
        parents = self._parentscache.get(rev)
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   695
        if parents is None:
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   696
            parents = func(rev)
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   697
            self._parentscache[rev] = parents
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   698
        return parents
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   699
2226
83e6933ae00e subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2225
diff changeset
   700
    def _getsub(self, rev):
83e6933ae00e subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2225
diff changeset
   701
        """utility function used to access the subranges cache
83e6933ae00e subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2225
diff changeset
   702
83e6933ae00e subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2225
diff changeset
   703
        This mostly exist to help the on disk persistence"""
83e6933ae00e subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2225
diff changeset
   704
        return self._subrangescache.get(rev)
83e6933ae00e subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2225
diff changeset
   705
2227
4b621b56e3a1 subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2226
diff changeset
   706
    def _setsub(self, rev, value):
4b621b56e3a1 subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2226
diff changeset
   707
        """utility function used to set the subranges cache
4b621b56e3a1 subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2226
diff changeset
   708
4b621b56e3a1 subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2226
diff changeset
   709
        This mostly exist to help the on disk persistence."""
4b621b56e3a1 subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2226
diff changeset
   710
        self._subrangescache[rev] = value
4b621b56e3a1 subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2226
diff changeset
   711
2213
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   712
    def _filestablesortcache(self, sortedrevs, merge):
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   713
        if merge not in self._stablesortprepared:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   714
            self._stablesortprepared[merge] = (sortedrevs, len(sortedrevs))
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   715
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   716
    def _getrevsfrommerge(self, repo, merge):
3145
ca6650879726 compat: drop 'lru.get' work-around for 3.9
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2551
diff changeset
   717
        prepared = self._stablesortprepared.get(merge)
ca6650879726 compat: drop 'lru.get' work-around for 3.9
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2551
diff changeset
   718
        if prepared is None:
2213
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   719
            return None
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   720
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   721
        mergedepth = self.depthrev(repo, merge)
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   722
        allrevs = prepared[0][:prepared[1]]
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   723
        nbextrarevs = prepared[1] - mergedepth
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   724
        if not nbextrarevs:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   725
            return allrevs
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   726
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   727
        anc = repo.changelog.ancestors([merge], inclusive=True)
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   728
        top = []
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   729
        counter = nbextrarevs
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   730
        for rev in reversed(allrevs):
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   731
            if rev in anc:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   732
                top.append(rev)
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   733
            else:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   734
                counter -= 1
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   735
                if counter <= 0:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   736
                    break
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   737
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   738
        bottomidx = prepared[1] - (nbextrarevs + len(top))
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   739
        revs = allrevs[:bottomidx]
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   740
        revs.extend(reversed(top))
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   741
        return revs
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   742
2220
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   743
    def _inheritancepoint(self, repo, merge):
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   744
        """Find the inheritance point of a Merge
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   745
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   746
        The first part of the stable sorted list of revision of a merge will shared with
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   747
        the one of others. This means we can reuse subranges computed from that point to
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   748
        compute some of the subranges from the merge.
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   749
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   750
        That point is latest point in the stable sorted list where the depth of the
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   751
        revisions match its index (that means all revision earlier in the stable sorted
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   752
        list are its ancestors, no dangling unrelated branches exists).
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   753
        """
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   754
        value = self._inheritancecache.get(merge)
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   755
        if value is None:
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   756
            revs = self.revsfromrange(repo, (merge, 0))
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   757
            i = reversed(revs)
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   758
            i.next() # pop the merge
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   759
            expected = len(revs) - 1
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   760
            # Since we do warmup properly, we can expect the cache to be hot
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   761
            # for everythin under the merge we investigate
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   762
            cache = repo.depthcache
2220
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   763
            # note: we cannot do a binary search because element under the
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   764
            # inherited point might have mismatching depth because of inner
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   765
            # branching.
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   766
            for rev in i:
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   767
                if cache.get(rev) == expected:
2220
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   768
                    break
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   769
                expected -= 1
2221
f61d091d318e stablerange: small style fix
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2220
diff changeset
   770
            value = (expected - 1, rev)
2220
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   771
            self._inheritancecache[merge] = value
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   772
        return value
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   773
2204
61a8b51348a1 subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2201
diff changeset
   774
    def _subranges(self, repo, rangeid):
61a8b51348a1 subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2201
diff changeset
   775
        if self.rangelength(repo, rangeid) == 1:
61a8b51348a1 subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2201
diff changeset
   776
            return []
61a8b51348a1 subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2201
diff changeset
   777
        slicepoint = self._slicepoint(repo, rangeid)
2205
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   778
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   779
        # make sure we have cache for all relevant parent first to prevent
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   780
        # recursion (python is bad with recursion
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   781
        stack = []
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   782
        current = rangeid
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   783
        while current is not None:
2219
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   784
            current = self._cold_reusable(repo, current, slicepoint)
2205
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   785
            if current is not None:
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   786
                stack.append(current)
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   787
        while stack:
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   788
            # these call will directly compute the subranges
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   789
            self.subranges(repo, stack.pop())
2204
61a8b51348a1 subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2201
diff changeset
   790
        return self._slicesrangeat(repo, rangeid, slicepoint)
61a8b51348a1 subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2201
diff changeset
   791
2219
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   792
    def _cold_reusable(self, repo, rangeid, slicepoint):
2205
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   793
        """return parent range that it would be useful to prepare to slice
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   794
        rangeid at slicepoint
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   795
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   796
        This function also have the important task to update the revscache of
2220
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   797
        the parent rev s if possible and needed"""
3312
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   798
        ps = filterparents(self._parents(rangeid[0], repo.changelog.parentrevs))
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   799
        if not ps:
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   800
            return None
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   801
        elif len(ps) == 1:
2220
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   802
            # regular changesets, we pick the parent
3312
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   803
            reusablerev = ps[0]
2220
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   804
        else:
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   805
            # merge, we try the inheritance point
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   806
            # if it is too low, it will be ditched by the depth check anyway
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   807
            index, reusablerev = self._inheritancepoint(repo, rangeid[0])
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   808
2219
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   809
        # if we reached the slicepoint, no need to go further
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   810
        if self.depthrev(repo, reusablerev) <= slicepoint:
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   811
            return None
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   812
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   813
        reurange = (reusablerev, rangeid[1])
2205
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   814
        # if we have an entry for the current range, lets update the cache
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   815
        # if we already have subrange for this range, no need to prepare it.
2226
83e6933ae00e subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2225
diff changeset
   816
        if self._getsub(reurange) is not None:
2205
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   817
            return None
2219
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   818
2205
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   819
        # look like we found a relevent parentrange with no cache yet
2219
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   820
        return reurange
2205
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   821
2131
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   822
    def _slicesrangeat(self, repo, rangeid, globalindex):
3312
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   823
        ps = self._parents(rangeid[0], repo.changelog.parentrevs)
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   824
        if len(ps) == 1:
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   825
            reuserev = ps[0]
2220
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   826
        else:
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   827
            index, reuserev = self._inheritancepoint(repo, rangeid[0])
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   828
            if index < globalindex:
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   829
                return self._slicesrangeatmerge(repo, rangeid, globalindex)
2136
086a85c37e9e stablerange: compute subranges from parent when possible
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2135
diff changeset
   830
2218
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   831
        assert reuserev != nodemod.nullrev
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   832
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   833
        reuserange = (reuserev, rangeid[1])
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   834
        top = (rangeid[0], globalindex)
2187
c583efbaec78 revsfromrange: update cache for parentrange directly in the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2186
diff changeset
   835
2218
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   836
        if rangeid[1] + self.rangelength(repo, reuserange) == globalindex:
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   837
            return [reuserange, top]
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   838
        # This will not initiate a recursion since we took appropriate
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   839
        # precaution in the caller of this method to ensure it will be so.
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   840
        # It the parent is a merge that will not be the case but computing
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   841
        # subranges from a merge will not recurse.
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   842
        reusesubranges = self.subranges(repo, reuserange)
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   843
        slices = reusesubranges[:-1] # pop the top
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   844
        slices.append(top)
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   845
        return slices
2136
086a85c37e9e stablerange: compute subranges from parent when possible
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2135
diff changeset
   846
2169
03baabcd1b9e stablerange: use rangelength in '_slicesatrange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2168
diff changeset
   847
    def _slicesrangeatmerge(self, repo, rangeid, globalindex):
2161
0a06f5cbca4b stablerange: stop using '.index' in '_slicesrangeat'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2160
diff changeset
   848
        localindex = globalindex - rangeid[1]
2131
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   849
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   850
        result = []
2190
f4cc3cf27a3a revsfromrange: remove reference to '_revs' in merge slicing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2189
diff changeset
   851
        allrevs = self.revsfromrange(repo, rangeid)
f4cc3cf27a3a revsfromrange: remove reference to '_revs' in merge slicing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2189
diff changeset
   852
        bottomrevs = allrevs[:localindex]
2215
6d9cadc635d5 merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2214
diff changeset
   853
6d9cadc635d5 merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2214
diff changeset
   854
        if globalindex == self.depthrev(repo, bottomrevs[-1]):
6d9cadc635d5 merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2214
diff changeset
   855
            # simple case, top revision in the bottom set contains exactly the
6d9cadc635d5 merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2214
diff changeset
   856
            # revision we needs
6d9cadc635d5 merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2214
diff changeset
   857
            result.append((bottomrevs[-1], rangeid[1]))
2131
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   858
        else:
3253
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   859
            head = None
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   860
            headrange = None
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   861
            skip = None
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   862
            for rev in bottomrevs[::-1]:
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   863
                if head is None:
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   864
                    head = rev
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   865
                    headrange = self.revsfromrange(repo, (head, 0))
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   866
                    skip = self.depthrev(repo, rev) - 1
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   867
                elif rev != headrange[skip - 1]:
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   868
                    result.append((head, skip))
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   869
                    head = rev
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   870
                    headrange = self.revsfromrange(repo, (head, 0))
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   871
                    skip = self.depthrev(repo, rev) - 1
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   872
                else:
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   873
                    skip -= 1
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   874
            result.append((head, skip))
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   875
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   876
            result.reverse()
2217
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   877
2215
6d9cadc635d5 merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2214
diff changeset
   878
        # top part is trivial
6d9cadc635d5 merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2214
diff changeset
   879
        top = (rangeid[0], globalindex)
2131
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   880
        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
   881
        return result