hgext3rd/evolve/obsdiscovery.py
author Anton Shestakov <av6@dwimlabs.net>
Fri, 08 May 2020 22:50:09 +0800
branchmercurial-4.6
changeset 5368 844b1ad5b34b
parent 5332 2570d2d4a268
permissions -rw-r--r--
test-compat: merge mercurial-4.7 into mercurial-4.6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     1
# Code dedicated to the discovery of obsolescence marker "over the wire"
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     2
#
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     3
# Copyright 2017 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     4
#
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     7
2124
6665aad2d41b obsdiscovery: document the status of the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2098
diff changeset
     8
# Status: Experiment in progress // open question
6665aad2d41b obsdiscovery: document the status of the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2098
diff changeset
     9
#
6665aad2d41b obsdiscovery: document the status of the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2098
diff changeset
    10
#   The final discovery algorithm and protocol will go into core when we'll be
6665aad2d41b obsdiscovery: document the status of the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2098
diff changeset
    11
#   happy with it.
6665aad2d41b obsdiscovery: document the status of the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2098
diff changeset
    12
#
6665aad2d41b obsdiscovery: document the status of the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2098
diff changeset
    13
#   Some of the code in this module is for compatiblity with older version
6665aad2d41b obsdiscovery: document the status of the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2098
diff changeset
    14
#   of evolve and will be eventually dropped.
6665aad2d41b obsdiscovery: document the status of the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2098
diff changeset
    15
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    16
from __future__ import absolute_import
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    17
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
    18
import hashlib
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    19
import heapq
5332
2570d2d4a268 caches: preserve permissions of top-level .hg
Joerg Sonnenberger <joerg@bec.de>
parents: 5212
diff changeset
    20
import os
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
    21
import sqlite3
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    22
import struct
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
    23
import weakref
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
    24
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    25
from mercurial import (
4735
168c270e8347 py3: sqlite3.connect() expects str arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 4716
diff changeset
    26
    encoding,
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    27
    error,
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    28
    exchange,
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
    29
    extensions,
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    30
    localrepo,
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    31
    node,
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    32
    obsolete,
2081
010a8af416a0 discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2076
diff changeset
    33
    scmutil,
5332
2570d2d4a268 caches: preserve permissions of top-level .hg
Joerg Sonnenberger <joerg@bec.de>
parents: 5212
diff changeset
    34
    store,
2082
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
    35
    util,
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    36
)
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    37
from mercurial.i18n import _
5077
39029a6d33d4 obsdiscovery: compatibility when importing forcebytestr()
Anton Shestakov <av6@dwimlabs.net>
parents: 4999
diff changeset
    38
5176
b9af7b8f3eee compat: drop import compatibility <= 4.5 for `forcebytestr`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5077
diff changeset
    39
from mercurial.utils.stringutil import forcebytestr
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    40
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    41
from . import (
3524
6d4095e6bdd3 obsdiscovery: add compatibility layer to register wireproto command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3521
diff changeset
    42
    compat,
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    43
    exthelper,
2360
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
    44
    obscache,
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    45
    utility,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2124
diff changeset
    46
    stablerange,
3307
a1ab2588a628 stablerange: split pure algorithm part from the on disk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
    47
    stablerangecache,
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    48
)
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    49
5180
515d425c0a05 compat: drop 4.5 related compatibility around wireprotocol module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5176
diff changeset
    50
from mercurial import wireprototypes, wireprotov1server
515d425c0a05 compat: drop 4.5 related compatibility around wireprotocol module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5176
diff changeset
    51
from mercurial.wireprotov1peer import wirepeer
515d425c0a05 compat: drop 4.5 related compatibility around wireprotocol module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5176
diff changeset
    52
from mercurial.wireprototypes import encodelist, decodelist
3669
0407965ae79e compat: deal with change in the wireproto module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3524
diff changeset
    53
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    54
_pack = struct.pack
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    55
_unpack = struct.unpack
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
    56
_calcsize = struct.calcsize
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    57
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    58
eh = exthelper.exthelper()
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    59
obsexcmsg = utility.obsexcmsg
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    60
3080
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 2551
diff changeset
    61
# Config
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
    62
eh.configitem(b'experimental', b'evolution.obsdiscovery', True)
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
    63
eh.configitem(b'experimental', b'obshashrange', True)
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
    64
eh.configitem(b'experimental', b'obshashrange.warm-cache', b'auto')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
    65
eh.configitem(b'experimental', b'obshashrange.max-revs', None)
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
    66
eh.configitem(b'experimental', b'obshashrange.lru-size', 2000)
3080
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 2551
diff changeset
    67
2076
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    68
##################################
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    69
###  Code performing discovery ###
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    70
##################################
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    71
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    72
def findmissingrange(ui, local, remote, probeset,
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    73
                     initialsamplesize=100,
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    74
                     fullsamplesize=200):
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    75
    missing = set()
3685
bf000d1a525f timer: drop compat layer for time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3681
diff changeset
    76
    starttime = util.timer()
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    77
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
    78
    heads = local.revs(b'heads(%ld)', probeset)
2239
f4f6ff874c40 stablerange: warm cache before using it in findrangemissing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2233
diff changeset
    79
    local.stablerange.warmup(local)
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    80
2164
cc8ae2a66b0f stablerange: use rangelength in findmissingrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2158
diff changeset
    81
    rangelength = local.stablerange.rangelength
2174
71c518470e2c stablerange: use subranges from the main class in findrangemissing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2171
diff changeset
    82
    subranges = local.stablerange.subranges
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    83
    # size of slice ?
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    84
    heappop = heapq.heappop
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    85
    heappush = heapq.heappush
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    86
    heapify = heapq.heapify
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    87
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    88
    tested = set()
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    89
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    90
    sample = []
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    91
    samplesize = initialsamplesize
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    92
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    93
    def addentry(entry):
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    94
        if entry in tested:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    95
            return False
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    96
        sample.append(entry)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    97
        tested.add(entry)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    98
        return True
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    99
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   100
    for h in heads:
2196
2ecc88baabf9 stablerange: directly use tuple to refer to a stable range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2195
diff changeset
   101
        entry = (h, 0)
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   102
        addentry(entry)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   103
2365
4b8b7fd135eb obshashrange: warm cache outside of loops
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2364
diff changeset
   104
    local.obsstore.rangeobshashcache.update(local)
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   105
    querycount = 0
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   106
    compat.progress(ui, _(b"comparing obsmarker with other"), querycount,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   107
                    unit=_(b"queries"))
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   108
    overflow = []
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   109
    while sample or overflow:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   110
        if overflow:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   111
            sample.extend(overflow)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   112
            overflow = []
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   113
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   114
        if samplesize < len(sample):
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   115
            # too much sample already
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   116
            overflow = sample[samplesize:]
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   117
            sample = sample[:samplesize]
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   118
        elif len(sample) < samplesize:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   119
            ui.debug(b"query %i; add more sample (target %i, current %i)\n"
2242
128923ff68c8 obshashrange: improve message issued during discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2241
diff changeset
   120
                     % (querycount, samplesize, len(sample)))
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   121
            # we need more sample !
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   122
            needed = samplesize - len(sample)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   123
            sliceme = []
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   124
            heapify(sliceme)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   125
            for entry in sample:
2164
cc8ae2a66b0f stablerange: use rangelength in findmissingrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2158
diff changeset
   126
                if 1 < rangelength(local, entry):
cc8ae2a66b0f stablerange: use rangelength in findmissingrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2158
diff changeset
   127
                    heappush(sliceme, (-rangelength(local, entry), entry))
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   128
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   129
            while sliceme and 0 < needed:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   130
                _key, target = heappop(sliceme)
2174
71c518470e2c stablerange: use subranges from the main class in findrangemissing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2171
diff changeset
   131
                for new in subranges(local, target):
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   132
                    # XXX we could record hierarchy to optimise drop
