hgext3rd/evolve/stablerange.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Sun, 10 Dec 2017 04:48:15 +0100
changeset 3304 d942fc5847f9
parent 3303 318c938be80d
child 3305 a878d9406841
permissions -rw-r--r--
stablesort: move parent range computation into its own method Now that we have running code, we'll need to avoid too deep recursion. We extract the piece dealing with the parent range before we write more code to warm it.
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
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
    11
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
    12
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
    13
import os
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    14
import sqlite3
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
    15
import time
2238
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
    16
import weakref
2130
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
    17
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    18
from mercurial import (
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    19
    error,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    20
    localrepo,
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    21
    node as nodemod,
2424
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
    22
    pycompat,
2129
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    23
    scmutil,
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    24
    util,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    25
)
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    26
2129
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    27
from mercurial.i18n import _
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    28
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    29
from . import (
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3240
diff changeset
    30
    stablesort,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    31
    exthelper,
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    32
)
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    33
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    34
eh = exthelper.exthelper()
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3240
diff changeset
    35
eh.merge(stablesort.eh)
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    36
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
    37
# prior to hg-4.2 there are not util.timer
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
    38
if util.safehasattr(util, 'timer'):
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
    39
    timer = util.timer
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
    40
elif util.safehasattr(time, "perf_counter"):
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
    41
    timer = time.perf_counter
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
    42
elif getattr(pycompat, 'osname', os.name) == 'nt':
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
    43
    timer = time.clock
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
    44
else:
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
    45
    timer = time.time
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
    46
2129
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    47
2130
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
    48
#################################
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
    49
### 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
    50
#################################
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
    51
2198
ab392bd1c518 stablerange: move a utility function around
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2197
diff changeset
    52
def _hlp2(i):
ab392bd1c518 stablerange: move a utility function around
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2197
diff changeset
    53
    """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
    54
    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
    55
3248
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    56
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
    57
    """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
    58
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    59
    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
    60
    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
    61
    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
    62
    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
    63
    ranges = set(toproceed)
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    64
    while toproceed:
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    65
        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
    66
        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
    67
            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
    68
                ranges.add(r)
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    69
                toproceed.append(r)
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    70
    ranges = list(ranges)
2142
7dc66a526b21 stablerange: stop using '.node' in subrangesclosure
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2141
diff changeset
    71
    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
    72
    rangelength = stablerange.rangelength
