hgext3rd/evolve/stablerange.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Sun, 10 Dec 2017 05:04:41 +0100
changeset 3268 10badf5951e5
parent 3264 383ec26247b3
child 3301 5c45df0c8e36
permissions -rw-r--r--
stablerange: compute the subrange closure on an unfiltered repository This avoid various overhead from filtering.
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
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   301
    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
   302
        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
   303
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   304
    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
   305
        """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
   306
        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
   307
        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
   308
3264
383ec26247b3 stablerange: use the new cache object in the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   309
class stablerange_mergepoint(stablerangecached, stablerangebasic):
3260
2f0c113b35f8 stablerange: introduce a smarte version of stablerange for 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3259
diff changeset
   310
    """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
   311
    """
3261
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   312
3264
383ec26247b3 stablerange: use the new cache object in the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   313
    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
   314
        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
   315
        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
   316
383ec26247b3 stablerange: use the new cache object in the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   317
    def _sortfunction(self, repo, headrev):
383ec26247b3 stablerange: use the new cache object in the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   318
        return self._sortcache.get(repo, headrev)
383ec26247b3 stablerange: use the new cache object in the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   319
3261
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   320
    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
   321
        """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
   322
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   323
        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
   324
        <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
   325
        """
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   326
        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
   327
        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
   328
3259
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   329
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
   330
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
   331
    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
   332
        # 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
   333
        self._tiprev = None
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   334
        self._tipnode = None
2234
16a5a37ced62 stablerange: add some basic documentation about the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2233
diff changeset
   335
        # cache the standard stable subranges or a range
2127
e2770faac2df stablerange: move the subrange cache into our new class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2126
diff changeset
   336
        self._subrangescache = {}
2184
3ec0be20e365 stablerange: add a cache for stablesort ordering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2183
diff changeset
   337
        # 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
   338
        # 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
   339
        # 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
   340
        # 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
   341
        # 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
   342
        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
   343
        # 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
   344
        # 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
   345
        self._stablesortprepared = util.lrucachedict(lrusize)
2209
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   346
        # 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
   347
        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
   348
        # 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
   349
        # 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
   350
        # 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
   351
        # merge.
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   352
        self._inheritancecache = {}
2184
3ec0be20e365 stablerange: add a cache for stablesort ordering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2183
diff changeset
   353
2233
e922cd76804a stablerange: warmup all upto a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2232
diff changeset
   354
    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
   355
        """warm the cache up"""
2201
8d371329e8b9 stablecache: warmup on unfiltered repository
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2200
diff changeset
   356
        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
   357
        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
   358
        cl = repo.changelog
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   359
        # 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
   360
        # 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
   361
        # stablesort.
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   362
        #
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   363
        # 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
   364
        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
   365
        starttime = timer()
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   366
2235
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   367
        if upto is None:
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   368
            upto = len(cl) - 1
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   369
        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
   370
            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
   371
            nbrevs = upto + 1
e922cd76804a stablerange: warmup all upto a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2232
diff changeset
   372
        else:
2235
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   373
            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
   374
            if upto <= self._tiprev:
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   375
                return
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   376
            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
   377
            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
   378
        rangeheap = []
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   379
        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
   380
            if not idx % 1000:
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   381
                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
   382
            # warm up depth
2135
8f63f4b1c33e stablerange: add an official warmup function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2134
diff changeset
   383
            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
   384
            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
   385
        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
   386
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   387
        heappop = heapq.heappop
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   388
        heappush = heapq.heappush
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   389
        heapify = heapq.heapify
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   390
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   391
        original = set(rangeheap)
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   392
        seen = 0
2503
cdf6a0e028c0 stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   393
        # 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
   394
        # 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
   395
        progress_each = 100
cdf6a0e028c0 stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   396
        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
   397
        heapify(rangeheap)
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   398
        while rangeheap:
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   399
            value = heappop(rangeheap)
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   400
            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
   401
                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
   402
                    # 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
   403
                    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
   404
                    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
   405
                        progress_each /= 10
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   406
                    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
   407
                    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
   408
                seen += 1
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   409
                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
   410
            __, 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
   411
            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
   412
                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
   413
                    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
   414
                        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
   415
        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
   416
2235
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   417
        self._tiprev = upto
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   418
        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
   419
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
   420
        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
   421
        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
   422
                    duration)
07725f25296b stablerange: log time spent updating the stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2368
diff changeset
   423
2182
884f6309eae7 stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2181
diff changeset
   424
    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
   425
        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
   426
        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
   427
            return cached
2204
61a8b51348a1 subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2201
diff changeset
   428
        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
   429
        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
   430
        return value
884f6309eae7 stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2181
diff changeset
   431
2183
3c2992afee71 stablerange: move revs computation within the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2182
diff changeset
   432
    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
   433
        headrev, index = rangeid
2211
ecb46c7ee281 minor simplification around rangelength
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2210
diff changeset
   434
        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
   435
        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
   436
            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
   437
        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
   438
            # 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
   439
            #
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
   440
            # 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
   441
            # 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
   442
            # call for the general case.
2529
537058b433ef compat: fix stablerange for mercurial 3.9
Boris Feld <boris.feld@octobus.net>
parents: 2506
diff changeset
   443
3145
ca6650879726 compat: drop 'lru.get' work-around for 3.9
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2551
diff changeset
   444
            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
   445
            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
   446
                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
   447
                if allrevs is None:
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3240
diff changeset
   448
                    mc = self._filestablesortcache
3245
63d58f7db120 stablesort: rename function to stablesort_branchpoint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3244
diff changeset
   449
                    sorting = stablesort.stablesort_branchpoint
63d58f7db120 stablesort: rename function to stablesort_branchpoint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3244
diff changeset
   450
                    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
   451
                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
   452
            # 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
   453
            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
   454
        # sanity checks
2211
ecb46c7ee281 minor simplification around rangelength
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2210
diff changeset
   455
        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
   456
        return revs
3c2992afee71 stablerange: move revs computation within the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2182
diff changeset
   457
2209
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   458
    def _parents(self, rev, func):
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   459
        parents = self._parentscache.get(rev)
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   460
        if parents is None:
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   461
            parents = func(rev)
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   462
            self._parentscache[rev] = parents
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   463
        return parents
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   464
2226
83e6933ae00e subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2225
diff changeset
   465
    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
   466
        """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
   467
