hgext3rd/evolve/stablerange.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Wed, 17 Apr 2019 20:54:28 +0200
branchstable
changeset 4524 f6099a171a9d
parent 4341 d1aab9d82f5b
child 4715 12c8b24757f4
permissions -rw-r--r--
branching: merge 8.5.0 expected output in stable Upstream stable is now for mercurial 5.0
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 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
    15
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    16
from mercurial import (
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    17
    error,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    18
    node as nodemod,
2129
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    19
    scmutil,
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    20
    util,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    21
)
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    22
2129
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    23
from mercurial.i18n import _
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    24
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    25
from . import (
4341
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4146
diff changeset
    26
    compat,
3332
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3331
diff changeset
    27
    exthelper,
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3331
diff changeset
    28
    firstmergecache,
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3240
diff changeset
    29
    stablesort,
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()
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    36
2129
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    37
2130
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
    38
#################################
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
    39
### 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
    40
#################################
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
    41
2198
ab392bd1c518 stablerange: move a utility function around
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2197
diff changeset
    42
def _hlp2(i):
ab392bd1c518 stablerange: move a utility function around
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2197
diff changeset
    43
    """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
    44
    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
    45
3248
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    46
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
    47
    """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
    48
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    49
    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
    50
    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
    51
    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
    52
    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
    53
    ranges = set(toproceed)
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    54
    while toproceed:
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    55
        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
    56
        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
    57
            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
    58
                ranges.add(r)
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    59
                toproceed.append(r)
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    60
    ranges = list(ranges)
2142
7dc66a526b21 stablerange: stop using '.node' in subrangesclosure
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2141
diff changeset
    61
    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
    62
    rangelength = stablerange.rangelength
2167
d37f0423c072 stablerange: use rangelength in subrangesclosure
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2163
diff changeset
    63
    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
    64
    return ranges
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    65
3248
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    66
_stablerangemethodmap = {
3345
72b1f300800f stablerange: explicitly create a stablerange entry for branchpoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3339
diff changeset
    67
    'branchpoint': lambda repo: stablerange(),
72b1f300800f stablerange: explicitly create a stablerange entry for branchpoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3339
diff changeset
    68
    'default': lambda repo: repo.stablerange,
3251
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
    69
    '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
    70
    '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
    71
    '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
    72
}
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    73
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    74
@eh.command(
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    75
    'debugstablerange',
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
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
        ('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
    78
        ('', '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
    79
        ('', '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
    80
        ('', '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
    81
         '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
    82
    ],
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    83
    _(''))
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    84
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
    85
    """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
    86
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    87
    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
    88
    --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
    89
    """
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    90
    short = nodemod.short
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    91
    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
    92
    if not revs:
7fd55c5efffb debugstablerange: cleanly "Abort" when no revision are specified
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2504
diff changeset
    93
        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
    94
    if ui.verbose:
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    95
        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
    96
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    97
        def _rangestring(repo, rangeid):
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    98
            return template % (
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    99
                short(node(rangeid[0])),
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   100
                rangeid[1],
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   101
                rangeid[0],
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   102
                depth(unfi, rangeid[0]),
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   103
                length(unfi, rangeid)
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   104
            )
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   105
    else:
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   106
        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
   107
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   108
        def _rangestring(repo, rangeid):
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   109
            return template % (
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   110
                short(node(rangeid[0])),
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   111
                rangeid[1],
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   112
            )
3248
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   113
    # 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
   114
    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
   115
    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
   116
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   117
    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
   118
    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
   119
    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
   120
        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
   121
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   122
    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
   123
    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
   124
    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
   125
    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
   126
    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
   127
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   128
    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
   129
        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
   130
    else:
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   131
        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
   132
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   133
    for r in ranges:
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   134
        subs = subranges(unfi, r)
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   135
        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
   136
        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
   137
        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
   138
            status = 'leaf'
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   139
            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
   140
                status = 'complete'
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   141
                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
   142
                subrevs = set()
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   143
                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
   144
                    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
   145
                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
   146
                    status = 'missing'
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   147
            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
   148
        else:
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   149
            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
   150
3250
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   151
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
   152
    """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
   153
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   154
    __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
   155
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   156
    @abc.abstractmethod
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   157
    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
   158
        """return the stable sub-ranges of a rangeid"""
3916
b103685a082b cleanup: use NotImplementedError instead of NotImplemented
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3685
diff changeset
   159
        raise NotImplementedError()
3250
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   160
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   161
    @abc.abstractmethod
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   162
    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
   163
        """return revision contained in a range"""
3916
b103685a082b cleanup: use NotImplementedError instead of NotImplemented
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3685
diff changeset
   164
        raise NotImplementedError()
3250
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 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
   168
        """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
   169
        # 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
   170
        # Could be demoted to _depthrev.
3916
b103685a082b cleanup: use NotImplementedError instead of NotImplemented
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3685
diff changeset
   171
        raise NotImplementedError()
3250
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   172
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   173
    @abc.abstractmethod
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   174
    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
   175
        """warmup the stable range cache"""
3916
b103685a082b cleanup: use NotImplementedError instead of NotImplemented
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3685
diff changeset
   176
        raise NotImplementedError()
3250
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   177
3259
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   178
    @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
   179
    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
   180
        """number of revision in <range>"""
3916
b103685a082b cleanup: use NotImplementedError instead of NotImplemented
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3685
diff changeset
   181
        raise NotImplementedError()
3250
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
    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
   184
        """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
   185
        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
   186
        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
   187
        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
   188
        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
   189
            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
   190
                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
   191
            step //= 2
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   192
        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
   193
            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
   194
            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
   195
        else:
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   196
            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
   197
            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
   198
        return slicepoint
3251
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   199
class stablerangebasic(abstractstablerange):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   200
    """a very dummy implementation of stablerange
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   201
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   202
    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
   203
    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
   204
    to validate output."""
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   205
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   206
    __metaclass__ = abc.ABCMeta
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   207
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   208
    def _sortfunction(self, repo, headrev):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   209
        return stablesort.stablesort_branchpoint(repo, [headrev])
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   210
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   211
    def warmup(self, repo, upto=None):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   212
        # no cache to warm for basic implementation
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   213
        pass
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   214
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   215
    def depthrev(self, repo, rev):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   216
        """depth a revision"""
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   217
        return len(repo.revs('::%d', rev))
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 revsfromrange(self, repo, rangeid):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   220
        """return revision contained in a range
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
        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
   223
        <head>, skipping the <index>th lower revisions.
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   224
        """
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   225
        headrev, index = rangeid[0], rangeid[1]
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   226
        revs = self._sortfunction(repo, headrev)
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   227
        return revs[index:]
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   228
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   229
    def rangelength(self, repo, rangeid):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   230
        """number of revision in <range>"""
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   231
        return len(self.revsfromrange(repo, rangeid))
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
    def subranges(self, repo, rangeid):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   234
        """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
   235
        headrev, index = rangeid[0], rangeid[1]
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   236
        if self.rangelength(repo, rangeid) == 1:
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   237
            return []
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   238
        slicepoint = self._slicepoint(repo, rangeid)
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
        # 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
   241
        #
3252
d57400a0f4c3 stablebranch: avoid overlap between subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3251
diff changeset
   242
        # 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
   243
        # current "head" of the lower range.
d57400a0f4c3 stablebranch: avoid overlap between subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3251
diff changeset
   244
        #
d57400a0f4c3 stablebranch: avoid overlap between subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3251
diff changeset
   245
        # 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
   246
        # 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
   247
        result = []
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   248
        lowerrevs = self.revsfromrange(repo, rangeid)[:(slicepoint - index)]
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   249
        head = None
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   250
        headrange = None
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   251
        skip = None
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   252
        for rev in lowerrevs[::-1]:
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   253
            if head is None:
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   254
                head = rev
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   255
                headrange = self.revsfromrange(repo, (head, 0))
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   256
                skip = self.depthrev(repo, rev) - 1
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   257
            elif rev != headrange[skip - 1]:
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   258
                result.append((head, skip))
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   259
                head = rev
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   260
                headrange = self.revsfromrange(repo, (head, 0))
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   261
                skip = self.depthrev(repo, rev) - 1
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   262
            else:
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   263
                skip -= 1
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   264
        result.append((head, skip))
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   265
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   266
        result.reverse()
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   267
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   268
        # top part is trivial
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   269
        top = (headrev, slicepoint)
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   270
        result.append(top)
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   271
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   272
        # double check the result
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   273
        initialrevs = self.revsfromrange(repo, rangeid)
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   274
        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
   275
                           [])
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   276
        assert initialrevs == subrangerevs
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   277
        return result
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   278
3258
af1f8f0687e1 stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3253
diff changeset
   279
class stablerangedummy_mergepoint(stablerangebasic):
af1f8f0687e1 stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3253
diff changeset
   280
    """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
   281
    """
af1f8f0687e1 stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3253
diff changeset
   282
af1f8f0687e1 stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3253
diff changeset
   283
    def _sortfunction(self, repo, headrev):
af1f8f0687e1 stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3253
diff changeset
   284
        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
   285
3259
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   286
class stablerangecached(abstractstablerange):
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   287
    """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
   288
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   289
    __metaclass__ = abc.ABCMeta
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   290
3302
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   291
    def __init__(self):
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   292
        # 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
   293
        self._subrangescache = {}
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   294
        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
   295
3259
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   296
    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
   297
        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
   298
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   299
    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
   300
        """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
   301
        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
   302
        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
   303
3302
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   304
    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
   305
        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
   306
        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
   307
        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
   308
            return cached
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   309
        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
   310
        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
   311
        return value
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   312
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   313
    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
   314
        """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
   315
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   316
        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
   317
        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
   318
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   319
    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
   320
        """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
   321
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   322
        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
   323
        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
   324
3303
318c938be80d stablerange: drop the basic inheritance from the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3302
diff changeset
   325
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
   326
    """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
   327
    """
3261
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   328
3264
383ec26247b3 stablerange: use the new cache object in the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   329
    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
   330
        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
   331
3303
318c938be80d stablerange: drop the basic inheritance from the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3302
diff changeset
   332
    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
   333
        # 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
   334
        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
   335
3261
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   336
    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
   337
        """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
   338
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   339
        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
   340
        <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
   341
        """
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   342
        limit = self.rangelength(repo, rangeid)
3339
f0933cdf614d stablerange: use repo-carried stablesortcache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3333
diff changeset
   343
        return repo.stablesort.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
   344
3301
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   345
    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
   346
        """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
   347
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   348
        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
   349
        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
   350
        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
   351
        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
   352
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   353
            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
   354
                          + 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
   355
                          + [REV]
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   356
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   357
        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
   358
        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
   359
        """
3312
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   360
        ps = filterparents(repo.changelog.parentrevs(headrev))
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   361
        if not ps:
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   362
            return nodemod.nullrev
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   363
        elif len(ps) == 1:
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   364
            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
   365
        else:
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   366
            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
   367
            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
   368
3304
d942fc5847f9 stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3303
diff changeset
   369
    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
   370
        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
   371
        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
   372
        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
   373
        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
   374
3305
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   375
    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
   376
        """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
   377
        stack = []
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   378
        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
   379
        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
   380
            stack.append(current)
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   381
            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
   382
        while stack:
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   383
            current = stack.pop()
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   384
            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
   385
3302
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   386
    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
   387
        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
   388
        # 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
   389
        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
   390
            return []
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   391
        # 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
   392
        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
   393
4137
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   394
        ret = self._slicesrangeat(repo, rangeid, slicepoint)
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   395
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   396
        return ret
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   397
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   398
    def _slicesrangeat(self, repo, rangeid, slicepoint):
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   399
        headrev, initial_index = rangeid
3305
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   400
        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
   401
3304
d942fc5847f9 stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3303
diff changeset
   402
        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
   403
        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
   404
3305
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   405
        # 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
   406
        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
   407
3301
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   408
        # 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
   409
        # 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
   410
        # 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
   411
        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
   412
            # 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
   413
            subranges = [
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   414
                stable_parent_range,
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   415
                top_range,
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   416
            ]
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   417
        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
   418
            # 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
   419
            # 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
   420
            # (and the top range is always the same)
4137
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   421
            subranges = self.subranges(repo, stable_parent_range)[:]
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   422
            parenttop = subranges.pop()
4146
f7aa0ecae3a4 pullbundle: deal with another special case introduced by arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4137
diff changeset
   423
            lenparenttop = self.rangelength(repo, parenttop)
f7aa0ecae3a4 pullbundle: deal with another special case introduced by arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4137
diff changeset
   424
            skimfromparent = stable_parent_depth - slicepoint
f7aa0ecae3a4 pullbundle: deal with another special case introduced by arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4137
diff changeset
   425
            if lenparenttop < skimfromparent:
f7aa0ecae3a4 pullbundle: deal with another special case introduced by arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4137
diff changeset
   426
                # dropping the first subrange of the stable parent range is not
f7aa0ecae3a4 pullbundle: deal with another special case introduced by arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4137
diff changeset
   427
                # enough to skip what we need to skip, change in approach is needed
f7aa0ecae3a4 pullbundle: deal with another special case introduced by arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4137
diff changeset
   428
                subranges = self._slicesrangeat(repo, stable_parent_range, slicepoint)
f7aa0ecae3a4 pullbundle: deal with another special case introduced by arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4137
diff changeset
   429
                subranges.pop()
f7aa0ecae3a4 pullbundle: deal with another special case introduced by arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4137
diff changeset
   430
            elif lenparenttop > skimfromparent:
f7aa0ecae3a4 pullbundle: deal with another special case introduced by arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4137
diff changeset
   431
                # The first subrange of the parent is longer that what we want
f7aa0ecae3a4 pullbundle: deal with another special case introduced by arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4137
diff changeset
   432
                # to drop, we need to keep some of it.
4137
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   433
                midranges = self._slicesrangeat(repo, parenttop, slicepoint)
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   434
                subranges.extend(midranges[:-1])
3301
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   435
            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
   436
        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
   437
            # 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
   438
            # 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
   439
            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
   440
            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
   441
                                                    stable_parent_depth,
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   442
                                                    slicepoint))
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   443
            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
   444
        else:
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   445
            # 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
   446
            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
   447
                                                    initial_index,
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   448
                                                    slicepoint))
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   449
            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
   450
4137
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   451
        ### slow code block to validated the slicing works as expected
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   452
        # toprevs = self.revsfromrange(repo, rangeid)
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   453
        # subrevs = []
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   454
        # for s in subranges:
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   455
        #     subrevs.extend(self.revsfromrange(repo, s))
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   456
        # assert toprevs == subrevs, (rangeid, slicepoint, stable_parent_range, stable_parent_depth, toprevs, subrevs)
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   457
3301
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   458
        return subranges
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   459
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   460
    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
   461
        """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
   462
        result = []
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   463
        depth = repo.depthcache.get
3333
96d1cf475c19 stablerange: use first merge cache to skip over linear section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3332
diff changeset
   464
        nextmerge = repo.firstmergecache.get
3339
f0933cdf614d stablerange: use repo-carried stablesortcache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3333
diff changeset
   465
        walkfrom = functools.partial(repo.stablesort.walkfrom, repo)
f0933cdf614d stablerange: use repo-carried stablesortcache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3333
diff changeset
   466
        getjumps = functools.partial(repo.stablesort.getjumps, repo)
3301
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   467
        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
   468
        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
   469
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   470
        jumps = getjumps(headrev)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   471
        # 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
   472
        # 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
   473
        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
   474
        jumps = iter(jumps)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   475
        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
   476
        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
   477
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   478
        # 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
   479
        # (and the distance to it)
3333
96d1cf475c19 stablerange: use first merge cache to skip over linear section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3332
diff changeset
   480
        def nextmergedata(startrev):
96d1cf475c19 stablerange: use first merge cache to skip over linear section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3332
diff changeset
   481
            merge = nextmerge(startrev)
96d1cf475c19 stablerange: use first merge cache to skip over linear section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3332
diff changeset
   482
            depthrev = depth(startrev)
96d1cf475c19 stablerange: use first merge cache to skip over linear section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3332
diff changeset
   483
            if merge == startrev:
96d1cf475c19 stablerange: use first merge cache to skip over linear section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3332
diff changeset
   484
                return 0, startrev
96d1cf475c19 stablerange: use first merge cache to skip over linear section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3332
diff changeset
   485
            elif merge == nodemod.nullrev:
96d1cf475c19 stablerange: use first merge cache to skip over linear section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3332
diff changeset
   486
                return depthrev, None
96d1cf475c19 stablerange: use first merge cache to skip over linear section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3332
diff changeset
   487
            depthmerge = depth(merge)
96d1cf475c19 stablerange: use first merge cache to skip over linear section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3332
diff changeset
   488
            return depthrev - depthmerge, merge
3301
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   489
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   490
        # 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
   491
        mainjump = None
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   492
        jumpdest = headrev
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   493
        while 0 < skips:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   494
            jumphead = jumpdest
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   495
            currentjump = next(jumps)
3330
a67a586792dc stablerange: use cached size data instead of walking the graph
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   496
            skipped = size = currentjump[2]
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   497
            jumpdest = currentjump[1]
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   498
            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
   499
                jumphead = jumpdest
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   500
                mainjump = next(jumps)
3330
a67a586792dc stablerange: use cached size data instead of walking the graph
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   501
                mainsize = mainjump[2]
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   502
            elif skips < size:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   503
                revs = walkfrom(jumphead)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   504
                next(revs)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   505
                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
   506
                    jumphead = next(revs)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   507
                    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
   508
                skipped = skips
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   509
                size -= skips
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   510
                mainjump = currentjump
3327
0abc8fb7f49f stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3324
diff changeset
   511
                mainsize = size
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   512
            skips -= skipped
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   513
        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
   514
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   515
        # 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
   516
        # 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
   517
        # 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
   518
        # 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
   519
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   520
        # 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
   521
        # 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
   522
        # 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
   523
        rangehead = jumphead
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   524
        refjumps = None
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   525
        size = 0
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   526
        while size < tomap:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   527
            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
   528
            if refjumps is None:
3333
96d1cf475c19 stablerange: use first merge cache to skip over linear section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3332
diff changeset
   529
                dist2merge, merge = nextmergedata(jumphead)
3327
0abc8fb7f49f stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3324
diff changeset
   530
                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
   531
                    refjumps = iter(())
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   532
                    ref = None
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   533
                else:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   534
                    # advance counters
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   535
                    size += dist2merge
3327
0abc8fb7f49f stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3324
diff changeset
   536
                    mainsize -= dist2merge
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   537
                    jumphead = merge
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   538
                    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
   539
                    ref = next(refjumps, None)
3329
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3327
diff changeset
   540
            elif ref is not None and mainjump[0:2] == ref[0:2]:
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   541
                # 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
   542
                size += mainsize
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   543
                jumphead = mainjump[1]
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   544
                mainjump = next(jumps, None)
3330
a67a586792dc stablerange: use cached size data instead of walking the graph
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   545
                mainsize = mainjump[2]
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   546
                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
   547
                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
   548
                    # 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
   549
                    # 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
   550
                    # next merge
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   551
                    refjumps = None
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   552
            else:
3327
0abc8fb7f49f stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3324
diff changeset
   553
                size += mainsize
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   554
                if size < tomap:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   555
                    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
   556
                    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
   557
                    result.append(subrange)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   558
                    tomap -= size
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   559
                    size = 0
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   560
                    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
   561
                    mainjump = next(jumps, None)
3330
a67a586792dc stablerange: use cached size data instead of walking the graph
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   562
                    mainsize = mainjump[2]
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   563
                    refjumps = None
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   564
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   565
        if tomap:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   566
            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
   567
            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
   568
            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
   569
        result.reverse()
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   570
        return result
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   571
3259
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   572
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
   573
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
   574
    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
   575
        # 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
   576
        self._tiprev = None
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   577
        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
   578
        # 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
   579
        # 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
   580
        # 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
   581
        # 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
   582
        # 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
   583
        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
   584
        # 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
   585
        # 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
   586
        self._stablesortprepared = util.lrucachedict(lrusize)
2209
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   587
        # 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
   588
        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
   589
        # 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
   590
        # 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
   591
        # 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
   592
        # merge.
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   593
        self._inheritancecache = {}
3302
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   594
        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
   595
2233
e922cd76804a stablerange: warmup all upto a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2232
diff changeset
   596
    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
   597
        """warm the cache up"""
2201
8d371329e8b9 stablecache: warmup on unfiltered repository
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2200
diff changeset
   598
        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
   599
        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
   600
        cl = repo.changelog
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   601
        # 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
   602
        # 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
   603
        # stablesort.
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   604
        #
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   605
        # 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
   606
        ui = repo.ui
3685
bf000d1a525f timer: drop compat layer for time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3658
diff changeset
   607
        starttime = util.timer()
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   608
2235
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   609
        if upto is None:
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   610
            upto = len(cl) - 1
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   611
        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
   612
            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
   613
            nbrevs = upto + 1
e922cd76804a stablerange: warmup all upto a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2232
diff changeset
   614
        else:
2235
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   615
            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
   616
            if upto <= self._tiprev:
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   617
                return
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   618
            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
   619
            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
   620
        rangeheap = []
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   621
        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
   622
            if not idx % 1000:
4341
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4146
diff changeset
   623
                compat.progress(ui, _("filling depth cache"), idx, total=nbrevs,
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4146
diff changeset
   624
                                unit=_("changesets"))
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   625
            # warm up depth
2135
8f63f4b1c33e stablerange: add an official warmup function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2134
diff changeset
   626
            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
   627
            rangeheap.append((-r, (r, 0)))
4341
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4146
diff changeset
   628
        compat.progress(ui, _("filling depth cache"), None, total=nbrevs)
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   629
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   630
        heappop = heapq.heappop
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   631
        heappush = heapq.heappush
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   632
        heapify = heapq.heapify
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   633
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   634
        original = set(rangeheap)
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   635
        seen = 0
2503
cdf6a0e028c0 stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   636
        # 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
   637
        # 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
   638
        progress_each = 100
cdf6a0e028c0 stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   639
        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
   640
        heapify(rangeheap)
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   641
        while rangeheap:
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   642
            value = heappop(rangeheap)
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   643
            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
   644
                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
   645
                    # 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
   646
                    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
   647
                    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
   648
                        progress_each /= 10
4341
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4146
diff changeset
   649
                    compat.progress(ui, _("filling stablerange cache"), seen,
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4146
diff changeset
   650
                                    total=nbrevs, unit=_("changesets"))
2503
cdf6a0e028c0 stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   651
                    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
   652
                seen += 1
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   653
                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
   654
            __, 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
   655
            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
   656
                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
   657
                    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
   658
                        heappush(rangeheap, (-sub[0], sub))
4341
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4146
diff changeset
   659
        compat.progress(ui, _("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
   660
2235
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   661
        self._tiprev = upto
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   662
        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
   663
3685
bf000d1a525f timer: drop compat layer for time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3658
diff changeset
   664
        duration = util.timer() - starttime
2381
07725f25296b stablerange: log time spent updating the stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2368
diff changeset
   665
        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
   666
                    duration)
07725f25296b stablerange: log time spent updating the stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2368
diff changeset
   667
2182
884f6309eae7 stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2181
diff changeset
   668
    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
   669
        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
   670
        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
   671
            return cached
2204
61a8b51348a1 subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2201
diff changeset
   672
        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
   673
        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
   674
        return value
884f6309eae7 stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2181
diff changeset
   675
2183
3c2992afee71 stablerange: move revs computation within the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2182
diff changeset
   676
    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
   677
        headrev, index = rangeid
2211
ecb46c7ee281 minor simplification around rangelength
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2210
diff changeset
   678
        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
   679
        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
   680
            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
   681
        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
   682
            # 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
   683
            #
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
   684
            # 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
   685
            # 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
   686
            # call for the general case.
2529
537058b433ef compat: fix stablerange for mercurial 3.9
Boris Feld <boris.feld@octobus.net>
parents: 2506
diff changeset
   687
3145
ca6650879726 compat: drop 'lru.get' work-around for 3.9
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2551
diff changeset
   688
            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
   689
            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
   690
                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
   691
                if allrevs is None:
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3240
diff changeset
   692
                    mc = self._filestablesortcache
3245
63d58f7db120 stablesort: rename function to stablesort_branchpoint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3244
diff changeset
   693
                    sorting = stablesort.stablesort_branchpoint
63d58f7db120 stablesort: rename function to stablesort_branchpoint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3244
diff changeset
   694
                    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
   695
                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
   696
            # 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
   697
            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
   698
        # sanity checks
2211
ecb46c7ee281 minor simplification around rangelength
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2210
diff changeset
   699
        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
   700
        return revs
3c2992afee71 stablerange: move revs computation within the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2182
diff changeset
   701
2209
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   702
    def _parents(self, rev, func):
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   703
        parents = self._parentscache.get(rev)
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   704
        if parents is None:
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   705
            parents = func(rev)
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   706
            self._parentscache[rev] = parents
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   707
        return parents
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   708
2226
83e6933ae00e subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2225
diff changeset
   709
    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
   710
        """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
   711
83e6933ae00e subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2225
diff changeset
   712
        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
   713
        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
   714
2227
4b621b56e3a1 subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2226
diff changeset
   715
    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
   716
        """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
   717
4b621b56e3a1 subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2226
diff changeset
   718
        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
   719
        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
   720
2213
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   721
    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
   722
        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
   723
            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
   724
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   725
    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
   726
        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
   727
        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
   728
            return None
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   729
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   730
        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
   731
        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
   732
        nbextrarevs = prepared[1] - mergedepth
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   733
        if not nbextrarevs:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   734
            return allrevs
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   735
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   736
        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
   737
        top = []
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   738
        counter = nbextrarevs
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   739
        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
   740
            if rev in anc:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   741
                top.append(rev)
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   742
            else:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   743
                counter -= 1
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   744
                if counter <= 0:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   745
                    break
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   746
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   747
        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
   748
        revs = allrevs[:bottomidx]
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   749
        revs.extend(reversed(top))
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   750
        return revs
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   751
2220
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   752
    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
   753
        """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
   754
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   755
        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
   756
        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
   757
        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
   758
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   759
        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
   760
        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
   761
        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
   762
        """
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   763
        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
   764
        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
   765
            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
   766
            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
   767
            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
   768
            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
   769
            # 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
   770
            # 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
   771
            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
   772
            # 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
   773
            # 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
   774
            # branching.
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   775
            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
   776
                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
   777
                    break
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   778
                expected -= 1
2221
f61d091d318e stablerange: small style fix
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2220
diff changeset
   779
            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
   780
            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
   781
        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
   782
2204
61a8b51348a1 subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2201
diff changeset
   783
    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
   784
        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
   785
            return []
61a8b51348a1 subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2201
diff changeset
   786
        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
   787
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
        # 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
   789
        # 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
   790
        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
   791
        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
   792
        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
   793
            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
   794
            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
   795
                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
   796
        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
   797
            # 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
   798
            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
   799
        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
   800
2219
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   801
    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
   802
        """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
   803
        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
   804
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   805
        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
   806
        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
   807
        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
   808
        if not ps:
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   809
            return None
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   810
        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
   811
            # 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
   812
            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
   813
        else:
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   814
            # 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
   815
            # 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
   816
            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
   817
2219
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   818
        # 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
   819
        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
   820
            return None
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   821
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   822
        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
   823
        # 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
   824
        # 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
   825
        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
   826
            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
   827
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
   828
        # 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
   829
        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
   830
2131
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   831
    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
   832
        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
   833
        if len(ps) == 1:
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   834
            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
   835
        else:
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   836
            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
   837
            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
   838
                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
   839
2218
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   840
        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
   841
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   842
        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
   843
        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
   844
2218
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   845
        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
   846
            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
   847
        # 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
   848
        # 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
   849
        # 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
   850
        # 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
   851
        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
   852
        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
   853
        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
   854
        return slices
2136
086a85c37e9e stablerange: compute subranges from parent when possible
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2135
diff changeset
   855
2169
03baabcd1b9e stablerange: use rangelength in '_slicesatrange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2168
diff changeset
   856
    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
   857
        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
   858
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   859
        result = []
2190
f4cc3cf27a3a revsfromrange: remove reference to '_revs' in merge slicing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2189
diff changeset
   860
        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
   861
        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
   862
6d9cadc635d5 merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2214
diff changeset
   863
        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
   864
            # 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
   865
            # 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
   866
            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
   867
        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
   868
            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
   869
            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
   870
            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
   871
            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
   872
                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
   873
                    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
   874
                    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
   875
                    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
   876
                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
   877
                    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
   878
                    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
   879
                    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
   880
                    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
   881
                else:
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   882
                    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
   883
            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
   884
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   885
            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
   886
2215
6d9cadc635d5 merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2214
diff changeset
   887
        # 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
   888
        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
   889
        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
   890
        return result
3952
a7794f5abacd discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3916
diff changeset
   891
a7794f5abacd discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3916
diff changeset
   892
# merge later for outer layer wrapping
a7794f5abacd discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3916
diff changeset
   893
eh.merge(stablesort.eh)
a7794f5abacd discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3916
diff changeset
   894
eh.merge(firstmergecache.eh)