2167
d37f0423c072 stablerange: use rangelength in subrangesclosure
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2163
diff changeset
    73
    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
    74
    return ranges
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    75
3248
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    76
_stablerangemethodmap = {
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    77
    'branchpoint': lambda repo: repo.stablerange,
3251
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
    78
    '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
    79
    '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
    80
    '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
    81
}
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    82
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    83
@eh.command(
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    84
    'debugstablerange',
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    85
    [
3248
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    86
        ('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
    87
        ('', '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
    88
        ('', '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
    89
        ('', '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
    90
         '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
    91
    ],
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    92
    _(''))
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    93
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
    94
    """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
    95
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    96
    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
    97
    --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
    98
    """
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    99
    short = nodemod.short
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   100
    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
   101
    if not revs:
7fd55c5efffb debugstablerange: cleanly "Abort" when no revision are specified
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2504
diff changeset
   102
        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
   103
    if ui.verbose:
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   104
        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
   105
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   106
        def _rangestring(repo, rangeid):
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   107
            return template % (
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   108
                short(node(rangeid[0])),
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   109
                rangeid[1],
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   110
                rangeid[0],
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   111
                depth(unfi, rangeid[0]),
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   112
                length(unfi, rangeid)
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   113
            )
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   114
    else:
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   115
        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
   116
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   117
        def _rangestring(repo, rangeid):
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   118
            return template % (
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   119
                short(node(rangeid[0])),
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   120
                rangeid[1],
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   121
            )
3248
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   122
    # 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
   123
    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
   124
    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
   125
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   126
    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
   127
    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
   128
    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
   129
        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
   130
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   131
    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
   132
    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
   133
    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
   134
    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
   135
    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
   136
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   137
    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
   138
        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
   139
    else:
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   140
        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
   141
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   142
    for r in ranges:
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   143
        subs = subranges(unfi, r)
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   144
        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
   145
        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
   146
        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
   147
            status = 'leaf'
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   148
            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
   149
                status = 'complete'
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   150
                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
   151
                subrevs = set()
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   152
                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
   153
                    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
   154
                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
   155
                    status = 'missing'
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   156
            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
   157
        else:
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   158
            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
   159
3250
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   160
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
   161
    """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
   162
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   163
    __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
   164
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   165
    @abc.abstractmethod
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   166
    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
   167
        """return the stable sub-ranges of a rangeid"""
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   168
        raise NotImplemented()
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   169
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   170
    @abc.abstractmethod
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   171
    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
   172
        """return revision contained in a range"""
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   173
        raise NotImplemented()
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   174
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   175
    @abc.abstractmethod
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   176
    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
   177
        """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
   178
        # 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
   179
        # Could be demoted to _depthrev.
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   180
        raise NotImplemented()
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   181
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   182
    @abc.abstractmethod
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   183
    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
   184
        """warmup the stable range cache"""
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   185
        raise NotImplemented()
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   186
3259
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   187
    @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
   188
    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
   189
        """number of revision in <range>"""
3259
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   190
        raise NotImplemented()
3250
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   191
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   192
    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
   193
        """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
   194
        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
   195
        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
   196
        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
   197
        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
   198
            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
   199
                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
   200
            step //= 2
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   201
        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
   202
            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
   203
            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
   204
        else:
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   205
            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
   206
            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
   207
        return slicepoint
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   208
3251
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   209
class stablerangebasic(abstractstablerange):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   210
    """a very dummy implementation of stablerange
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   211
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   212
    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
   213
    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
   214
    to validate output."""
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   215
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   216
    __metaclass__ = abc.ABCMeta
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   217
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   218
    def _sortfunction(self, repo, headrev):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   219
        return stablesort.stablesort_branchpoint(repo, [headrev])
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   220
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   221
    def warmup(self, repo, upto=None):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   222
        # no cache to warm for basic implementation
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   223
        pass
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
    def depthrev(self, repo, rev):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   226
        """depth a revision"""
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   227
        return len(repo.revs('::%d', rev))
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 revsfromrange(self, repo, rangeid):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   230
        """return revision contained in a range
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   231
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   232
        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
   233
        <head>, skipping the <index>th lower revisions.
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   234
        """
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
        revs = self._sortfunction(repo, headrev)
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   237
        return revs[index:]
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   238
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   239
    def rangelength(self, repo, rangeid):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   240
        """number of revision in <range>"""
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   241
        return len(self.revsfromrange(repo, rangeid))
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   242
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   243
    def subranges(self, repo, rangeid):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   244
        """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
   245
        headrev, index = rangeid[0], rangeid[1]
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   246
        if self.rangelength(repo, rangeid) == 1:
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   247
            return []
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   248
        slicepoint = self._slicepoint(repo, rangeid)
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   249
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   250
        # 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
   251
        #
3252
d57400a0f4c3 stablebranch: avoid overlap between subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3251
diff changeset
   252
        # 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
   253
        # current "head" of the lower range.
d57400a0f4c3 stablebranch: avoid overlap between subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3251
diff changeset
   254
        #
d57400a0f4c3 stablebranch: avoid overlap between subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3251
diff changeset
   255
        # 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
   256
        # 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
   257
        result = []
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   258
        lowerrevs = self.revsfromrange(repo, rangeid)[:(slicepoint - index)]
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   259
        head = None
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   260
        headrange = None
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   261
        skip = None
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   262
        for rev in lowerrevs[::-1]:
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   263
            if head is None:
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   264
                head = rev
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   265
                headrange = self.revsfromrange(repo, (head, 0))
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   266
                skip = self.depthrev(repo, rev) - 1
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   267
            elif rev != headrange[skip - 1]:
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   268
                result.append((head, skip))
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   269
                head = rev
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   270
                headrange = self.revsfromrange(repo, (head, 0))
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   271
                skip = self.depthrev(repo, rev) - 1
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   272
            else:
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   273
                skip -= 1
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   274
        result.append((head, skip))
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
        result.reverse()
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   277
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   278
        # top part is trivial
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   279
        top = (headrev, slicepoint)
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   280
        result.append(top)
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   281
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   282
        # double check the result
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   283
        initialrevs = self.revsfromrange(repo, rangeid)
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   284
        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
   285
                           [])
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   286
        assert initialrevs == subrangerevs
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   287
        return result
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   288
3258
af1f8f0687e1 stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3253
diff changeset
   289
class stablerangedummy_mergepoint(stablerangebasic):
af1f8f0687e1 stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3253
diff changeset
   290
    """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
   291
    """
af1f8f0687e1 stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3253
diff changeset
   292
af1f8f0687e1 stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3253
diff changeset
   293
    def _sortfunction(self, repo, headrev):
af1f8f0687e1 stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3253
diff changeset
   294
        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
   295
3259
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   296
class stablerangecached(abstractstablerange):
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   297
    """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
   298
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   299
    __metaclass__ = abc.ABCMeta
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   300
3302
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   301
    def __init__(self):
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   302
        # 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
   303
        self._subrangescache = {}
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   304
        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
   305
3259
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   306
    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
   307
        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
   308
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   309
    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
   310
        """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
   311
        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
   312
        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
   313
3302
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   314
    def subranges(self, repo, rangeid):
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   315
        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
   316
        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
   317
            return cached
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   318
        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
   319
        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
   320
        return value
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
    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
   323
        """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
   324
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   325
        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
   326
        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
   327
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   328
    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
   329
        """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
   330
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   331
        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
   332
        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
   333
3303
318c938be80d stablerange: drop the basic inheritance from the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3302
diff changeset
   334
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
   335
    """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
   336
    """
3261
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   337
3264
383ec26247b3 stablerange: use the new cache object in the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   338
    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
   339
        self._sortcache = stablesort.stablesortcache()
383ec26247b3 stablerange: use the new cache object in the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   340
        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
   341
3303
318c938be80d stablerange: drop the basic inheritance from the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3302
diff changeset
   342
    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
   343
        # 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
   344
        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
   345
3261
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   346
    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
   347
        """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
   348
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   349
        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
   350
        <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
   351
        """
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   352
        limit = self.rangelength(repo, rangeid)
3264
383ec26247b3 stablerange: use the new cache object in the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   353
        return self._sortcache.get(repo, rangeid[0], limit=limit)
3260
2f0c113b35f8 stablerange: introduce a smarte version of stablerange for 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3259
diff changeset
   354
3301
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   355
    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
   356
        """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
   357
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   358
        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
   359
        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
   360
        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
   361
        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
   362
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   363
            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
   364
                          + 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
   365
                          + [REV]
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   366
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   367
        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
   368
        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
   369
        """
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   370
        p1, p2 = repo.changelog.parentrevs(headrev)
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   371
        relevant_parent = None
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   372
        if p2 == nodemod.nullrev:
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   373
            relevant_parent = p1
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   374
        else:
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   375
            tiebreaker = stablesort._mergepoint_tie_breaker(repo)
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   376
            relevant_parent = min(p1, p2, key=tiebreaker)
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   377
        return relevant_parent
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   378
3304
d942fc5847f9 stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3303
diff changeset
   379
    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
   380
        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
   381
        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
   382
        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
   383
        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
   384
3302
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   385
    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
   386
        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
   387
        # 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
   388
        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
   389
            return []
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   390
        # 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
   391
        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
   392
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   393
        # top range is always the same, so we can build it early for all
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   394
        top_range = (headrev, slicepoint)
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   395
3304
d942fc5847f9 stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3303
diff changeset
   396
        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
   397
        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
   398
3301
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   399
        # 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
   400
        # 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
   401
        # 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
   402
        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
   403
            # 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
   404
            subranges = [
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   405
                stable_parent_range,
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   406
                top_range,
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   407
            ]
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   408
        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
   409
            # 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
   410
            # 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
   411
            # (and the top range is always the same)
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   412
            subranges = self.subranges(repo, stable_parent_range)[:-1]
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   413
            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
   414
        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
   415
            # 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
   416
            # 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
   417
            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
   418
            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
   419
                                                    stable_parent_depth,
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   420
                                                    slicepoint))
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   421
            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
   422
        else:
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   423
            # 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
   424
            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
   425
                                                    initial_index,
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   426
                                                    slicepoint))
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   427
            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
   428
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   429
        return subranges
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   430
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   431
    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
   432
        """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
   433
        result = []
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   434
        depth = repo.depthcache.get
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   435
        skips = depth(headrev) - slicepoint
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   436
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   437
        def nextrevs():
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   438
            revs = self._sortcache.walkfrom(repo, headrev)
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   439
            towalk = depth(headrev) - initial_index
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   440
            while 0 < towalk:
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   441
                yield next(revs)
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   442
                towalk -= 1
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   443
            yield None
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   444
        revs = nextrevs()
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   445
        for i in xrange(skips):
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   446
            next(revs)
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   447
        rangehead = current = next(revs)
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   448
        rangepath = self._sortcache.walkfrom(repo, current)
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   449
        nextonpath = next(rangepath, None)
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   450
        steps = 0
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   451
        while current is not None:
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   452
            while current == nextonpath and current is not None:
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   453
                steps += 1
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   454
                current = next(revs)
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   455
                nextonpath = next(rangepath, None)
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   456
            result.append((rangehead, depth(rangehead) - steps))
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   457
            if current is not None:
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   458
                rangehead = current
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   459
                rangepath = self._sortcache.walkfrom(repo, current)
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   460
                nextonpath = next(rangepath, None)
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   461
                steps = 0
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   462
        result.reverse()
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   463
        return result
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   464
3259
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   465
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
   466
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
   467
    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
   468
        # 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
   469
        self._tiprev = None
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   470
        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
   471
        # 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
   472
        # 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
   473
        # 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
   474
        # 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
   475
        # 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
   476
        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
   477
        # 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
   478
        # 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
   479
        self._stablesortprepared = util.lrucachedict(lrusize)
2209
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   480
        # 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
   481
        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
   482
        # 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
   483
        # 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
   484
        # 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
   485
        # merge.
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   486
        self._inheritancecache = {}
3302
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   487
        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
   488
2233
e922cd76804a stablerange: warmup all upto a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2232
diff changeset
   489
    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
   490
        """warm the cache up"""
2201
8d371329e8b9 stablecache: warmup on unfiltered repository
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2200
diff changeset
   491
        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
   492
        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
   493
        cl = repo.changelog
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   494
        # 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
   495
        # 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
   496
        # stablesort.
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   497
        #
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   498
        # 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
   499
        ui = repo.ui
2424
4afbcdcfa9b2 compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2400
diff changeset
   500
        starttime = timer()
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   501
2235
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   502
        if upto is None:
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   503
            upto = len(cl) - 1
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   504
        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
   505
            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
   506
            nbrevs = upto + 1
e922cd76804a stablerange: warmup all upto a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2232
diff changeset
   507
        else:
2235
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   508
            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
   509
            if upto <= self._tiprev:
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   510
                return
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   511
            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
   512
            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
   513
        rangeheap = []
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   514
        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
   515
            if not idx % 1000:
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   516
                ui.progress(_("filling depth cache"), idx, total=nbrevs)
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   517
            # warm up depth
2135
8f63f4b1c33e stablerange: add an official warmup function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2134
diff changeset
   518
            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
   519
            rangeheap.append((-r, (r, 0)))
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   520
        ui.progress(_("filling depth cache"), None, total=nbrevs)
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   521
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   522
        heappop = heapq.heappop
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   523
        heappush = heapq.heappush
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   524
        heapify = heapq.heapify
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   525
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   526
        original = set(rangeheap)
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   527
        seen = 0
2503
cdf6a0e028c0 stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   528
        # 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
   529
        # 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
   530
        progress_each = 100
cdf6a0e028c0 stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   531
        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
   532
        heapify(rangeheap)
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   533
        while rangeheap:
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   534
            value = heappop(rangeheap)
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   535
            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
   536
                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
   537
                    # 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
   538
                    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
   539
                    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
   540
                        progress_each /= 10
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   541
                    ui.progress(_("filling stablerange cache"), seen, total=nbrevs)
2503
cdf6a0e028c0 stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   542
                    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
   543
                seen += 1
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   544
                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
   545
            __, 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
   546
            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
   547
                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
   548
                    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
   549
                        heappush(rangeheap, (-sub[0], sub))
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   550
        ui.progress(_("filling stablerange cache"), None, total=nbrevs)
2135
8f63f4b1c33e stablerange: add an official warmup function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2134
diff changeset
   551
2235
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   552
        self._tiprev = upto
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   553
        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
   554
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
   555
        duration = timer() - starttime
2381
07725f25296b stablerange: log time spent updating the stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2368
diff changeset
   556
        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
   557
                    duration)
07725f25296b stablerange: log time spent updating the stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2368
diff changeset
   558
2182
884f6309eae7 stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2181
diff changeset
   559
    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
   560
        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
   561
        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
   562
            return cached
2204
61a8b51348a1 subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2201
diff changeset
   563
        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
   564
        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
   565
        return value
884f6309eae7 stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2181
diff changeset
   566
2183
3c2992afee71 stablerange: move revs computation within the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2182
diff changeset
   567
    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
   568
        headrev, index = rangeid
2211
ecb46c7ee281 minor simplification around rangelength
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2210
diff changeset
   569
        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
   570
        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
   571
            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
   572
        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
   573
            # 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
   574
            #
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
   575
            # 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
   576
            # 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
   577
            # call for the general case.
2529
537058b433ef compat: fix stablerange for mercurial 3.9
Boris Feld <boris.feld@octobus.net>
parents: 2506
diff changeset
   578
3145
ca6650879726 compat: drop 'lru.get' work-around for 3.9
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2551
diff changeset
   579
            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
   580
            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
   581
                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
   582
                if allrevs is None:
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3240
diff changeset
   583
                    mc = self._filestablesortcache
3245
63d58f7db120 stablesort: rename function to stablesort_branchpoint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3244
diff changeset
   584
                    sorting = stablesort.stablesort_branchpoint
63d58f7db120 stablesort: rename function to stablesort_branchpoint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3244
diff changeset
   585
                    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
   586
                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
   587
            # 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
   588
            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
   589
        # sanity checks
2211
ecb46c7ee281 minor simplification around rangelength
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2210
diff changeset
   590
        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
   591
        return revs
3c2992afee71 stablerange: move revs computation within the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2182
diff changeset
   592
2209
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   593
    def _parents(self, rev, func):
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   594
        parents = self._parentscache.get(rev)
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   595
        if parents is None:
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   596
            parents = func(rev)
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   597
            self._parentscache[rev] = parents
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   598
        return parents
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   599
2226
83e6933ae00e subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2225
diff changeset
   600
    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
   601
        """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
   602