2203
8a2e1f6e5443 findmissingrange: properly queue new subrange for slicing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2202
diff changeset
   133
                    if addentry(new):
8a2e1f6e5443 findmissingrange: properly queue new subrange for slicing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2202
diff changeset
   134
                        if 1 < len(new):
8a2e1f6e5443 findmissingrange: properly queue new subrange for slicing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2202
diff changeset
   135
                            heappush(sliceme, (-rangelength(local, new), new))
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   136
                        needed -= 1
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   137
                        if needed <= 0:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   138
                            break
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   139
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   140
        # no longer the first interation
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   141
        samplesize = fullsamplesize
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   142
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   143
        nbsample = len(sample)
2164
cc8ae2a66b0f stablerange: use rangelength in findmissingrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2158
diff changeset
   144
        maxsize = max([rangelength(local, r) for r in sample])
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   145
        ui.debug(b"query %i; sample size is %i, largest range %i\n"
2202
5f8a2604bb2b findmissingrange: fix reversed value in debug output
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2196
diff changeset
   146
                 % (querycount, nbsample, maxsize))
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   147
        nbreplies = 0
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   148
        replies = list(_queryrange(ui, local, remote, sample))
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   149
        sample = []
2144
2200f67e1628 stablerange: stop using '.node' in findmissingrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2143
diff changeset
   150
        n = local.changelog.node
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   151
        for entry, remotehash in replies:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   152
            nbreplies += 1
2139
f80fa478e289 obshashrange: use a small utility function to access the obshash
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2138
diff changeset
   153
            if remotehash == _obshashrange(local, entry):
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   154
                continue
2164
cc8ae2a66b0f stablerange: use rangelength in findmissingrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2158
diff changeset
   155
            elif 1 == rangelength(local, entry):
2144
2200f67e1628 stablerange: stop using '.node' in findmissingrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2143
diff changeset
   156
                missing.add(n(entry[0]))
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   157
            else:
2174
71c518470e2c stablerange: use subranges from the main class in findrangemissing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2171
diff changeset
   158
                for new in subranges(local, entry):
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   159
                    addentry(new)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   160
        assert nbsample == nbreplies
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   161
        querycount += 1
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   162
        compat.progress(ui, _(b"comparing obsmarker with other"), querycount,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   163
                        unit=_(b"queries"))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   164
    compat.progress(ui, _(b"comparing obsmarker with other"), None)
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   165
    local.obsstore.rangeobshashcache.save(local)
3685
bf000d1a525f timer: drop compat layer for time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3681
diff changeset
   166
    duration = util.timer() - starttime
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   167
    logmsg = (b'obsdiscovery, %d/%d mismatch'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   168
              b' - %d obshashrange queries in %.4f seconds\n')
2408
0af6bb0bfdc3 discovery: log information about obshashrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2399
diff changeset
   169
    logmsg %= (len(missing), len(probeset), querycount, duration)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   170
    ui.log(b'evoext-obsdiscovery', logmsg)
2409
2b563a725cdc obsdiscovery: add more debug output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2408
diff changeset
   171
    ui.debug(logmsg)
2085
6d61c5ed3bfa obsdiscovery: simply some of the missing computation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2084
diff changeset
   172
    return sorted(missing)
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   173
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   174
def _queryrange(ui, repo, remote, allentries):
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   175
    #  question are asked with node
2146
4df68eb96adf stablerange: stop using '.node' in _queryrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2145
diff changeset
   176
    n = repo.changelog.node
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   177
    noderanges = [(n(entry[0]), entry[1]) for entry in allentries]
3346
f4e28b781143 stablerange: use mergepoint based algorithm for the official stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   178
    replies = remote.evoext_obshashrange_v1(noderanges)
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   179
    result = []
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   180
    for idx, entry in enumerate(allentries):
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   181
        result.append((entry, replies[idx]))
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   182
    return result
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   183
2082
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   184
##############################
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   185
### Range Hash computation ###
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   186
##############################
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   187
2082
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   188
@eh.command(
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4644
diff changeset
   189
    b'debugobshashrange',
2082
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   190
    [
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4644
diff changeset
   191
        (b'', b'rev', [], b'display obshash for all (rev, 0) range in REVS'),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4644
diff changeset
   192
        (b'', b'subranges', False, b'display all subranges'),
2082
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   193
    ],
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4644
diff changeset
   194
    _(b''))
2229
575561934439 debug: rename 'debugstablerange' to 'debugobshashrange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2228
diff changeset
   195
def debugobshashrange(ui, repo, **opts):
2082
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   196
    """display the ::REVS set topologically sorted in a stable way
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   197
    """
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   198
    s = node.short
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   199
    revs = scmutil.revrange(repo, opts['rev'])
2087
0c2371542687 depth: update depth to code to reuse ancestors depth
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2086
diff changeset
   200
    # prewarm depth cache
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   201
    if revs:
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   202
        repo.stablerange.warmup(repo, max(revs))
2145
4c0c88e51018 stablerange: stop using '.node' in debugstablerange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2144
diff changeset
   203
    cl = repo.changelog
2165
e97e9b0c9711 stablerange: use rangelength in debugstablerange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2164
diff changeset
   204
    rangelength = repo.stablerange.rangelength
2171
3be48332b802 stablerange: use depthrevs in debugstablerange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2166
diff changeset
   205
    depthrev = repo.stablerange.depthrev
2230
a202f3af890c debugobshashrange: add a --subranges option
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2229
diff changeset
   206
    if opts['subranges']:
3248
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3247
diff changeset
   207
        ranges = stablerange.subrangesclosure(repo, repo.stablerange, revs)
2230
a202f3af890c debugobshashrange: add a --subranges option
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2229
diff changeset
   208
    else:
a202f3af890c debugobshashrange: add a --subranges option
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2229
diff changeset
   209
        ranges = [(r, 0) for r in revs]
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   210
    headers = (b'rev', b'node', b'index', b'size', b'depth', b'obshash')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   211
    linetemplate = b'%12d %12s %12d %12d %12d %12s\n'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   212
    headertemplate = linetemplate.replace(b'd', b's')
2228
3b18440cca74 debugstablerange: improve output spacing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2203
diff changeset
   213
    ui.status(headertemplate % headers)
2365
4b8b7fd135eb obshashrange: warm cache outside of loops
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2364
diff changeset
   214
    repo.obsstore.rangeobshashcache.update(repo)
2082
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   215
    for r in ranges:
2150
0a95e8518941 stablerange: stop using '.head' in debugstablerange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2146
diff changeset
   216
        d = (r[0],
2145
4c0c88e51018 stablerange: stop using '.node' in debugstablerange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2144
diff changeset
   217
             s(cl.node(r[0])),
2157
e3b75a5d6b38 stablerange: stop using '.index' in debugstablerange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2150
diff changeset
   218
             r[1],
2165
e97e9b0c9711 stablerange: use rangelength in debugstablerange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2164
diff changeset
   219
             rangelength(repo, r),
2171
3be48332b802 stablerange: use depthrevs in debugstablerange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2166
diff changeset
   220
             depthrev(repo, r[0]),
2139
f80fa478e289 obshashrange: use a small utility function to access the obshash
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2138
diff changeset
   221
             node.short(_obshashrange(repo, r)))
2228
3b18440cca74 debugstablerange: improve output spacing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2203
diff changeset
   222
        ui.status(linetemplate % d)
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   223
    repo.obsstore.rangeobshashcache.save(repo)
2082
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   224
2139
f80fa478e289 obshashrange: use a small utility function to access the obshash
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2138
diff changeset
   225
def _obshashrange(repo, rangeid):
f80fa478e289 obshashrange: use a small utility function to access the obshash
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2138
diff changeset
   226
    """return the obsolete hash associated to a range"""
2140
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   227
    cache = repo.obsstore.rangeobshashcache
2143
99cf2784e2a6 stablerange: stop using '.node' in obshashrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2140
diff changeset
   228
    cl = repo.changelog
