hgext3rd/evolve/stablerange.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Sat, 25 Nov 2017 02:58:47 -0500
changeset 3245 63d58f7db120
parent 3244 d5a7edd5d008
child 3248 07c9b6f445bf
permissions -rw-r--r--
stablesort: rename function to stablesort_branchpoint We are about to test different approach to stable sorting. We clarify that the existing method is sorting from branch points.
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
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
    10
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
    11
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
    12
import os
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    13
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
    14
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
    15
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
    16
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    17
from mercurial import (
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    18
    error,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    19
    localrepo,
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    20
    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
    21
    pycompat,
2129
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    22
    scmutil,
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
    23
    util,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    24
)
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    25
2129
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    26
from mercurial.i18n import _
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    27
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    28
from . import (
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3240
diff changeset
    29
    stablesort,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    30
    exthelper,
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    31
)
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    32
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    33
eh = exthelper.exthelper()
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3240
diff changeset
    34
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
    35
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
    36
# 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
    37
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
    38
    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
    39
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
    40
    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
    41
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
    42
    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
    43
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
    44
    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
    45
2129
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
    46
2130
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
    47
#################################
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
    48
### 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
    49
#################################
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
    50
2198
ab392bd1c518 stablerange: move a utility function around
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2197
diff changeset
    51