83e6933ae00e subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2225
diff changeset
   468
        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
   469
        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
   470
2227
4b621b56e3a1 subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2226
diff changeset
   471
    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
   472
        """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
   473
4b621b56e3a1 subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2226
diff changeset
   474
        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
   475
        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
   476
2213
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   477
    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
   478
        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
   479
            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
   480
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   481
    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
   482
        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
   483
        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
   484
            return None
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   485
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   486
        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
   487
        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
   488
        nbextrarevs = prepared[1] - mergedepth
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   489
        if not nbextrarevs:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   490
            return allrevs
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   491
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   492
        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
   493
        top = []
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   494
        counter = nbextrarevs
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   495
        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
   496
            if rev in anc:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   497
                top.append(rev)
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   498
            else:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   499
                counter -= 1
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   500
                if counter <= 0:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   501
                    break
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   502
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   503
        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
   504
        revs = allrevs[:bottomidx]
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   505
        revs.extend(reversed(top))
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   506
        return revs
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   507
2220
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   508
    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
   509
        """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
   510
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   511
        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
   512
        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
   513
        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
   514
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   515
        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
   516
        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
   517
        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
   518
        """
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   519
        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
   520
        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
   521
            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
   522
            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
   523
            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
   524
            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
   525
            # 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
   526
            # 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
   527
            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
   528
            # 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
   529
            # 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
   530
            # branching.
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   531
            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
   532
                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
   533
                    break
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   534
                expected -= 1
2221
f61d091d318e stablerange: small style fix
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2220
diff changeset
   535
            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
   536
            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
   537
        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
   538
2204
61a8b51348a1 subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2201
diff changeset
   539
    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
   540
        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
   541
            return []
61a8b51348a1 subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2201
diff changeset
   542
        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
   543
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   544
        # 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
   545
        # 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
   546
        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
   547
        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
   548
        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
   549
            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
   550
            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
   551
                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
   552
        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
   553
            # 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
   554
            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
   555
        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
   556
2219
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   557
    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
   558
        """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
   559
        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
   560
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   561
        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
   562
        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
   563
        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
   564
        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
   565
            # 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
   566
            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
   567
        else:
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   568
            # 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
   569
            # 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
   570
            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
   571