2140
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   229
    obshash = cache.get(rangeid)
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   230
    if obshash is not None:
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   231
        return obshash
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   232
    pieces = []
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   233
    nullid = node.nullid
2166
d4ff8708eb66 stablerange: use rangelength in _obshashrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2165
diff changeset
   234
    if repo.stablerange.rangelength(repo, rangeid) == 1:
2143
99cf2784e2a6 stablerange: stop using '.node' in obshashrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2140
diff changeset
   235
        rangenode = cl.node(rangeid[0])
99cf2784e2a6 stablerange: stop using '.node' in obshashrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2140
diff changeset
   236
        tmarkers = repo.obsstore.relevantmarkers([rangenode])
2140
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   237
        pieces = []
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   238
        for m in tmarkers:
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   239
            mbin = obsolete._fm1encodeonemarker(m)
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   240
            pieces.append(mbin)
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   241
        pieces.sort()
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   242
    else:
2175
4162dbe7ff5c stablerange: use subranges from the main class in _obshashrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2174
diff changeset
   243
        for subrange in repo.stablerange.subranges(repo, rangeid):
2140
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   244
            obshash = _obshashrange(repo, subrange)
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   245
            if obshash != nullid:
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   246
                pieces.append(obshash)
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   247
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   248
    sha = hashlib.sha1()
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   249
    # note: if there is only one subrange with actual data, we'll just
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   250
    # reuse the same hash.
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   251
    if not pieces:
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   252
        obshash = node.nullid
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   253
    elif len(pieces) != 1 or obshash is None:
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   254
        sha = hashlib.sha1()
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   255
        for p in pieces:
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   256
            sha.update(p)
2195
bd3d35047181 obshash: properly cache obshash value
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2175
diff changeset
   257
        obshash = sha.digest()
bd3d35047181 obshash: properly cache obshash value
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2175
diff changeset
   258
    cache[rangeid] = obshash
2140
90f8f100dd58 obshashrange: extract computation back into the discovery module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2139
diff changeset
   259
    return obshash
2139
f80fa478e289 obshashrange: use a small utility function to access the obshash
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2138
diff changeset
   260
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   261
### sqlite caching
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   262
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   263
_sqliteschema = [
4802
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4755
diff changeset
   264
    r"""CREATE TABLE obshashrange(rev     INTEGER NOT NULL,
4022
082b59126099 sqlcache: initialize meta table last
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4021
diff changeset
   265
                                 idx     INTEGER NOT NULL,
082b59126099 sqlcache: initialize meta table last
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4021
diff changeset
   266
                                 obshash BLOB    NOT NULL,
082b59126099 sqlcache: initialize meta table last
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4021
diff changeset
   267
                                 PRIMARY KEY(rev, idx));""",
4802
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4755
diff changeset
   268
    r"CREATE INDEX range_index ON obshashrange(rev, idx);",
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4755
diff changeset
   269
    r"""CREATE TABLE meta(schemaversion INTEGER NOT NULL,
2360
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   270
                         tiprev        INTEGER NOT NULL,
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   271
                         tipnode       BLOB    NOT NULL,
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   272
                         nbobsmarker   INTEGER NOT NULL,
2360
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   273
                         obssize       BLOB    NOT NULL,
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   274
                         obskey        BLOB    NOT NULL
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   275
                        );""",
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   276
]
4802
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4755
diff changeset
   277
_queryexist = r"SELECT name FROM sqlite_master WHERE type='table' AND name='meta';"
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4755
diff changeset
   278
_clearmeta = r"""DELETE FROM meta;"""
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4755
diff changeset
   279
_newmeta = r"""INSERT INTO meta (schemaversion, tiprev, tipnode, nbobsmarker, obssize, obskey)
2390
caddf846ca1e obshashrange: drop spurious whitespace
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2389
diff changeset
   280
            VALUES (?,?,?,?,?,?);"""
4802
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4755
diff changeset
   281
_updateobshash = r"INSERT INTO obshashrange(rev, idx, obshash) VALUES (?,?,?);"
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4755
diff changeset
   282
_querymeta = r"SELECT schemaversion, tiprev, tipnode, nbobsmarker, obssize, obskey FROM meta;"
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4755
diff changeset
   283
_queryobshash = r"SELECT obshash FROM obshashrange WHERE (rev = ? AND idx = ?);"
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4755
diff changeset
   284
_query_max_stored = r"SELECT MAX(rev) FROM obshashrange"
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   285
4802
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4755
diff changeset
   286
_reset = r"DELETE FROM obshashrange;"
dc403312a012 python3: mark all SQL queries as raw strings
Raphaël Gomès <rgomes@octobus.net>
parents: 4755
diff changeset
   287
_delete = r"DELETE FROM obshashrange WHERE (rev = ? AND idx = ?);"
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   288
3958
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   289
def _affectedby(repo, markers):
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   290
    """return all nodes whose relevant set is affected by this changeset
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   291
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   292
    This is a reversed version of obsstore.relevantmarkers
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   293
    """
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   294
    affected_nodes = set()
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   295
    known_markers = set(markers)
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   296
    node_to_proceed = set()
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   297
    marker_to_proceed = set(known_markers)
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   298
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   299
    obsstore = repo.obsstore
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   300
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   301
    while node_to_proceed or marker_to_proceed:
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   302
        while marker_to_proceed:
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   303
            m = marker_to_proceed.pop()
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   304
            # check successors and parent
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   305
            if m[1]:
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   306
                relevant = (m[1], )
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   307
            else: # prune case
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   308
                relevant = ((m[0], ), m[5])
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   309
            for l in relevant:
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   310
                if l is None:
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   311
                    continue
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   312
                for n in l:
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   313
                    if n not in affected_nodes:
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   314
                        node_to_proceed.add(n)
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   315
                    affected_nodes.add(n)
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   316
        # marker_to_proceed is now empty:
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   317
        if node_to_proceed:
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   318
            n = node_to_proceed.pop()
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   319
            markers = set()
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   320
            markers.update(obsstore.successors.get(n, ()))
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   321
            markers.update(obsstore.predecessors.get(n, ()))
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   322
            markers -= known_markers
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   323
            marker_to_proceed.update(markers)
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   324
            known_markers.update(markers)
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   325
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   326
    return affected_nodes
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   327
4096
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   328
# if there is that many new obsmarkers, reset without analysing them
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   329
RESET_ABOVE = 10000
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   330
2373
2a1aad0fd8bf obshashrange: stop inheriting from 'dict'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2371
diff changeset
   331
class _obshashcache(obscache.dualsourcecache):
2360
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   332
4034
215235c734e7 obshashrange: force obshashrange invalidation by bumping schema
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4027
diff changeset
   333
    _schemaversion = 3
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   334
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   335
    _cachename = b'evo-ext-obshashrange' # used for error message
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   336
    _filename = b'evoext_obshashrange_v2.sqlite'
2376
12386f7f5056 dualsourcecache: add a cache name
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2374
diff changeset
   337
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   338
    def __init__(self, repo):
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   339
        super(_obshashcache, self).__init__()
2399
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   340
        self._vfs = repo.vfs
4487
d972041022cb evolve: when using evolve, cache files belong into the master repo
Joerg Sonnenberger <joerg@bec.de>
parents: 4458
diff changeset
   341
        self._path = repo.cachevfs.join(self._filename)
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   342
        self._new = set()
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   343
        self._valid = True
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   344
        self._repo = weakref.ref(repo.unfiltered())
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   345
        # cache status
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   346
        self._ondiskcachekey = None
2373
2a1aad0fd8bf obshashrange: stop inheriting from 'dict'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2371
diff changeset
   347
        self._data = {}
5332
2570d2d4a268 caches: preserve permissions of top-level .hg
Joerg Sonnenberger <joerg@bec.de>
parents: 5212
diff changeset
   348
        self._createmode = store._calcmode(self._vfs)
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   349
2360
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   350
    def clear(self, reset=False):