def _hlp2(i):
ab392bd1c518 stablerange: move a utility function around
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2197
diff changeset
    52
    """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
    53
    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
    54
2137
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    55
def subrangesclosure(repo, heads):
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    56
    """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
    57
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    58
    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
    59
    smallest in terms of number of revision it contains."""
2176
f5e1e43915a1 stablerange: use subranges from the main class in subrangesclosure
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2173
diff changeset
    60
    subranges = repo.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
    61
    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
    62
    ranges = set(toproceed)
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    63
    while toproceed:
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    64
        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
    65
        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
    66
            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
    67
                ranges.add(r)
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    68
                toproceed.append(r)
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    69
    ranges = list(ranges)
2142
7dc66a526b21 stablerange: stop using '.node' in subrangesclosure
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2141
diff changeset
    70
    n = repo.changelog.node
2167
d37f0423c072 stablerange: use rangelength in subrangesclosure
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2163
diff changeset
    71
    rangelength = repo.stablerange.rangelength
d37f0423c072 stablerange: use rangelength in subrangesclosure
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2163
diff changeset
    72
    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
    73
    return ranges
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
    74
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    75
@eh.command(
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    76
    'debugstablerange',
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    77
    [
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    78
        ('', 'rev', [], 'operate on (rev, 0) ranges for rev in REVS'),
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    79
        ('', '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
    80
        ('', 'verify', False, 'checks subranges content (EXPENSIVE)'),
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    81
    ],
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    82
    _(''))
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    83
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
    84
    """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
    85
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    86
    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
    87
    --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
    88
    """
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    89
    short = nodemod.short
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    90
    revs = scmutil.revrange(repo, opts['rev'])
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    91
    # prewarm depth cache
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    92
    unfi = repo.unfiltered()
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    93
    node = unfi.changelog.node
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    94
    stablerange = unfi.stablerange
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    95
    depth = stablerange.depthrev
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    96
    length = stablerange.rangelength
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
    97
    subranges = stablerange.subranges
2505
7fd55c5efffb debugstablerange: cleanly "Abort" when no revision are specified
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2504
diff changeset
    98
    if not revs:
7fd55c5efffb debugstablerange: cleanly "Abort" when no revision are specified
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2504
diff changeset
    99
        raise error.Abort('no revisions specified')
2233
e922cd76804a stablerange: warmup all upto a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2232
diff changeset
   100
    repo.stablerange.warmup(repo, max(revs))
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   101
    if opts['subranges']:
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   102
        ranges = subrangesclosure(repo, revs)
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   103
    else:
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   104
        ranges = [(r, 0) for r in revs]
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   105
    if ui.verbose:
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   106
        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
   107
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   108
        def _rangestring(repo, rangeid):
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   109
            return template % (
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   110
                short(node(rangeid[0])),
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   111
                rangeid[1],
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   112
                rangeid[0],
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   113
                depth(unfi, rangeid[0]),
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   114
                length(unfi, rangeid)
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   115
            )
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   116
    else:
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   117
        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
   118
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   119
        def _rangestring(repo, rangeid):
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   120
            return template % (
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   121
                short(node(rangeid[0])),
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   122
                rangeid[1],
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   123
            )
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   124
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   125
    for r in ranges:
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   126
        subs = subranges(unfi, r)
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   127
        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
   128
        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
   129
        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
   130
            status = 'leaf'
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   131
            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
   132
                status = 'complete'
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   133
                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
   134
                subrevs = set()
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   135
                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
   136
                    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
   137
                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
   138
                    status = 'missing'
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   139
            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
   140
        else:
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   141
            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
   142
2200
d5a216dce71c stablerange: rename the class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2199
diff changeset
   143
class stablerange(object):
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   144
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
   145
    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
   146
        # 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
   147
        self._tiprev = None
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   148
        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
   149
        # 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
   150
        self._subrangescache = {}
2184
3ec0be20e365 stablerange: add a cache for stablesort ordering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2183
diff changeset
   151
        # 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
   152
        # 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
   153
        # 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
   154
        # 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
   155
        # 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
   156
        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
   157
        # 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
   158
        # 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
   159
        self._stablesortprepared = util.lrucachedict(lrusize)
2209
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   160
        # 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
   161
        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
   162
        # 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
   163
        # 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
   164
        # 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
   165
        # merge.
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   166
        self._inheritancecache = {}
2184
3ec0be20e365 stablerange: add a cache for stablesort ordering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2183
diff changeset
   167
2233
e922cd76804a stablerange: warmup all upto a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2232
diff changeset
   168
    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
   169
        """warm the cache up"""
2201
8d371329e8b9 stablecache: warmup on unfiltered repository
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2200
diff changeset
   170
        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
   171
        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
   172
        cl = repo.changelog
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   173
        # 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
   174
        # 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
   175
        # stablesort.
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   176
        #
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   177
        # 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
   178
        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
   179
        starttime = timer()
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   180
2235
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   181
        if upto is None:
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   182
            upto = len(cl) - 1
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   183
        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
   184
            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
   185
            nbrevs = upto + 1
e922cd76804a stablerange: warmup all upto a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2232
diff changeset
   186
        else:
2235
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   187
            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
   188
            if upto <= self._tiprev:
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   189
                return
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   190
            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
   191
            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
   192
        rangeheap = []
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   193
        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
   194
            if not idx % 1000:
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   195
                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
   196
            # warm up depth
2135
8f63f4b1c33e stablerange: add an official warmup function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2134
diff changeset
   197
            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
   198
            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
   199
        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
   200
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   201
        heappop = heapq.heappop
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   202
        heappush = heapq.heappush
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   203
        heapify = heapq.heapify
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   204
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   205
        original = set(rangeheap)
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   206
        seen = 0
2503
cdf6a0e028c0 stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   207
        # 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
   208
        # 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
   209
        progress_each = 100
cdf6a0e028c0 stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   210
        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
   211
        heapify(rangeheap)
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   212
        while rangeheap:
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   213
            value = heappop(rangeheap)
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   214
            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
   215
                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
   216
                    # 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
   217
                    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
   218
                    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
   219
                        progress_each /= 10
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   220
                    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
   221
                    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
   222
                seen += 1
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   223
                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
   224
            __, 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
   225
            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
   226
                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
   227
                    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
   228
                        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
   229
        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
   230
2235
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   231
        self._tiprev = upto
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   232
        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
   233
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
   234
        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
   235
        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
   236
                    duration)
07725f25296b stablerange: log time spent updating the stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2368
diff changeset
   237
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   238
    def depthrev(self, repo, rev):
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   239
        return repo.depthcache.get(rev)
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   240
2182
884f6309eae7 stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2181
diff changeset
   241
    def rangelength(self, repo, rangeid):
884f6309eae7 stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2181
diff changeset
   242
        headrev, index = rangeid[0], rangeid[1]
884f6309eae7 stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2181
diff changeset
   243
        return self.depthrev(repo, headrev) - index
884f6309eae7 stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2181
diff changeset
   244
884f6309eae7 stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2181
diff changeset
   245
    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
   246
        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
   247
        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
   248
            return cached
2204
61a8b51348a1 subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2201
diff changeset
   249
        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
   250
        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
   251
        return value
884f6309eae7 stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2181
diff changeset
   252
2183
3c2992afee71 stablerange: move revs computation within the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2182
diff changeset
   253
    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
   254
        headrev, index = rangeid
2211
ecb46c7ee281 minor simplification around rangelength
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2210
diff changeset
   255
        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
   256
        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
   257
            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
   258
        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
   259
            # 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
   260
            #
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
   261
            # 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
   262
            # 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
   263
            # call for the general case.
2529
537058b433ef compat: fix stablerange for mercurial 3.9
Boris Feld <boris.feld@octobus.net>
parents: 2506
diff changeset
   264
3145
ca6650879726 compat: drop 'lru.get' work-around for 3.9
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2551
diff changeset
   265
            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
   266
            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
   267
                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
   268
                if allrevs is None:
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3240
diff changeset
   269
                    mc = self._filestablesortcache
3245
63d58f7db120 stablesort: rename function to stablesort_branchpoint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3244
diff changeset
   270
                    sorting = stablesort.stablesort_branchpoint
63d58f7db120 stablesort: rename function to stablesort_branchpoint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3244
diff changeset
   271
                    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
   272
                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
   273
            # 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
   274
            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
   275
        # sanity checks
2211
ecb46c7ee281 minor simplification around rangelength
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2210
diff changeset
   276
        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
   277
        return revs
3c2992afee71 stablerange: move revs computation within the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2182
diff changeset
   278
2209
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   279
    def _parents(self, rev, func):
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   280
        parents = self._parentscache.get(rev)
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   281
        if parents is None:
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   282
            parents = func(rev)
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   283
            self._parentscache[rev] = parents
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   284
        return parents
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   285
2226
83e6933ae00e subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2225
diff changeset
   286
    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
   287
        """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
   288