83e6933ae00e subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2225
diff changeset
   603
        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
   604
        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
   605
2227
4b621b56e3a1 subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2226
diff changeset
   606
    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
   607
        """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
   608
4b621b56e3a1 subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2226
diff changeset
   609
        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
   610
        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
   611
2213
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   612
    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
   613
        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
   614
            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
   615
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   616
    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
   617
        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
   618
        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
   619
            return None
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   620
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   621
        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
   622
        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
   623
        nbextrarevs = prepared[1] - mergedepth
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   624
        if not nbextrarevs:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   625
            return allrevs
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   626
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   627
        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
   628
        top = []
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   629
        counter = nbextrarevs
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   630
        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
   631
            if rev in anc:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   632
                top.append(rev)
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   633
            else:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   634
                counter -= 1
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   635
                if counter <= 0:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   636
                    break
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   637
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   638
        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
   639
        revs = allrevs[:bottomidx]
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   640
        revs.extend(reversed(top))
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   641
        return revs
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   642
2220
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   643
    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
   644
        """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
   645
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   646
        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
   647
        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
   648
        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
   649
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   650
        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
   651
        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
   652
        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
   653
        """
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   654
        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
   655
        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
   656
            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
   657
            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
   658
            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
   659
            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
   660
            # 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
   661
            # 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
   662
            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
   663
            # 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
   664
            # 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
   665
            # branching.
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   666
            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
   667
                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
   668
                    break
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   669
                expected -= 1
2221
f61d091d318e stablerange: small style fix
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2220
diff changeset
   670
            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
   671
            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
   672
        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
   673
2204
61a8b51348a1 subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2201
diff changeset
   674
    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
   675
        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
   676
            return []
61a8b51348a1 subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2201
diff changeset
   677
        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
   678
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   679
        # 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
   680
        # 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
   681
        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
   682
        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
   683
        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
   684
            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
   685
            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
   686
                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
   687
        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
   688
            # 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
   689
            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
   690
        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
   691
2219
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   692
    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
   693
        """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
   694
        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
   695
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   696
        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
   697
        the parent rev s if possible and needed"""
2209
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   698
        p1, p2 = self._parents(rangeid[0], repo.changelog.parentrevs)
2220
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   699
        if p2 == nodemod.nullrev:
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   700
            # regular changesets, we pick the parent
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   701
            reusablerev = p1
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   702
        else:
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   703
            # 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
   704
            # 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
   705
            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
   706
2219
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   707
        # 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
   708
        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
   709
            return None
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   710
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   711
        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
   712
        # 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
   713
        # 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
   714
        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
   715
            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
   716
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
   717
        # 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
   718
        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
   719
2131
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   720
    def _slicesrangeat(self, repo, rangeid, globalindex):
2209
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   721
        p1, p2 = self._parents(rangeid[0], repo.changelog.parentrevs)
2220
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   722
        if p2 == nodemod.nullrev:
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   723
            reuserev = p1
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   724
        else:
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   725
            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
   726
            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
   727
                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
   728
2218
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   729
        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
   730
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   731
        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
   732
        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
   733
2218
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   734
        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
   735
            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
   736
        # 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
   737
        # 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
   738
        # 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
   739
        # 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
   740
        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
   741
        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
   742
        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
   743
        return slices
2136
086a85c37e9e stablerange: compute subranges from parent when possible
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2135
diff changeset
   744
2169
03baabcd1b9e stablerange: use rangelength in '_slicesatrange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2168
diff changeset
   745
    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
   746
        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
   747
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   748
        result = []
2190
f4cc3cf27a3a revsfromrange: remove reference to '_revs' in merge slicing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2189
diff changeset
   749
        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
   750
        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
   751
6d9cadc635d5 merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2214
diff changeset
   752
        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
   753
            # 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
   754
            # 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
   755
            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
   756
        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
   757
            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
   758
            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
   759
            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
   760
            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
   761
                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
   762
                    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
   763
                    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
   764
                    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
   765
                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
   766
                    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
   767
                    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
   768
                    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
   769
                    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
   770
                else:
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   771
                    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
   772
            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
   773
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   774
            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
   775
2215
6d9cadc635d5 merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2214
diff changeset
   776
        # 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
   777
        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
   778
        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
   779
        return result
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   780
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   781
#############################
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   782
### simple sqlite caching ###
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   783
#############################
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   784
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   785
_sqliteschema = [
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   786
    """CREATE TABLE meta(schemaversion INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   787
                         tiprev        INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   788
                         tipnode       BLOB    NOT NULL
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   789
                        );""",
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   790
    """CREATE TABLE range(rev INTEGER  NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   791
                          idx INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   792
                          PRIMARY KEY(rev, idx));""",
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   793
    """CREATE TABLE subranges(listidx INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   794
                              suprev  INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   795
                              supidx  INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   796
                              subrev  INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   797
                              subidx  INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   798
                              PRIMARY KEY(listidx, suprev, supidx),
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   799
                              FOREIGN KEY (suprev, supidx) REFERENCES range(rev, idx),
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   800
                              FOREIGN KEY (subrev, subidx) REFERENCES range(rev, idx)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   801
    );""",
2240
ecb993892c61 stablerange: warm cache before using it server side
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2238
diff changeset
   802
    "CREATE INDEX subranges_index ON subranges (suprev, supidx);",
ecb993892c61 stablerange: warm cache before using it server side
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2238
diff changeset
   803
    "CREATE INDEX range_index ON range (rev, idx);",
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   804
]
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   805
_newmeta = "INSERT INTO meta (schemaversion, tiprev, tipnode) VALUES (?,?,?);"
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   806
_updatemeta = "UPDATE meta SET tiprev = ?, tipnode = ?;"
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   807
_updaterange = "INSERT INTO range(rev, idx) VALUES (?,?);"
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   808
_updatesubranges = """INSERT
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   809
                       INTO subranges(listidx, suprev, supidx, subrev, subidx)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   810
                       VALUES (?,?,?,?,?);"""
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   811
_queryexist = "SELECT name FROM sqlite_master WHERE type='table' AND name='meta';"
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   812
_querymeta = "SELECT schemaversion, tiprev, tipnode FROM meta;"
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   813
_queryrange = "SELECT * FROM range WHERE (rev = ? AND idx = ?);"
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   814
_querysubranges = """SELECT subrev, subidx
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   815
                     FROM subranges
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   816
                     WHERE (suprev = ? AND supidx = ?)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   817
                     ORDER BY listidx;"""
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   818
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   819
class sqlstablerange(stablerange):
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   820
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   821
    _schemaversion = 1
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   822
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   823
    def __init__(self, repo):
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
   824
        lrusize = repo.ui.configint('experimental', 'obshashrange.lru-size',
d95006fe4dd0 stablerange: use last recently used caching for revisions associated to ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2503
diff changeset
   825
                                    2000)
d95006fe4dd0 stablerange: use last recently used caching for revisions associated to ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2503
diff changeset
   826
        super(sqlstablerange, self).__init__(lrusize=lrusize)
2400
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   827
        self._vfs = repo.vfs
3244
d5a7edd5d008 stablerange: update the filename to avoid cache confusion
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3243
diff changeset
   828
        self._path = repo.vfs.join('cache/evoext_stablerange_v1.sqlite')
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   829
        self._cl = repo.unfiltered().changelog # (okay to keep an old one)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   830
        self._ondisktiprev = None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   831
        self._ondisktipnode = None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   832
        self._unsavedsubranges = {}
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   833
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   834
    def warmup(self, repo, upto=None):
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   835
        self._con # make sure the data base is loaded
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   836
        try:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   837
            # samelessly lock the repo to ensure nobody will update the repo
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   838
            # concurently. This should not be too much of an issue if we warm
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   839
            # at the end of the transaction.
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   840
            #
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   841
            # XXX However, we lock even if we are up to date so we should check
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   842
            # before locking
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   843
            with repo.lock():
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   844
                super(sqlstablerange, self).warmup(repo, upto)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   845
                self._save(repo)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   846
        except error.LockError:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   847
            # Exceptionnally we are noisy about it since performance impact is
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   848
            # large We should address that before using this more widely.
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   849
            repo.ui.warn('stable-range cache: unable to lock repo while warming\n')
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   850
            repo.ui.warn('(cache will not be saved)\n')
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   851
            super(sqlstablerange, self).warmup(repo, upto)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   852
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   853
    def _getsub(self, rangeid):
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   854
        cache = self._subrangescache
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   855
        if rangeid not in cache and rangeid[0] <= self._ondisktiprev and self._con is not None:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   856
            value = None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   857
            result = self._con.execute(_queryrange, rangeid).fetchone()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   858
            if result is not None: # database know about this node (skip in the future?)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   859
                value = self._con.execute(_querysubranges, rangeid).fetchall()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   860
            # in memory caching of the value
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   861
            cache[rangeid] = value
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   862
        return cache.get(rangeid)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   863
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   864
    def _setsub(self, rangeid, value):
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   865
        assert rangeid not in self._unsavedsubranges
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   866
        self._unsavedsubranges[rangeid] = value
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   867
        super(sqlstablerange, self)._setsub(rangeid, value)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   868
2400
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   869
    def _db(self):
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   870
        try:
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   871
            util.makedirs(self._vfs.dirname(self._path))
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   872
        except OSError:
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   873
            return None
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   874
        con = sqlite3.connect(self._path)
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   875
        con.text_factory = str
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   876
        return con
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   877
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   878
    @util.propertycache
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   879
    def _con(self):
2400
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   880
        con = self._db()
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   881
        if con is None:
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   882
            return None
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   883
        cur = con.execute(_queryexist)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   884
        if cur.fetchone() is None:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   885
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   886
        meta = con.execute(_querymeta).fetchone()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   887
        if meta is None:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   888
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   889
        if meta[0] != self._schemaversion:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   890
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   891
        if len(self._cl) <= meta[1]:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   892
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   893
        if self._cl.node(meta[1]) != meta[2]:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   894
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   895
        self._ondisktiprev = meta[1]
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   896
        self._ondisktipnode = meta[2]
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   897
        if self._tiprev < self._ondisktiprev:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   898
            self._tiprev = self._ondisktiprev
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   899
            self._tipnode = self._ondisktipnode
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   900
        return con
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   901
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   902
    def _save(self, repo):
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   903
        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
   904
        repo.depthcache.save(repo)
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   905
        if not self._unsavedsubranges:
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   906
            return # no new data
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   907
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   908
        if self._con is None:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   909
            util.unlinkpath(self._path, ignoremissing=True)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   910
            if '_con' in vars(self):
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   911
                del self._con
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   912
2400
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   913
            con = self._db()
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   914
            if con is None:
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   915
                return
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   916
            with con:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   917
                for req in _sqliteschema:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   918
                    con.execute(req)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   919
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   920
                meta = [self._schemaversion,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   921
                        self._tiprev,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   922
                        self._tipnode,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   923
                ]
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   924
                con.execute(_newmeta, meta)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   925
        else:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   926
            con = self._con
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   927
            meta = con.execute(_querymeta).fetchone()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   928
            if meta[2] != self._ondisktipnode or meta[1] != self._ondisktiprev:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   929
                # drifting is currently an issue because this means another
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   930
                # process might have already added the cache line we are about
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   931
                # to add. This will confuse sqlite
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   932
                msg = _('stable-range cache: skipping write, '
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   933
                        'database drifted under my feet\n')
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   934
                hint = _('(disk: %s-%s vs mem: %s%s)\n')
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   935
                data = (meta[2], meta[1], self._ondisktiprev, self._ondisktipnode)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   936
                repo.ui.warn(msg)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   937
                repo.ui.warn(hint % data)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   938
                return
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   939
            meta = [self._tiprev,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   940
                    self._tipnode,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   941
            ]
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   942
            con.execute(_updatemeta, meta)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   943
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   944
        self._saverange(con, repo)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   945
        con.commit()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   946
        self._ondisktiprev = self._tiprev
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   947
        self._ondisktipnode = self._tipnode
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   948
        self._unsavedsubranges.clear()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   949
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   950
    def _saverange(self, con, repo):
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   951
        repo = repo.unfiltered()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   952
        data = []
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   953
        allranges = set()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   954
        for key, value in self._unsavedsubranges.items():
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   955
            allranges.add(key)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   956
            for idx, sub in enumerate(value):
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   957
                data.append((idx, key[0], key[1], sub[0], sub[1]))
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   958
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   959
        con.executemany(_updaterange, allranges)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   960
        con.executemany(_updatesubranges, data)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   961
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   962
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   963
@eh.reposetup
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   964
def setupcache(ui, repo):
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   965
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   966
    class stablerangerepo(repo.__class__):
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   967
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   968
        @localrepo.unfilteredpropertycache
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   969
        def stablerange(self):
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   970
            return sqlstablerange(repo)
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   971
2236
c0e2ba85e76a stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2235
diff changeset
   972
        @localrepo.unfilteredmethod
c0e2ba85e76a stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2235
diff changeset
   973
        def destroyed(self):
c0e2ba85e76a stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2235
diff changeset
   974
            if 'stablerange' in vars(self):
c0e2ba85e76a stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2235
diff changeset
   975
                del self.stablerange
2287
18b8dc058f75 repo: properly progate "destroyed" call to super class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   976
            super(stablerangerepo, self).destroyed()
2236
c0e2ba85e76a stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2235
diff changeset
   977
2238
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
   978
        def transaction(self, *args, **kwargs):
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
   979
            tr = super(stablerangerepo, self).transaction(*args, **kwargs)
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
   980
            if not repo.ui.configbool('experimental', 'obshashrange', False):
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
   981
                return tr
2506
747dc7067751 stablerange: also respect the 'warm-cache' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2505
diff changeset
   982
            if not repo.ui.configbool('experimental', 'obshashrange.warm-cache',
747dc7067751 stablerange: also respect the 'warm-cache' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2505
diff changeset
   983
                                      True):
747dc7067751 stablerange: also respect the 'warm-cache' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2505
diff changeset
   984
                return tr
2551
ecd47c63b6de obshashrange: add an option to protect from accidental activation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2529
diff changeset
   985
            maxrevs = self.ui.configint('experimental', 'obshashrange.max-revs', None)
ecd47c63b6de obshashrange: add an option to protect from accidental activation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2529
diff changeset
   986
            if maxrevs is not None and maxrevs < len(self.unfiltered()):
ecd47c63b6de obshashrange: add an option to protect from accidental activation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2529
diff changeset
   987
                return tr
2238
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
   988
            reporef = weakref.ref(self)
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
   989
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
   990
            def _warmcache(tr):
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
   991
                repo = reporef()
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
   992
                if repo is None:
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
   993
                    return
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
   994
                if 'node' in tr.hookargs:
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
   995
                    # new nodes !
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
   996
                    repo.stablerange.warmup(repo)
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
   997
2368
b73e1f879646 cache: ensure we warm stablerange cache before the obshashrange cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   998
            tr.addpostclose('warmcache-10-stablerange', _warmcache)
2238
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
   999
            return tr
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
  1000
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
  1001
    repo.__class__ = stablerangerepo