2362
22c35d07ddb3 obshashrange: properly drop the current connection on clear
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2361
diff changeset
   351
        super(_obshashcache, self).clear(reset=reset)
2373
2a1aad0fd8bf obshashrange: stop inheriting from 'dict'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2371
diff changeset
   352
        self._data.clear()
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   353
        self._new.clear()
2394
1b3a797c4586 obshashrange: cleanup 'valid' life cycle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2393
diff changeset
   354
        if reset:
1b3a797c4586 obshashrange: cleanup 'valid' life cycle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2393
diff changeset
   355
            self._valid = False
4804
079dbf36e884 python3: add raw prefix in cases harder to analyze at the token level
Raphaël Gomès <rgomes@octobus.net>
parents: 4802
diff changeset
   356
        if r'_con' in vars(self):
2362
22c35d07ddb3 obshashrange: properly drop the current connection on clear
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2361
diff changeset
   357
            del self._con
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   358
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   359
    def get(self, rangeid):
2393
2a194fe1a557 obsrangecache: raise programming error when using an unwarmed cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2392
diff changeset
   360
        # revision should be covered by the tiprev
2366
2241433a77e5 obshashrange: warm the cache at the end of each transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2365
diff changeset
   361
        #
2241433a77e5 obshashrange: warm the cache at the end of each transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2365
diff changeset
   362
        # XXX there are issue with cache warming, we hack around it for now
2241433a77e5 obshashrange: warm the cache at the end of each transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2365
diff changeset
   363
        if not getattr(self, '_updating', False):
2393
2a194fe1a557 obsrangecache: raise programming error when using an unwarmed cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2392
diff changeset
   364
            if self._cachekey[0] < rangeid[0]:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   365
                msg = (b'using unwarmed obshashrangecache (%s %s)'
2393
2a194fe1a557 obsrangecache: raise programming error when using an unwarmed cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2392
diff changeset
   366
                       % (rangeid[0], self._cachekey[0]))
2a194fe1a557 obsrangecache: raise programming error when using an unwarmed cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2392
diff changeset
   367
                raise error.ProgrammingError(msg)
2360
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   368
2373
2a1aad0fd8bf obshashrange: stop inheriting from 'dict'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2371
diff changeset
   369
        value = self._data.get(rangeid)
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   370
        if value is None and self._con is not None:
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   371
            nrange = (rangeid[0], rangeid[1])
4024
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   372
            try:
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   373
                obshash = self._con.execute(_queryobshash, nrange).fetchone()
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   374
                if obshash is not None:
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   375
                    value = obshash[0]
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   376
                self._data[rangeid] = value
4027
130a60a51fff sqlcache: also catch malformed database error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4025
diff changeset
   377
            except (sqlite3.DatabaseError, sqlite3.OperationalError):
4024
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   378
                # something is wrong with the sqlite db
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   379
                # Since this is a cache, we ignore it.
4804
079dbf36e884 python3: add raw prefix in cases harder to analyze at the token level
Raphaël Gomès <rgomes@octobus.net>
parents: 4802
diff changeset
   380
                if r'_con' in vars(self):
4024
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   381
                    del self._con
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   382
                self._new.clear()
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   383
        return value
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   384
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   385
    def __setitem__(self, rangeid, obshash):
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   386
        self._new.add(rangeid)
2373
2a1aad0fd8bf obshashrange: stop inheriting from 'dict'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2371
diff changeset
   387
        self._data[rangeid] = obshash
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   388
2360
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   389
    def _updatefrom(self, repo, revs, obsmarkers):
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   390
        """override this method to update your cache data incrementally
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   391
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   392
        revs:      list of new revision in the changelog
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   393
        obsmarker: list of new obsmarkers in the obsstore
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   394
        """
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   395
        # XXX for now, we'll not actually update the cache, but we'll be
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   396
        # smarter at invalidating it.
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   397
        #
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   398
        # 1) new revisions does not get their entry updated (not update)
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   399
        # 2) if we detect markers affecting non-new revision we reset the cache
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   400
2366
2241433a77e5 obshashrange: warm the cache at the end of each transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2365
diff changeset
   401
        self._updating = True
2241433a77e5 obshashrange: warm the cache at the end of each transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2365
diff changeset
   402
3958
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   403
        con = self._con
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   404
        if con is not None:
4096
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   405
            reset = False
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   406
            affected = []
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   407
            if RESET_ABOVE < len(obsmarkers):
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   408
                # lots of new obsmarkers, probably smarter to reset the cache
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   409
                repo.ui.log(b'evoext-cache', b'obshashcache reset - '
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   410
                            b'many new markers (%d)\n'
4096
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   411
                            % len(obsmarkers))
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   412
                reset = True
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   413
            elif obsmarkers:
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   414
                max_stored = con.execute(_query_max_stored).fetchall()[0][0]
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   415
                affected_nodes = _affectedby(repo, obsmarkers)
3958
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   416
4929
bb2b4f6c99dc compat: compatibility for cl.nodemap.get vs cl.index.get_rev
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
   417
                getrev = compat.getgetrev(repo.changelog)
bb2b4f6c99dc compat: compatibility for cl.nodemap.get vs cl.index.get_rev
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
   418
                affected = [getrev(n) for n in affected_nodes]
4096
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   419
                affected = [r for r in affected
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   420
                            if r is not None and r <= max_stored]
2412
8df32538f662 obshashrangecache: precisely track affected revs when adding new markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2409
diff changeset
   421
4096
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   422
            if RESET_ABOVE < len(affected):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   423
                repo.ui.log(b'evoext-cache', b'obshashcache reset - '
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   424
                            b'new markers affect many changeset (%d)\n'
3958
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   425
                            % len(affected))
4096
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   426
                reset = True
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   427
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   428
            if affected or reset:
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   429
                if not reset:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   430
                    repo.ui.log(b'evoext-cache', b'obshashcache clean - '
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   431
                                b'new markers affect %d changeset and cached ranges\n'
4096
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   432
                                % len(affected))
3958
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   433
                if con is not None:
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   434
                    # always reset for now, the code detecting affect is buggy
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   435
                    # so we need to reset more broadly than we would like.
4024
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   436
                    try:
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   437
                        if repo.stablerange._con is None:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   438
                            repo.ui.log(b'evoext-cache', b'obshashcache reset - '
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   439
                                        b'underlying stablerange cache unavailable\n')
4096
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   440
                            reset = True
1630756a6a46 obshashrange: force reset if many changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4056
diff changeset
   441
                        if reset:
4024
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   442
                            con.execute(_reset)
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   443
                            self._data.clear()
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   444
                        else:
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   445
                            ranges = repo.stablerange.contains(repo, affected)
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   446
                            con.executemany(_delete, ranges)
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   447
                            for r in ranges:
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   448
                                self._data.pop(r, None)
4027
130a60a51fff sqlcache: also catch malformed database error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4025
diff changeset
   449
                    except (sqlite3.DatabaseError, sqlite3.OperationalError) as exc:
4999
a9457b9aca4e py3: fix several TypeError formatting bytes with an exception object
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 4929
diff changeset
   450
                        repo.ui.log(b'evoext-cache',
a9457b9aca4e py3: fix several TypeError formatting bytes with an exception object
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 4929
diff changeset
   451
                                    b'error while updating obshashrange cache: %s'
5077
39029a6d33d4 obsdiscovery: compatibility when importing forcebytestr()
Anton Shestakov <av6@dwimlabs.net>
parents: 4999
diff changeset
   452
                                    % forcebytestr(exc))
4024
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   453
                        del self._updating
210f8abdfcd7 sqlcache: protect read query too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4023
diff changeset
   454
                        return
3955
0174737af4fc obshashrange: do not search for affected ranges above the highest we have
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3954
diff changeset
   455