2219
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   572
        # 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
   573
        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
   574
            return None
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   575
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   576
        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
   577
        # 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
   578
        # 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
   579
        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
   580
            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
   581
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
   582
        # 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
   583
        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
   584
2131
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   585
    def _slicesrangeat(self, repo, rangeid, globalindex):
2209
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   586
        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
   587
        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
   588
            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
   589
        else:
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   590
            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
   591
            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
   592
                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
   593
2218
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   594
        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
   595
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   596
        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
   597
        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
   598
2218
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   599
        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
   600
            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
   601
        # 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
   602
        # 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
   603
        # 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
   604
        # 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
   605
        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
   606
        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
   607
        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
   608
        return slices
2136
086a85c37e9e stablerange: compute subranges from parent when possible
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2135
diff changeset
   609
2169
03baabcd1b9e stablerange: use rangelength in '_slicesatrange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2168
diff changeset
   610
    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
   611
        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
   612
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   613
        result = []
2190
f4cc3cf27a3a revsfromrange: remove reference to '_revs' in merge slicing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2189
diff changeset
   614
        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
   615
        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
   616
6d9cadc635d5 merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2214
diff changeset
   617
        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
   618
            # 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
   619
            # 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
   620
            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
   621
        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
   622
            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
   623
            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
   624
            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
   625
            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
   626
                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
   627
                    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
   628
                    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
   629
                    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
   630
                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
   631
                    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
   632
                    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
   633
                    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
   634
                    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
   635
                else:
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   636
                    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
   637
            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
   638
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
   639
            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
   640
2215
6d9cadc635d5 merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2214
diff changeset
   641
        # 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
   642
        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
   643
        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
   644
        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
   645
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   646
#############################
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   647
### simple sqlite caching ###
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   648
#############################
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   649
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   650
_sqliteschema = [
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   651
    """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
   652
                         tiprev        INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   653
                         tipnode       BLOB    NOT NULL
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   654
                        );""",
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   655
    """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
   656
                          idx INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   657
                          PRIMARY KEY(rev, idx));""",
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   658
    """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
   659
                              suprev  INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   660
                              supidx  INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   661
                              subrev  INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   662
                              subidx  INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   663
                              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
   664
                              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
   665
                              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
   666
    );""",
2240
ecb993892c61 stablerange: warm cache before using it server side
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2238
diff changeset
   667
    "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
   668
    "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
   669
]
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   670
_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
   671
_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
   672
_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
   673
_updatesubranges = """INSERT
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   674
                       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
   675
                       VALUES (?,?,?,?,?);"""
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   676
_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
   677
_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
   678
_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
   679
_querysubranges = """SELECT subrev, subidx
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   680
                     FROM subranges
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   681
                     WHERE (suprev = ? AND supidx = ?)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   682
                     ORDER BY listidx;"""
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   683
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   684
class sqlstablerange(stablerange):
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   685
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   686
    _schemaversion = 1
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   687
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   688
    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
   689
        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
   690
                                    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
   691
        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
   692
        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
   693
        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
   694
        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
   695
        self._ondisktiprev = None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   696
        self._ondisktipnode = None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   697
        self._unsavedsubranges = {}
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   698
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   699
    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
   700
        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
   701
        try:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   702
            # 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
   703
            # 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
   704
            # 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
   705
            #
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   706
            # 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
   707
            # before locking
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   708
            with repo.lock():
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   709
                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
   710
                self._save(repo)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   711
        except error.LockError:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   712
            # 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
   713
            # 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
   714
            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
   715
            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
   716
            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
   717
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   718
    def _getsub(self, rangeid):
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   719
        cache = self._subrangescache
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   720
        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
   721
            value = None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   722
            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
   723
            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
   724
                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
   725
            # 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
   726
            cache[rangeid] = value
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   727
        return cache.get(rangeid)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   728
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   729
    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
   730
        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
   731
        self._unsavedsubranges[rangeid] = value
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   732
        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
   733