83e6933ae00e subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2225
diff changeset
   289
        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
   290
        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
   291
2227
4b621b56e3a1 subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2226
diff changeset
   292
    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
   293
        """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
   294
4b621b56e3a1 subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2226
diff changeset
   295
        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
   296
        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
   297
2213
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   298
    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
   299
        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
   300
            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
   301
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   302
    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
   303
        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
   304
        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
   305
            return None
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   306
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   307
        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
   308
        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
   309
        nbextrarevs = prepared[1] - mergedepth
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   310
        if not nbextrarevs:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   311
            return allrevs
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   312
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   313
        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
   314
        top = []
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   315
        counter = nbextrarevs
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   316
        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
   317
            if rev in anc:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   318
                top.append(rev)
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   319
            else:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   320
                counter -= 1
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   321
                if counter <= 0:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   322
                    break
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   323
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   324
        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
   325
        revs = allrevs[:bottomidx]
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   326
        revs.extend(reversed(top))
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   327
        return revs
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
   328
2220
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   329
    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
   330
        """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
   331
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   332
        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
   333
        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
   334
        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
   335
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   336
        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
   337
        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
   338
        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
   339
        """
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   340
        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
   341
        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
   342
            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
   343
            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
   344
            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
   345
            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
   346
            # 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
   347
            # 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
   348
            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
   349
            # 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
   350
            # 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
   351
            # branching.
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   352
            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
   353
                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
   354
                    break
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   355
                expected -= 1
2221
f61d091d318e stablerange: small style fix
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2220
diff changeset
   356
            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
   357
            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
   358
        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
   359
2204
61a8b51348a1 subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2201
diff changeset
   360
    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
   361
        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
   362
            return []
61a8b51348a1 subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2201
diff changeset
   363
        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
   364
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   365
        # 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
   366
        # 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
   367
        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
   368
        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
   369
        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
   370
            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
   371
            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
   372
                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
   373
        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
   374
            # 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
   375
            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
   376
        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
   377
2219
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   378
    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
   379
        """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
   380
        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
   381
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
   382
        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
   383
        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
   384
        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
   385
        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
   386
            # 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
   387
            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
   388
        else:
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   389
            # 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
   390
            # 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
   391
            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
   392