3958
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   456
                # rewarm key revisions
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   457
                #
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   458
                # (The current invalidation is too wide, but rewarming every
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   459
                # single revision is quite costly)
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   460
                newrevs = []
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   461
                stop = self._cachekey[0] # tiprev
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   462
                for h in repo.filtered(b'immutable').changelog.headrevs():
3958
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   463
                    if h <= stop and h in affected:
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   464
                        newrevs.append(h)
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   465
                newrevs.extend(revs)
926c8e2f5400 obshashrange: fix computation of affected ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3956
diff changeset
   466
                revs = newrevs
2366
2241433a77e5 obshashrange: warm the cache at the end of each transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2365
diff changeset
   467
3247
d8e6c5338053 deptcache: make sure we warm the dept cache before warming the obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3171
diff changeset
   468
        repo.depthcache.update(repo)
3357
6020f2c9dbd9 obshashrange: add a progressbar to upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3355
diff changeset
   469
        total = len(revs)
6020f2c9dbd9 obshashrange: add a progressbar to upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3355
diff changeset
   470
4755
8664231b47ac py3: fix progress() functions to not use "%s" with int
Martin von Zweigbergk <martinvonz@google.com>
parents: 4736
diff changeset
   471
        def progress(pos, rev=None):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   472
            revstr = b'' if rev is None else (b'rev %d' % rev)
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   473
            compat.progress(repo.ui, b'updating obshashrange cache',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   474
                            pos, revstr, unit=b'revision', total=total)
2366
2241433a77e5 obshashrange: warm the cache at the end of each transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2365
diff changeset
   475
        # warm the cache for the new revs
4755
8664231b47ac py3: fix progress() functions to not use "%s" with int
Martin von Zweigbergk <martinvonz@google.com>
parents: 4736
diff changeset
   476
        progress(0)
3357
6020f2c9dbd9 obshashrange: add a progressbar to upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3355
diff changeset
   477
        for idx, r in enumerate(revs):
2366
2241433a77e5 obshashrange: warm the cache at the end of each transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2365
diff changeset
   478
            _obshashrange(repo, (r, 0))
3357
6020f2c9dbd9 obshashrange: add a progressbar to upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3355
diff changeset
   479
            progress(idx, r)
4755
8664231b47ac py3: fix progress() functions to not use "%s" with int
Martin von Zweigbergk <martinvonz@google.com>
parents: 4736
diff changeset
   480
        progress(None)
2366
2241433a77e5 obshashrange: warm the cache at the end of each transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2365
diff changeset
   481
2241433a77e5 obshashrange: warm the cache at the end of each transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2365
diff changeset
   482
        del self._updating
2241433a77e5 obshashrange: warm the cache at the end of each transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2365
diff changeset
   483
2360
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   484
    @property
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   485
    def _fullcachekey(self):
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   486
        return (self._schemaversion, ) + self._cachekey
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   487
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   488
    def load(self, repo):
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   489
        if self._con is None:
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   490
            self._cachekey = self.emptykey
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   491
            self._ondiskcachekey = self.emptykey
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   492
        assert self._cachekey is not None
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   493
2399
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   494
    def _db(self):
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   495
        try:
5332
2570d2d4a268 caches: preserve permissions of top-level .hg
Joerg Sonnenberger <joerg@bec.de>
parents: 5212
diff changeset
   496
            util.makedirs(self._vfs.dirname(self._path), self._createmode)
2399
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   497
        except OSError:
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   498
            return None
5332
2570d2d4a268 caches: preserve permissions of top-level .hg
Joerg Sonnenberger <joerg@bec.de>
parents: 5212
diff changeset
   499
        if self._createmode is not None:
2570d2d4a268 caches: preserve permissions of top-level .hg
Joerg Sonnenberger <joerg@bec.de>
parents: 5212
diff changeset
   500
            pre_existed = os.access(self._path, os.R_OK)
4735
168c270e8347 py3: sqlite3.connect() expects str arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 4716
diff changeset
   501
        con = sqlite3.connect(encoding.strfromlocal(self._path), timeout=30,
4811
e1dc374909bd python3: add raw prefix to sqlite isolation level
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   502
                              isolation_level=r"IMMEDIATE")
4736
9e0d35d2f7d4 py3: read sqlite3 data as bytes
Martin von Zweigbergk <martinvonz@google.com>
parents: 4735
diff changeset
   503
        con.text_factory = bytes
5332
2570d2d4a268 caches: preserve permissions of top-level .hg
Joerg Sonnenberger <joerg@bec.de>
parents: 5212
diff changeset
   504
        if self._createmode is not None and not pre_existed:
2570d2d4a268 caches: preserve permissions of top-level .hg
Joerg Sonnenberger <joerg@bec.de>
parents: 5212
diff changeset
   505
            try:
2570d2d4a268 caches: preserve permissions of top-level .hg
Joerg Sonnenberger <joerg@bec.de>
parents: 5212
diff changeset
   506
                os.chmod(self._path, self._createmode & 0o666)
2570d2d4a268 caches: preserve permissions of top-level .hg
Joerg Sonnenberger <joerg@bec.de>
parents: 5212
diff changeset
   507
            except OSError:
2570d2d4a268 caches: preserve permissions of top-level .hg
Joerg Sonnenberger <joerg@bec.de>
parents: 5212
diff changeset
   508
                pass
2399
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   509
        return con
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   510
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   511
    @util.propertycache
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   512
    def _con(self):
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   513
        if not self._valid:
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   514
            return None
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   515
        repo = self._repo()
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   516
        if repo is None:
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   517
            return None
2399
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   518
        con = self._db()
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   519
        if con is None:
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   520
            return None
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   521
        cur = con.execute(_queryexist)
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   522
        if cur.fetchone() is None:
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   523
            self._valid = False
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   524
            return None
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   525
        meta = con.execute(_querymeta).fetchone()
2360
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   526
        if meta is None or meta[0] != self._schemaversion:
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   527
            self._valid = False
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   528
            return None
2360
89938bebc6f9 obshashrange: use the dualsourcecache as a base for the cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2287
diff changeset
   529
        self._cachekey = self._ondiskcachekey = meta[1:]
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   530
        return con
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   531
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   532
    def save(self, repo):
2361
5c5f982b98f7 obshashrange: exit early if nothing to write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2360
diff changeset
   533
        if self._cachekey is None:
5c5f982b98f7 obshashrange: exit early if nothing to write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2360
diff changeset
   534
            return
5c5f982b98f7 obshashrange: exit early if nothing to write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2360
diff changeset
   535
        if self._cachekey == self._ondiskcachekey and not self._new:
5c5f982b98f7 obshashrange: exit early if nothing to write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2360
diff changeset
   536
            return
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   537
        repo = repo.unfiltered()
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   538
        try:
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   539
            with repo.lock():
4804
079dbf36e884 python3: add raw prefix in cases harder to analyze at the token level
Raphaël Gomès <rgomes@octobus.net>
parents: 4802
diff changeset
   540
                if r'stablerange' in vars(repo):
3963
d2e9a03fb3f7 obshashrange: always save stable range cache alongside the obshashrange one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3962
diff changeset
   541
                    repo.stablerange.save(repo)
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   542
                self._save(repo)
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   543
        except error.LockError:
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   544
            # Exceptionnally we are noisy about it since performance impact
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   545
            # is large We should address that before using this more
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   546
            # widely.
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   547
            msg = _(b'obshashrange cache: skipping save unable to lock repo\n')
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   548
            repo.ui.warn(msg)
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   549
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   550
    def _save(self, repo):
4023
f59b262400fb sqlite: fast path when nothing to save
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4022
diff changeset
   551
        if not self._new:
f59b262400fb sqlite: fast path when nothing to save
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4022
diff changeset
   552
            return
4018
b3517f834f83 sqlcache: cache OperationError when saving
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4017
diff changeset
   553
        try:
b3517f834f83 sqlcache: cache OperationError when saving
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4017
diff changeset
   554
            return self._trysave(repo)