2400
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   734
    def _db(self):
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   735
        try:
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   736
            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
   737
        except OSError:
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   738
            return None
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   739
        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
   740
        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
   741
        return con
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   742
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   743
    @util.propertycache
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   744
    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
   745
        con = self._db()
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   746
        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
   747
            return None
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   748
        cur = con.execute(_queryexist)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   749
        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
   750
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   751
        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
   752
        if meta is None:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   753
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   754
        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
   755
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   756
        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
   757
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   758
        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
   759
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   760
        self._ondisktiprev = meta[1]
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   761
        self._ondisktipnode = meta[2]
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   762
        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
   763
            self._tiprev = self._ondisktiprev
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   764
            self._tipnode = self._ondisktipnode
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   765
        return con
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   766
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   767
    def _save(self, repo):
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   768
        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
   769
        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
   770
        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
   771
            return # no new data
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   772
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   773
        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
   774
            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
   775
            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
   776
                del self._con
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   777
2400
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   778
            con = self._db()
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   779
            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
   780
                return
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   781
            with con:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   782
                for req in _sqliteschema:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   783
                    con.execute(req)
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
                meta = [self._schemaversion,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   786
                        self._tiprev,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   787
                        self._tipnode,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   788
                ]
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   789
                con.execute(_newmeta, meta)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   790
        else:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   791
            con = self._con
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   792
            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
   793
            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
   794
                # 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
   795
                # 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
   796
                # 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
   797
                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
   798
                        '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
   799
                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
   800
                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
   801
                repo.ui.warn(msg)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   802
                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
   803
                return
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   804
            meta = [self._tiprev,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   805
                    self._tipnode,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   806
            ]
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   807
            con.execute(_updatemeta, meta)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   808
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   809
        self._saverange(con, repo)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   810
        con.commit()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   811
        self._ondisktiprev = self._tiprev
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   812
        self._ondisktipnode = self._tipnode
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   813
        self._unsavedsubranges.clear()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   814
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   815
    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
   816
        repo = repo.unfiltered()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   817
        data = []
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   818
        allranges = set()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   819
        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
   820
            allranges.add(key)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   821
            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
   822
                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
   823
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   824
        con.executemany(_updaterange, allranges)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   825
        con.executemany(_updatesubranges, data)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   826
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   827
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   828
@eh.reposetup
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   829
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
   830
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   831
    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
   832
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   833
        @localrepo.unfilteredpropertycache
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   834
        def stablerange(self):
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   835
            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
   836
2236
c0e2ba85e76a stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2235
diff changeset
   837
        @localrepo.unfilteredmethod
c0e2ba85e76a stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2235
diff changeset
   838
        def destroyed(self):
c0e2ba85e76a stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2235
diff changeset
   839
            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
   840
                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
   841
            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
   842
2238
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
   843
        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
   844
            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
   845
            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
   846
                return tr
2506
747dc7067751 stablerange: also respect the 'warm-cache' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2505
diff changeset
   847
            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
   848
                                      True):
747dc7067751 stablerange: also respect the 'warm-cache' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2505
diff changeset
   849
                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
   850
            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
   851
            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
   852
                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
   853
            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
   854
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
   855
            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
   856
                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
   857
                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
   858
                    return
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
   859
                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
   860
                    # 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
   861
                    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
   862
2368
b73e1f879646 cache: ensure we warm stablerange cache before the obshashrange cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   863
            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
   864
            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
   865
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   866
    repo.__class__ = stablerangerepo