2219
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   393
        # 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
   394
        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
   395
            return None
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   396
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
   397
        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
   398
        # 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
   399
        # 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
   400
        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
   401
            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
   402
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
   403
        # 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
   404
        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
   405
2132
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   406
    def _slicepoint(self, repo, rangeid):
2152
c00fb215cd80 stablerange: stop using '.head' in '_slicepoint'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2151
diff changeset
   407
        rangedepth = self.depthrev(repo, rangeid[0])
2132
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   408
        step = _hlp2(rangedepth)
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   409
        standard_start = 0
2160
66b774ed1335 stablerange: stop using '.index' in '_slicepoint'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2159
diff changeset
   410
        while standard_start < rangeid[1] and 0 < step:
2132
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   411
            if standard_start + step < rangedepth:
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   412
                standard_start += step
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   413
            step //= 2
2160
66b774ed1335 stablerange: stop using '.index' in '_slicepoint'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2159
diff changeset
   414
        if rangeid[1] == standard_start:
2168
3012d4ddfb23 stablerange: use rangelength in '_slicepoint'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2167
diff changeset
   415
            slicesize = _hlp2(self.rangelength(repo, rangeid))
2160
66b774ed1335 stablerange: stop using '.index' in '_slicepoint'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2159
diff changeset
   416
            slicepoint = rangeid[1] + slicesize
2132
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   417
        else:
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   418
            assert standard_start < rangedepth
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   419
            slicepoint = standard_start
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   420
        return slicepoint
d77262807411 stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2131
diff changeset
   421
2131
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   422
    def _slicesrangeat(self, repo, rangeid, globalindex):
2209
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   423
        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
   424
        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
   425
            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
   426
        else:
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   427
            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
   428
            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
   429
                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
   430
2218
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   431
        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
   432
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   433
        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
   434
        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
   435
2218
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
   436
        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
   437
            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
   438
        # 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
   439
        # 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
   440
        # 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
   441
        # 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
   442
        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
   443
        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
   444
        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
   445
        return slices
2136
086a85c37e9e stablerange: compute subranges from parent when possible
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2135
diff changeset
   446
2169
03baabcd1b9e stablerange: use rangelength in '_slicesatrange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2168
diff changeset
   447
    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
   448
        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
   449
        cl = repo.changelog
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   450
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   451
        result = []
2190
f4cc3cf27a3a revsfromrange: remove reference to '_revs' in merge slicing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2189
diff changeset
   452
        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
   453
        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
   454
6d9cadc635d5 merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2214
diff changeset
   455
        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
   456
            # 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
   457
            # 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
   458
            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
   459
        else:
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   460
            parentrevs = cl.parentrevs
2209
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   461
            parents = self._parents
2217
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   462
            bheads = set(bottomrevs)
2131
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   463
            du = bheads.difference_update
2216
de76219b42b8 merge-slicing: use reachable roots to filter the various branches
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2215
diff changeset
   464
            reachableroots = repo.changelog.reachableroots
2222
6b19998242ed stablerange: fix merge slicing when range has multiple roots
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2221
diff changeset
   465
            minrev = min(bottomrevs)
2190
f4cc3cf27a3a revsfromrange: remove reference to '_revs' in merge slicing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2189
diff changeset
   466
            for r in bottomrevs:
2209
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   467
                du(parents(r, parentrevs))
2131
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   468
            for h in bheads:
2216
de76219b42b8 merge-slicing: use reachable roots to filter the various branches
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2215
diff changeset
   469
                # reachable roots is fast because is C
de76219b42b8 merge-slicing: use reachable roots to filter the various branches
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2215
diff changeset
   470
                #
de76219b42b8 merge-slicing: use reachable roots to filter the various branches
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2215
diff changeset
   471
                # It is worth noting that will use this kind of filtering from