4106
dc50050dbf80 obshashrangecache: be more paranoid in the errors we catch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4096
diff changeset
   555
        except (IOError, OSError, sqlite3.DatabaseError, sqlite3.OperationalError, sqlite3.IntegrityError) as exc:
4019
8a6a2c37c0fa sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4018
diff changeset
   556
            # Catch error that may arise under stress
8a6a2c37c0fa sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4018
diff changeset
   557
            #
8a6a2c37c0fa sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4018
diff changeset
   558
            # operational error catch read-only and locked database
8a6a2c37c0fa sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4018
diff changeset
   559
            # IntegrityError catch Unique constraint error that may arise
4804
079dbf36e884 python3: add raw prefix in cases harder to analyze at the token level
Raphaël Gomès <rgomes@octobus.net>
parents: 4802
diff changeset
   560
            if r'_con' in vars(self):
4019
8a6a2c37c0fa sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4018
diff changeset
   561
                del self._con
8a6a2c37c0fa sqlcache: also ignore integrity error
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4018
diff changeset
   562
            self._new.clear()
4999
a9457b9aca4e py3: fix several TypeError formatting bytes with an exception object
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 4929
diff changeset
   563
            repo.ui.log(b'evoext-cache',
a9457b9aca4e py3: fix several TypeError formatting bytes with an exception object
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 4929
diff changeset
   564
                        b'error while saving new data: %s'
5077
39029a6d33d4 obsdiscovery: compatibility when importing forcebytestr()
Anton Shestakov <av6@dwimlabs.net>
parents: 4999
diff changeset
   565
                        % forcebytestr(exc))
4999
a9457b9aca4e py3: fix several TypeError formatting bytes with an exception object
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 4929
diff changeset
   566
            repo.ui.debug(b'evoext-cache: error while saving new data: %s'
5077
39029a6d33d4 obsdiscovery: compatibility when importing forcebytestr()
Anton Shestakov <av6@dwimlabs.net>
parents: 4999
diff changeset
   567
                          % forcebytestr(exc))
4018
b3517f834f83 sqlcache: cache OperationError when saving
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4017
diff changeset
   568
b3517f834f83 sqlcache: cache OperationError when saving
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4017
diff changeset
   569
    def _trysave(self, repo):
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   570
        if self._con is None:
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   571
            util.unlinkpath(self._path, ignoremissing=True)
4804
079dbf36e884 python3: add raw prefix in cases harder to analyze at the token level
Raphaël Gomès <rgomes@octobus.net>
parents: 4802
diff changeset
   572
            if r'_con' in vars(self):
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   573
                del self._con
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   574
2399
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   575
            con = self._db()
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   576
            if con is None:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   577
                repo.ui.log(b'evoext-cache', b'unable to write obshashrange cache'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   578
                            b' - cannot create database')
2399
70275407a31e obshashrange: avoid crash when 'cache/' directory is missing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2394
diff changeset
   579
                return
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   580
            with con:
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   581
                for req in _sqliteschema:
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   582
                    con.execute(req)
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   583
4025
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   584
                meta = [self._schemaversion] + list(self.emptykey)
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   585
                con.execute(_newmeta, meta)
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   586
                self._ondiskcachekey = self.emptykey
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   587
        else:
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   588
            con = self._con
4025
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   589
        with con:
4021
bebba5a5c82d obshashrange: always check in base cachekey against the recorded one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4019
diff changeset
   590
            meta = con.execute(_querymeta).fetchone()
bebba5a5c82d obshashrange: always check in base cachekey against the recorded one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4019
diff changeset
   591
            if meta[1:] != self._ondiskcachekey:
bebba5a5c82d obshashrange: always check in base cachekey against the recorded one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4019
diff changeset
   592
                # drifting is currently an issue because this means another
bebba5a5c82d obshashrange: always check in base cachekey against the recorded one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4019
diff changeset
   593
                # process might have already added the cache line we are about
bebba5a5c82d obshashrange: always check in base cachekey against the recorded one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4019
diff changeset
   594
                # to add. This will confuse sqlite
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   595
                msg = _(b'obshashrange cache: skipping write, '
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   596
                        b'database drifted under my feet\n')
4021
bebba5a5c82d obshashrange: always check in base cachekey against the recorded one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4019
diff changeset
   597
                repo.ui.warn(msg)
4025
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   598
                self._new.clear()
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   599
                self._valid = False
4804
079dbf36e884 python3: add raw prefix in cases harder to analyze at the token level
Raphaël Gomès <rgomes@octobus.net>
parents: 4802
diff changeset
   600
                if r'_con' in vars(self):
4025
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   601
                    del self._con
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   602
                self._valid = False
4021
bebba5a5c82d obshashrange: always check in base cachekey against the recorded one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4019
diff changeset
   603
                return
4025
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   604
            data = ((rangeid[0], rangeid[1], self.get(rangeid)) for rangeid in self._new)
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   605
            con.executemany(_updateobshash, data)
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   606
            cachekey = self._fullcachekey
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   607
            con.execute(_clearmeta) # remove the older entry
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   608
            con.execute(_newmeta, cachekey)
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   609
            self._new.clear()
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   610
            self._valid = True
971d2e81b5b6 obshashrange: rework saving branching to be clearer and safer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4024
diff changeset
   611
            self._ondiskcachekey = self._cachekey
5332
2570d2d4a268 caches: preserve permissions of top-level .hg
Joerg Sonnenberger <joerg@bec.de>
parents: 5212
diff changeset
   612
2083
778afb036245 discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2082
diff changeset
   613
@eh.wrapfunction(obsolete.obsstore, '_addmarkers')
778afb036245 discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2082
diff changeset
   614
def _addmarkers(orig, obsstore, *args, **kwargs):
778afb036245 discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2082
diff changeset
   615
    obsstore.rangeobshashcache.clear()
778afb036245 discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2082
diff changeset
   616
    return orig(obsstore, *args, **kwargs)
778afb036245 discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2082
diff changeset
   617
3144
6f10c94a2114 compat: stop working around 3.8 file cache limitation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3080
diff changeset
   618
obsstorefilecache = localrepo.localrepository.obsstore
2244
c7da63d48f80 compat: work around some filecache bug in 3.8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2243
diff changeset
   619
c7da63d48f80 compat: work around some filecache bug in 3.8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2243
diff changeset
   620
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   621
# obsstore is a filecache so we have do to some spacial dancing
2244
c7da63d48f80 compat: work around some filecache bug in 3.8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2243
diff changeset
   622
@eh.wrapfunction(obsstorefilecache, 'func')
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   623
def obsstorewithcache(orig, repo):
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   624
    obsstore = orig(repo)
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   625
    obsstore.rangeobshashcache = _obshashcache(repo.unfiltered())
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   626
    return obsstore
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   627
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   628
@eh.reposetup
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   629
def setupcache(ui, repo):
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   630
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   631
    class obshashrepo(repo.__class__):
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   632
        @localrepo.unfilteredmethod
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   633
        def destroyed(self):
4804
079dbf36e884 python3: add raw prefix in cases harder to analyze at the token level
Raphaël Gomès <rgomes@octobus.net>
parents: 4802
diff changeset
   634
            if r'obsstore' in vars(self):
2363
2ceb122fcc33 obshashrange: properly invalidate the cache on destroyed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2362
diff changeset
   635
                self.obsstore.rangeobshashcache.clear()
4156
f996596d8ccc caches: no longer warm the cache on strip in "auto" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4119
diff changeset
   636
            toplevel = not util.safehasattr(self, '_destroying')
f996596d8ccc caches: no longer warm the cache on strip in "auto" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4119
diff changeset
   637
            if toplevel:
f996596d8ccc caches: no longer warm the cache on strip in "auto" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4119
diff changeset
   638
                self._destroying = True
f996596d8ccc caches: no longer warm the cache on strip in "auto" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4119
diff changeset
   639
            try:
f996596d8ccc caches: no longer warm the cache on strip in "auto" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4119
diff changeset
   640
                super(obshashrepo, self).destroyed()
f996596d8ccc caches: no longer warm the cache on strip in "auto" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4119
diff changeset
   641
            finally:
f996596d8ccc caches: no longer warm the cache on strip in "auto" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4119
diff changeset
   642
                if toplevel:
f996596d8ccc caches: no longer warm the cache on strip in "auto" mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4119
diff changeset
   643
                    del self._destroying
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   644
3968
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3963
diff changeset
   645
        @localrepo.unfilteredmethod
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3963
diff changeset
   646
        def updatecaches(self, tr=None, **kwargs):
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3963
diff changeset
   647
            if utility.shouldwarmcache(self, tr):
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3963
diff changeset
   648
                self.obsstore.rangeobshashcache.update(self)
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3963
diff changeset
   649
                self.obsstore.rangeobshashcache.save(self)
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3963
diff changeset
   650
            super(obshashrepo, self).updatecaches(tr, **kwargs)
2364
9b68e65fad4f obshashrange: "update" the cache on each transaction close
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2363
diff changeset
   651
2241
88aace74b190 obshashrange: introduce basic sqlite caching
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2240
diff changeset
   652
    repo.__class__ = obshashrepo
2083
778afb036245 discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2082
diff changeset
   653
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   654
### wire protocol commands
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   655
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   656
def _obshashrange_v0(repo, ranges):
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   657
    """return a list of hash from a list of range
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   658
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   659
    The range have the id encoded as a node
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   660
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   661
    return 'wdirid' for unknown range"""
4929
bb2b4f6c99dc compat: compatibility for cl.nodemap.get vs cl.index.get_rev
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
   662
    getrev = compat.getgetrev(repo.changelog)
bb2b4f6c99dc compat: compatibility for cl.nodemap.get vs cl.index.get_rev
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
   663
    ranges = [(getrev(n), idx) for n, idx in ranges]
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   664
    if ranges:
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   665
        maxrev = max(r for r, i in ranges)
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   666
        if maxrev is not None:
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   667
            repo.stablerange.warmup(repo, upto=maxrev)
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   668
    result = []
2365
4b8b7fd135eb obshashrange: warm cache outside of loops
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2364
diff changeset
   669
    repo.obsstore.rangeobshashcache.update(repo)
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   670
    for r in ranges:
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   671
        if r[0] is None:
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   672
            result.append(node.wdirid)
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   673
        else:
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   674
            result.append(_obshashrange(repo, r))
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   675
    repo.obsstore.rangeobshashcache.save(repo)
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   676
    return result
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   677
3346
f4e28b781143 stablerange: use mergepoint based algorithm for the official stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   678
@eh.addattr(localrepo.localpeer, 'evoext_obshashrange_v1')
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   679
def local_obshashrange_v0(peer, ranges):
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   680
    return _obshashrange_v0(peer._repo, ranges)
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   681
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   682
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   683
_indexformat = b'>I'
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   684
_indexsize = _calcsize(_indexformat)
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   685
def _encrange(node_rangeid):
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   686
    """encode a (node) range"""
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   687
    headnode, index = node_rangeid
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   688
    return headnode + _pack(_indexformat, index)
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   689
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   690
def _decrange(data):
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   691
    """encode a (node) range"""
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   692
    assert _indexsize < len(data), len(data)
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   693
    headnode = data[:-_indexsize]
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   694
    index = _unpack(_indexformat, data[-_indexsize:])[0]
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   695
    return (headnode, index)
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   696
3669
0407965ae79e compat: deal with change in the wireproto module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3524
diff changeset
   697
@eh.addattr(wirepeer, 'evoext_obshashrange_v1')
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   698
def peer_obshashrange_v0(self, ranges):
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   699
    binranges = [_encrange(r) for r in ranges]
3669
0407965ae79e compat: deal with change in the wireproto module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3524
diff changeset
   700
    encranges = encodelist(binranges)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   701
    d = self._call(b"evoext_obshashrange_v1", ranges=encranges)
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   702
    try:
3669
0407965ae79e compat: deal with change in the wireproto module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3524
diff changeset
   703
        return decodelist(d)
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   704
    except ValueError:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   705
        self._abort(error.ResponseError(_(b"unexpected response:"), d))
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   706
5180
515d425c0a05 compat: drop 4.5 related compatibility around wireprotocol module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5176
diff changeset
   707
@wireprotov1server.wireprotocommand(b'evoext_obshashrange_v1', b'ranges', b'pull')
3346
f4e28b781143 stablerange: use mergepoint based algorithm for the official stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   708
def srv_obshashrange_v1(repo, proto, ranges):
3669
0407965ae79e compat: deal with change in the wireproto module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3524
diff changeset
   709
    ranges = decodelist(ranges)
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   710
    ranges = [_decrange(r) for r in ranges]
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   711
    hashes = _obshashrange_v0(repo, ranges)
3669
0407965ae79e compat: deal with change in the wireproto module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3524
diff changeset
   712
    return encodelist(hashes)
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   713
2551
ecd47c63b6de obshashrange: add an option to protect from accidental activation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2525
diff changeset
   714
def _useobshashrange(repo):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   715
    base = repo.ui.configbool(b'experimental', b'obshashrange')
2551
ecd47c63b6de obshashrange: add an option to protect from accidental activation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2525
diff changeset
   716
    if base:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   717
        maxrevs = repo.ui.configint(b'experimental', b'obshashrange.max-revs')
2551
ecd47c63b6de obshashrange: add an option to protect from accidental activation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2525
diff changeset
   718
        if maxrevs is not None and maxrevs < len(repo.unfiltered()):
ecd47c63b6de obshashrange: add an option to protect from accidental activation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2525
diff changeset
   719
            base = False
ecd47c63b6de obshashrange: add an option to protect from accidental activation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2525
diff changeset
   720
    return base
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   721
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   722
def _canobshashrange(local, remote):
2551
ecd47c63b6de obshashrange: add an option to protect from accidental activation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2525
diff changeset
   723
    return (_useobshashrange(local)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   724
            and remote.capable(b'_evoext_obshashrange_v1'))
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   725
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   726
def _obshashrange_capabilities(orig, repo, proto):
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   727
    """wrapper to advertise new capability"""
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   728
    caps = orig(repo, proto)
2551
ecd47c63b6de obshashrange: add an option to protect from accidental activation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2525
diff changeset
   729
    enabled = _useobshashrange(repo)
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   730
    if obsolete.isenabled(repo, obsolete.exchangeopt) and enabled:
5180
515d425c0a05 compat: drop 4.5 related compatibility around wireprotocol module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5176
diff changeset
   731
        caps = caps.data.split()
3500
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3366
diff changeset
   732
        caps.append(b'_evoext_obshashrange_v1')
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   733
        caps.sort()
5180
515d425c0a05 compat: drop 4.5 related compatibility around wireprotocol module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5176
diff changeset
   734
        caps = wireprototypes.bytesresponse(b' '.join(caps))
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   735
    return caps
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   736
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   737
@eh.extsetup
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   738
def obshashrange_extsetup(ui):
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   739
    ###
3681
3f90e6c5d140 discovery: handle deletion of 'wireproto' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3669
diff changeset
   740
    extensions.wrapfunction(wireprotov1server, 'capabilities',
3f90e6c5d140 discovery: handle deletion of 'wireproto' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3669
diff changeset
   741
                            _obshashrange_capabilities)
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   742
    # wrap command content
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   743
    oldcap, args = wireprotov1server.commands[b'capabilities']
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   744
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   745
    def newcap(repo, proto):
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   746
        return _obshashrange_capabilities(oldcap, repo, proto)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   747
    wireprotov1server.commands[b'capabilities'] = (newcap, args)