de76219b42b8 merge-slicing: use reachable roots to filter the various branches
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2215
diff changeset
   472
                # "h" multiple time in a warming run. So using "ancestors" and
de76219b42b8 merge-slicing: use reachable roots to filter the various branches
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2215
diff changeset
   473
                # caching that should be faster. But python code filtering on
de76219b42b8 merge-slicing: use reachable roots to filter the various branches
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2215
diff changeset
   474
                # the ancestors end up being slower.
2222
6b19998242ed stablerange: fix merge slicing when range has multiple roots
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2221
diff changeset
   475
                hrevs = reachableroots(minrev, [h], bottomrevs, True)
2194
8e7b2918e1a3 stablerange: directly use 'self' when possible
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2193
diff changeset
   476
                start = self.depthrev(repo, h) - len(hrevs)
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
   477
                entry = (h, start)
2131
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   478
                result.append(entry)
2217
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   479
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   480
            # Talking about python code being slow, the following code is an
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   481
            # alternative implementation.
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   482
            #
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   483
            # It complexity is better since is does a single traversal on the
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   484
            # bottomset. However since it is all python it end up being
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   485
            # slower.
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   486
            # I'm keeping it here as an inspiration for a future C version
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   487
            # branches = []
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   488
            # for current in reversed(bottomrevs):
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   489
            #     ps = parents(current, parentrevs)
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   490
            #     found = False
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   491
            #     for brevs, bexpect in branches:
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   492
            #         if current in bexpect:
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   493
            #             found = True
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   494
            #             brevs.append(current)
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   495
            #             bexpect.discard(current)
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   496
            #             bexpect.update(ps)
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   497
            #     if not found:
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   498
            #         branches.append(([current], set(ps)))
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   499
            # for revs, __ in reversed(branches):
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   500
            #     head = revs[0]
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   501
            #     index = self.depthrev(repo, head) - len(revs)
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   502
            #     result.append((head, index))
37fa3d83f294 merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2216
diff changeset
   503
2215
6d9cadc635d5 merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2214
diff changeset
   504
        # 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
   505
        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
   506
        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
   507
        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
   508
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   509
#############################
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   510
### simple sqlite caching ###
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   511
#############################
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   512
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   513
_sqliteschema = [
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   514
    """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
   515
                         tiprev        INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   516
                         tipnode       BLOB    NOT NULL
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   517
                        );""",
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   518
    """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
   519
                          idx INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   520
                          PRIMARY KEY(rev, idx));""",
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   521
    """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
   522
                              suprev  INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   523
                              supidx  INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   524
                              subrev  INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   525
                              subidx  INTEGER NOT NULL,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   526
                              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
   527
                              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
   528
                              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
   529
    );""",
2240
ecb993892c61 stablerange: warm cache before using it server side
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2238
diff changeset
   530
    "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
   531
    "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
   532
]
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   533
_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
   534
_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
   535
_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
   536
_updatesubranges = """INSERT
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   537
                       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
   538
                       VALUES (?,?,?,?,?);"""
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   539
_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
   540
_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
   541
_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
   542
_querysubranges = """SELECT subrev, subidx
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   543
                     FROM subranges
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   544
                     WHERE (suprev = ? AND supidx = ?)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   545
                     ORDER BY listidx;"""
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   546
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   547
class sqlstablerange(stablerange):
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   548
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   549
    _schemaversion = 1
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   550
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   551
    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
   552
        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
   553
                                    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
   554
        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
   555
        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
   556
        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
   557
        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
   558
        self._ondisktiprev = None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   559
        self._ondisktipnode = None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   560
        self._unsavedsubranges = {}
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   561
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   562
    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
   563
        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
   564
        try:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   565
            # 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
   566
            # 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
   567
            # 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
   568
            #
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   569
            # 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
   570
            # before locking
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   571
            with repo.lock():
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   572
                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
   573
                self._save(repo)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   574
        except error.LockError:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   575
            # 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
   576
            # 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
   577
            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
   578
            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
   579
            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
   580
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   581
    def _getsub(self, rangeid):
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   582
        cache = self._subrangescache
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   583
        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
   584
            value = None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   585
            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
   586
            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
   587
                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
   588
            # 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
   589
            cache[rangeid] = value
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   590
        return cache.get(rangeid)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   591
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   592
    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
   593
        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
   594
        self._unsavedsubranges[rangeid] = value
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   595
        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
   596