2243
d83851f2d375 obshashrange: have an half descent wireprotocol command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2242
diff changeset
   748
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   749
##########################################
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   750
###  trigger discovery during exchange ###
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   751
##########################################
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   752
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   753
def _dopushmarkers(pushop):
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   754
    return (# we have any markers to push
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   755
            pushop.repo.obsstore
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   756
            # exchange of obsmarkers is enabled locally
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   757
            and obsolete.isenabled(pushop.repo, obsolete.exchangeopt)
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   758
            # remote server accept markers
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   759
            and b'obsolete' in pushop.remote.listkeys(b'namespaces'))
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   760
2512
0e6ae8db9c21 obsdiscovery: extract push-obshashrange discovery in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2511
diff changeset
   761
def _pushobshashrange(pushop, commonrevs):
0e6ae8db9c21 obsdiscovery: extract push-obshashrange discovery in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2511
diff changeset
   762
    repo = pushop.repo.unfiltered()
0e6ae8db9c21 obsdiscovery: extract push-obshashrange discovery in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2511
diff changeset
   763
    remote = pushop.remote
0e6ae8db9c21 obsdiscovery: extract push-obshashrange discovery in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2511
diff changeset
   764
    missing = findmissingrange(pushop.ui, repo, remote, commonrevs)
0e6ae8db9c21 obsdiscovery: extract push-obshashrange discovery in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2511
diff changeset
   765
    missing += pushop.outgoing.missing
0e6ae8db9c21 obsdiscovery: extract push-obshashrange discovery in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2511
diff changeset
   766
    return missing
0e6ae8db9c21 obsdiscovery: extract push-obshashrange discovery in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2511
diff changeset
   767
2515
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   768
# available discovery method, first valid is used
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   769
# tuple (canuse, perform discovery))
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   770
obsdiscoveries = [
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   771
    (_canobshashrange, _pushobshashrange),
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   772
]
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   773
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   774
obsdiscovery_skip_message = b"""\
2521
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   775
(skipping discovery of obsolescence markers, will exchange everything)
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   776
(controled by 'experimental.evolution.obsdiscovery' configuration)
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   777
"""
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   778
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   779
def usediscovery(repo):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   780
    return repo.ui.configbool(b'experimental', b'evolution.obsdiscovery')
2521
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   781
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   782
@eh.wrapfunction(exchange, '_pushdiscoveryobsmarkers')
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   783
def _pushdiscoveryobsmarkers(orig, pushop):
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   784
    if _dopushmarkers(pushop):
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   785
        repo = pushop.repo
2515
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   786
        remote = pushop.remote
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   787
        obsexcmsg(repo.ui, b"computing relevant nodes\n")
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   788
        revs = list(repo.revs(b'::%ln', pushop.futureheads))
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   789
        unfi = repo.unfiltered()
2515
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   790
2521
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   791
        if not usediscovery(repo):
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   792
            # discovery disabled by user
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   793
            repo.ui.status(obsdiscovery_skip_message)
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   794
            return orig(pushop)
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   795
2515
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   796
        # look for an obs-discovery protocol we can use
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   797
        discovery = None
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   798
        for candidate in obsdiscoveries:
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   799
            if candidate[0](repo, remote):
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   800
                discovery = candidate[1]
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   801
                break
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   802
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   803
        if discovery is None:
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   804
            # no discovery available, rely on core to push all relevants
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   805
            # obs markers.
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   806
            return orig(pushop)
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   807
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   808
        obsexcmsg(repo.ui, b"looking for common markers in %i nodes\n"
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   809
                           % len(revs))
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   810
        commonrevs = list(unfi.revs(b'::%ln', pushop.outgoing.commonheads))
2515
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   811
        # find the nodes where the relevant obsmarkers mismatches
cd8aa99d4f20 obsdiscovery: automatically pick protocol in a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2514
diff changeset
   812
        nodes = discovery(pushop, commonrevs)
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   813
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   814
        if nodes:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   815
            obsexcmsg(repo.ui, b"computing markers relevant to %i nodes\n"
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   816
                               % len(nodes))
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   817
            pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes)
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   818
        else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   819
            obsexcmsg(repo.ui, b"markers already in sync\n")
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   820
            pushop.outobsmarkers = []
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   821
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   822
@eh.extsetup
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   823
def _installobsmarkersdiscovery(ui):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   824
    olddisco = exchange.pushdiscoverymapping[b'obsmarker']
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   825
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   826
    def newdisco(pushop):
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   827
        _pushdiscoveryobsmarkers(olddisco, pushop)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   828
    exchange.pushdiscoverymapping[b'obsmarker'] = newdisco
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   829
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   830
def buildpullobsmarkersboundaries(pullop, bundle2=True):
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   831
    """small function returning the argument for pull markers call
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   832
    may to contains 'heads' and 'common'. skip the key for None.
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   833
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   834
    It is a separed function to play around with strategy for that."""
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   835
    repo = pullop.repo
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   836
    remote = pullop.remote
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   837
    unfi = repo.unfiltered()
5200
a60a478ee2fa obsdiscovery: avoid considering locally hidden changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5077
diff changeset
   838
    # Also exclude filtered revisions. Working on unfiltered repository can
a60a478ee2fa obsdiscovery: avoid considering locally hidden changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5077
diff changeset
   839
    # give a bit more precise view of the repository. However it makes the
a60a478ee2fa obsdiscovery: avoid considering locally hidden changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5077
diff changeset
   840
    # overall operation more complicated.
a60a478ee2fa obsdiscovery: avoid considering locally hidden changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5077
diff changeset
   841
    filteredrevs = repo.changelog.filteredrevs
a60a478ee2fa obsdiscovery: avoid considering locally hidden changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5077
diff changeset
   842
    # XXX probably not very efficient
a60a478ee2fa obsdiscovery: avoid considering locally hidden changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5077
diff changeset
   843
    revs = unfi.revs(b'::(%ln - null) - %ld', pullop.common, filteredrevs)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   844
    boundaries = {b'heads': pullop.pulledsubset}
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   845
    if not revs: # nothing common
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   846
        boundaries[b'common'] = [node.nullid]
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   847
        return boundaries
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   848
2521
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   849
    if not usediscovery(repo):
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   850
        # discovery disabled by users.
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   851
        repo.ui.status(obsdiscovery_skip_message)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   852
        boundaries[b'common'] = [node.nullid]
2521
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   853
        return boundaries
29fc90b0e59c obsdiscovery: add an option to disable all obsdiscovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2515
diff changeset
   854
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   855
    if bundle2 and _canobshashrange(repo, remote):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   856
        obsexcmsg(repo.ui, b"looking for common markers in %i nodes\n"
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   857
                  % len(revs))
5200
a60a478ee2fa obsdiscovery: avoid considering locally hidden changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5077
diff changeset
   858
        missing = findmissingrange(repo.ui, repo, pullop.remote, revs)
a60a478ee2fa obsdiscovery: avoid considering locally hidden changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5077
diff changeset
   859
        boundaries[b'missing'] = missing
5202
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5200
diff changeset
   860
        # using getattr since `limitedarguments` is missing
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5200
diff changeset
   861
        # hg <= 5.0 (69921d02daaf)
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5200
diff changeset
   862
        if getattr(pullop.remote, 'limitedarguments', False):
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5200
diff changeset
   863
            # prepare for a possible fallback to common
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5200
diff changeset
   864
            common = repo.set("heads(only(%ld, %ln))", revs, missing)
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5200
diff changeset
   865
            boundaries[b'common'] = [c.node() for c in common]
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   866
    else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4811
diff changeset
   867
        boundaries[b'common'] = [node.nullid]
2509
6da129b2b440 obsdiscovery: move code inserting discovery at the end of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2508
diff changeset
   868
    return boundaries
3952
a7794f5abacd discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3708
diff changeset
   869
a7794f5abacd discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3708
diff changeset
   870
# merge later for outer layer wrapping
a7794f5abacd discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3708
diff changeset
   871
eh.merge(stablerangecache.eh)