2400
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   597
    def _db(self):
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   598
        try:
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   599
            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
   600
        except OSError:
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   601
            return None
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   602
        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
   603
        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
   604
        return con
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   605
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   606
    @util.propertycache
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   607
    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
   608
        con = self._db()
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   609
        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
   610
            return None
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   611
        cur = con.execute(_queryexist)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   612
        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
   613
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   614
        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
   615
        if meta is None:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   616
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   617
        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
   618
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   619
        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
   620
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   621
        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
   622
            return None
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   623
        self._ondisktiprev = meta[1]
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   624
        self._ondisktipnode = meta[2]
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   625
        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
   626
            self._tiprev = self._ondisktiprev
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   627
            self._tipnode = self._ondisktipnode
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   628
        return con
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   629
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   630
    def _save(self, repo):
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   631
        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
   632
        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
   633
        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
   634
            return # no new data
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   635
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   636
        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
   637
            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
   638
            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
   639
                del self._con
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   640
2400
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   641
            con = self._db()
9a53ed7e5540 stablerangecache: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2381
diff changeset
   642
            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
   643
                return
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   644
            with con:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   645
                for req in _sqliteschema:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   646
                    con.execute(req)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   647
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   648
                meta = [self._schemaversion,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   649
                        self._tiprev,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   650
                        self._tipnode,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   651
                ]
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   652
                con.execute(_newmeta, meta)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   653
        else:
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   654
            con = self._con
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   655
            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
   656
            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
   657
                # 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
   658
                # 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
   659
                # 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
   660
                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
   661
                        '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
   662
                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
   663
                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
   664
                repo.ui.warn(msg)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   665
                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
   666
                return
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   667
            meta = [self._tiprev,
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   668
                    self._tipnode,
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
            con.execute(_updatemeta, meta)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   671
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   672
        self._saverange(con, repo)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   673
        con.commit()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   674
        self._ondisktiprev = self._tiprev
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   675
        self._ondisktipnode = self._tipnode
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   676
        self._unsavedsubranges.clear()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   677
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   678
    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
   679
        repo = repo.unfiltered()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   680
        data = []
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   681
        allranges = set()
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   682
        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
   683
            allranges.add(key)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   684
            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
   685
                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
   686
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   687
        con.executemany(_updaterange, allranges)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   688
        con.executemany(_updatesubranges, data)
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   689
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   690
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   691
@eh.reposetup
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   692
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
   693
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   694
    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
   695
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   696
        @localrepo.unfilteredpropertycache
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   697
        def stablerange(self):
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   698
            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
   699
2236
c0e2ba85e76a stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2235
diff changeset
   700
        @localrepo.unfilteredmethod
c0e2ba85e76a stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2235
diff changeset
   701
        def destroyed(self):
c0e2ba85e76a stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2235
diff changeset
   702
            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
   703
                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
   704
            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
   705
2238
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
   706
        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
   707
            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
   708
            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
   709
                return tr
2506
747dc7067751 stablerange: also respect the 'warm-cache' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2505
diff changeset
   710
            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
   711
                                      True):
747dc7067751 stablerange: also respect the 'warm-cache' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2505
diff changeset
   712
                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
   713
            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
   714
            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
   715
                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
   716
            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
   717
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
   718
            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
   719
                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
   720
                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
   721
                    return
aac765e84de3 stablerange: warm cache on transaction (if obshashrange is enabled)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2237
diff changeset
   722
                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
   723
                    # 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
   724
                    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
   725
2368
b73e1f879646 cache: ensure we warm stablerange cache before the obshashrange cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   726
            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
   727
            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
   728
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   729
    repo.__class__ = stablerangerepo