hgext3rd/evolve/obsdiscovery.py
author Pierre-Yves David <pierre-yves.david@ens-lyon.org>
Wed, 22 Mar 2017 05:32:25 +0100
changeset 2138 393fabaf4039
parent 2137 dd8ed58bf79c
child 2139 f80fa478e289
permissions -rw-r--r--
debugstablerange: minor code reformat The content of that list will become more complex as we drop the object so we make sure to have one value per line for clarity.
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
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    18
try:
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    19
    import StringIO as io
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    20
    StringIO = io.StringIO
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    21
except ImportError:
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    22
    import io
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    23
    StringIO = io.StringIO
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    24
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
    25
import hashlib
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    26
import heapq
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    27
import struct
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
    28
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    29
from mercurial import (
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    30
    bundle2,
2076
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    31
    dagutil,
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    32
    error,
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    33
    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
    34
    extensions,
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    35
    localrepo,
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    36
    node,
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    37
    obsolete,
2081
010a8af416a0 discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2076
diff changeset
    38
    scmutil,
2076
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    39
    setdiscovery,
2082
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
    40
    util,
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    41
    wireproto,
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    42
)
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
    43
from mercurial.hgweb import hgweb_mod
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    44
from mercurial.i18n import _
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    45
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    46
from . import (
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    47
    exthelper,
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    48
    utility,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2124
diff changeset
    49
    stablerange,
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    50
)
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    51
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    52
_pack = struct.pack
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    53
_unpack = struct.unpack
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    54
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    55
eh = exthelper.exthelper()
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2124
diff changeset
    56
eh.merge(stablerange.eh)
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    57
obsexcmsg = utility.obsexcmsg
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    58
2076
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    59
##########################################
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    60
###  trigger discovery during exchange ###
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    61
##########################################
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    62
2076
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    63
@eh.wrapfunction(exchange, '_pushdiscoveryobsmarkers')
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    64
def _pushdiscoveryobsmarkers(orig, pushop):
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    65
    if (obsolete.isenabled(pushop.repo, obsolete.exchangeopt)
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    66
        and pushop.repo.obsstore
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    67
        and 'obsolete' in pushop.remote.listkeys('namespaces')):
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    68
        repo = pushop.repo
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    69
        obsexcmsg(repo.ui, "computing relevant nodes\n")
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    70
        revs = list(repo.revs('::%ln', pushop.futureheads))
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    71
        unfi = repo.unfiltered()
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    72
        cl = unfi.changelog
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    73
        if not pushop.remote.capable('_evoext_obshash_0'):
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    74
            # do not trust core yet
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    75
            # return orig(pushop)
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    76
            nodes = [cl.node(r) for r in revs]
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    77
            if nodes:
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    78
                obsexcmsg(repo.ui, "computing markers relevant to %i nodes\n"
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    79
                                   % len(nodes))
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    80
                pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes)
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    81
            else:
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    82
                obsexcmsg(repo.ui, "markers already in sync\n")
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    83
                pushop.outobsmarkers = []
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    84
                pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes)
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    85
            return
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    86
2076
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    87
        common = []
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    88
        missing = None
2076
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    89
        obsexcmsg(repo.ui, "looking for common markers in %i nodes\n"
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    90
                           % len(revs))
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    91
        commonrevs = list(unfi.revs('::%ln', pushop.outgoing.commonheads))
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    92
        if _canobshashrange(repo, pushop.remote):
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    93
            missing = findmissingrange(pushop.ui, unfi, pushop.remote,
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    94
                                       commonrevs)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    95
        else:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    96
            common = findcommonobsmarkers(pushop.ui, unfi, pushop.remote,
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    97
                                          commonrevs)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    98
        if missing is None:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
    99
            revs = list(unfi.revs('%ld - (::%ln)', revs, common))
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   100
            nodes = [cl.node(r) for r in revs]
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   101
        else:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   102
            revs = list(repo.revs('only(%ln, %ln)', pushop.futureheads,
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   103
                        pushop.outgoing.commonheads))
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   104
            nodes = [cl.node(r) for r in revs]
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   105
            nodes += missing
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   106
2076
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   107
        if nodes:
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   108
            obsexcmsg(repo.ui, "computing markers relevant to %i nodes\n"
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   109
                               % len(nodes))
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   110
            pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes)
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   111
        else:
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   112
            obsexcmsg(repo.ui, "markers already in sync\n")
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   113
            pushop.outobsmarkers = []
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   114
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   115
@eh.extsetup
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   116
def _installobsmarkersdiscovery(ui):
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   117
    olddisco = exchange.pushdiscoverymapping['obsmarker']
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   118
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   119
    def newdisco(pushop):
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   120
        _pushdiscoveryobsmarkers(olddisco, pushop)
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   121
    exchange.pushdiscoverymapping['obsmarker'] = newdisco
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   122
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   123
def buildpullobsmarkersboundaries(pullop, bundle2=True):
2076
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   124
    """small function returning the argument for pull markers call
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   125
    may to contains 'heads' and 'common'. skip the key for None.
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   126
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   127
    It is a separed function to play around with strategy for that."""
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   128
    repo = pullop.repo
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   129
    remote = pullop.remote
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   130
    unfi = repo.unfiltered()
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   131
    revs = unfi.revs('::(%ln - null)', pullop.common)
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   132
    boundaries = {'heads': pullop.pulledsubset}
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   133
    if not revs: # nothing common
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   134
        boundaries['common'] = [node.nullid]
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   135
        return boundaries
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   136
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   137
    if bundle2 and _canobshashrange(repo, remote):
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   138
        obsexcmsg(repo.ui, "looking for common markers in %i nodes\n"
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   139
                  % len(revs))
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   140
        boundaries['missing'] = findmissingrange(repo.ui, repo, pullop.remote,
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   141
                                                 revs)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   142
    elif remote.capable('_evoext_obshash_0'):
2076
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   143
        obsexcmsg(repo.ui, "looking for common markers in %i nodes\n"
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   144
                           % len(revs))
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   145
        boundaries['common'] = findcommonobsmarkers(repo.ui, repo, remote, revs)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   146
    else:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   147
        boundaries['common'] = [node.nullid]
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   148
    return boundaries
2076
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   149
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   150
##################################
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   151
###  Code performing discovery ###
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   152
##################################
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   153
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   154
def _canobshashrange(local, remote):
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   155
    return (local.ui.configbool('experimental', 'obshashrange', False)
2098
fc94c1909c18 evolve: update the capabilities and commands name for obshashrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2093
diff changeset
   156
            and remote.capable('_donotusemeever_evoext_obshashrange_1'))
fc94c1909c18 evolve: update the capabilities and commands name for obshashrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2093
diff changeset
   157
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   158
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   159
def _obshashrange_capabilities(orig, repo, proto):
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   160
    """wrapper to advertise new capability"""
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   161
    caps = orig(repo, proto)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   162
    enabled = repo.ui.configbool('experimental', 'obshashrange', False)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   163
    if obsolete.isenabled(repo, obsolete.exchangeopt) and enabled:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   164
        caps = caps.split()
2098
fc94c1909c18 evolve: update the capabilities and commands name for obshashrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2093
diff changeset
   165
        caps.append('_donotusemeever_evoext_obshashrange_1')
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   166
        caps.sort()
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   167
        caps = ' '.join(caps)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   168
    return caps
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   169
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   170
@eh.extsetup
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   171
def obshashrange_extsetup(ui):
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   172
    extensions.wrapfunction(wireproto, 'capabilities', _obshashrange_capabilities)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   173
    # wrap command content
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   174
    oldcap, args = wireproto.commands['capabilities']
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   175
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   176
    def newcap(repo, proto):
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   177
        return _obshashrange_capabilities(oldcap, repo, proto)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   178
    wireproto.commands['capabilities'] = (newcap, args)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   179
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   180
def findcommonobsmarkers(ui, local, remote, probeset,
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   181
                         initialsamplesize=100,
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   182
                         fullsamplesize=200):
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   183
    # from discovery
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   184
    roundtrips = 0
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   185
    cl = local.changelog
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   186
    dag = dagutil.revlogdag(cl)
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   187
    missing = set()
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   188
    common = set()
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   189
    undecided = set(probeset)
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   190
    totalnb = len(undecided)
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   191
    ui.progress(_("comparing with other"), 0, total=totalnb)
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   192
    _takefullsample = setdiscovery._takefullsample
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   193
    if remote.capable('_evoext_obshash_1'):
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   194
        getremotehash = remote.evoext_obshash1
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
   195
        localhash = _obsrelsethashtreefm1(local)
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   196
    else:
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   197
        getremotehash = remote.evoext_obshash
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
   198
        localhash = _obsrelsethashtreefm0(local)
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   199
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   200
    while undecided:
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   201
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   202
        ui.note(_("sampling from both directions\n"))
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   203
        if len(undecided) < fullsamplesize:
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   204
            sample = set(undecided)
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   205
        else:
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   206
            sample = _takefullsample(dag, undecided, size=fullsamplesize)
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   207
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   208
        roundtrips += 1
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   209
        ui.progress(_("comparing with other"), totalnb - len(undecided),
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   210
                    total=totalnb)
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   211
        ui.debug("query %i; still undecided: %i, sample size is: %i\n"
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   212
                 % (roundtrips, len(undecided), len(sample)))
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   213
        # indices between sample and externalized version must match
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   214
        sample = list(sample)
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   215
        remotehash = getremotehash(dag.externalizeall(sample))
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   216
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   217
        yesno = [localhash[ix][1] == remotehash[si]
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   218
                 for si, ix in enumerate(sample)]
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   219
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   220
        commoninsample = set(n for i, n in enumerate(sample) if yesno[i])
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   221
        common.update(dag.ancestorset(commoninsample, common))
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   222
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   223
        missinginsample = [n for i, n in enumerate(sample) if not yesno[i]]
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   224
        missing.update(dag.descendantset(missinginsample, missing))
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   225
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   226
        undecided.difference_update(missing)
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   227
        undecided.difference_update(common)
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   228
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   229
    ui.progress(_("comparing with other"), None)
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   230
    result = dag.headsetofconnecteds(common)
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   231
    ui.debug("%d total queries\n" % roundtrips)
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   232
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   233
    if not result:
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   234
        return set([node.nullid])
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   235
    return dag.externalizeall(result)
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   236
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   237
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
   238
                     initialsamplesize=100,
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   239
                     fullsamplesize=200):
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   240
    missing = set()
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   241
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   242
    heads = local.revs('heads(%ld)', probeset)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   243
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   244
    # size of slice ?
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   245
    heappop = heapq.heappop
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   246
    heappush = heapq.heappush
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   247
    heapify = heapq.heapify
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   248
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   249
    tested = set()
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   250
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   251
    sample = []
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   252
    samplesize = initialsamplesize
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   253
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   254
    def addentry(entry):
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   255
        if entry in tested:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   256
            return False
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   257
        sample.append(entry)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   258
        tested.add(entry)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   259
        return True
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   260
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   261
    for h in heads:
2130
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   262
        entry = stablerange.stablerange(local, h, 0)
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   263
        addentry(entry)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   264
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   265
    querycount = 0
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   266
    ui.progress(_("comparing obsmarker with other"), querycount)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   267
    overflow = []
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   268
    while sample or overflow:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   269
        if overflow:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   270
            sample.extend(overflow)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   271
            overflow = []
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   272
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   273
        if samplesize < len(sample):
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   274
            # too much sample already
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   275
            overflow = sample[samplesize:]
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   276
            sample = sample[:samplesize]
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   277
        elif len(sample) < samplesize:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   278
            # we need more sample !
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   279
            needed = samplesize - len(sample)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   280
            sliceme = []
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   281
            heapify(sliceme)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   282
            for entry in sample:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   283
                if 1 < len(entry):
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   284
                    heappush(sliceme, (-len(entry), entry))
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   285
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   286
            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
   287
                _key, target = heappop(sliceme)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   288
                for new in target.subranges():
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   289
                    # XXX we could record hierarchy to optimise drop
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   290
                    if addentry(entry):
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   291
                        if 1 < len(entry):
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   292
                            heappush(sliceme, (-len(entry), entry))
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   293
                        needed -= 1
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   294
                        if needed <= 0:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   295
                            break
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   296
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   297
        # 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
   298
        samplesize = fullsamplesize
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   299
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   300
        nbsample = len(sample)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   301
        maxsize = max([len(r) for r in sample])
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   302
        ui.debug("query %i; sample size is %i, largest range %i\n"
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   303
                 % (querycount, maxsize, nbsample))
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   304
        nbreplies = 0
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   305
        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
   306
        sample = []
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   307
        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
   308
            nbreplies += 1
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   309
            if remotehash == entry.obshash:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   310
                continue
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   311
            elif 1 == len(entry):
2085
6d61c5ed3bfa obsdiscovery: simply some of the missing computation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2084
diff changeset
   312
                missing.add(entry.node)
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   313
            else:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   314
                for new in entry.subranges():
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   315
                    addentry(new)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   316
        assert nbsample == nbreplies
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   317
        querycount += 1
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   318
        ui.progress(_("comparing obsmarker with other"), querycount)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   319
    ui.progress(_("comparing obsmarker with other"), None)
2085
6d61c5ed3bfa obsdiscovery: simply some of the missing computation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2084
diff changeset
   320
    return sorted(missing)
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   321
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   322
def _queryrange(ui, repo, remote, allentries):
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   323
    mapping = {}
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   324
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   325
    def gen():
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   326
        for entry in allentries:
2091
fcb8db796576 stablerange: reuse node calculation as much as possible
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2090
diff changeset
   327
            key = entry.node + _pack('>I', entry.index)
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   328
            mapping[key] = entry
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   329
            yield key
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   330
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   331
    bundler = bundle2.bundle20(ui, bundle2.bundle2caps(remote))
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   332
    capsblob = bundle2.encodecaps(bundle2.getrepocaps(repo))
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   333
    bundler.newpart('replycaps', data=capsblob)
2098
fc94c1909c18 evolve: update the capabilities and commands name for obshashrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2093
diff changeset
   334
    bundler.newpart('_donotusemeever_evoext_obshashrange_1', data=gen())
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   335
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   336
    stream = util.chunkbuffer(bundler.getchunks())
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   337
    try:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   338
        reply = remote.unbundle(
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   339
            stream, ['force'], remote.url())
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   340
    except error.BundleValueError as exc:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   341
        raise error.Abort(_('missing support for %s') % exc)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   342
    try:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   343
        op = bundle2.processbundle(repo, reply)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   344
    except error.BundleValueError as exc:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   345
        raise error.Abort(_('missing support for %s') % exc)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   346
    except bundle2.AbortFromPart as exc:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   347
        ui.status(_('remote: %s\n') % exc)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   348
        if exc.hint is not None:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   349
            ui.status(_('remote: %s\n') % ('(%s)' % exc.hint))
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   350
        raise error.Abort(_('push failed on remote'))
2098
fc94c1909c18 evolve: update the capabilities and commands name for obshashrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2093
diff changeset
   351
    for rep in op.records['_donotusemeever_evoext_obshashrange_1']:
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   352
        yield mapping[rep['key']], rep['value']
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   353
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   354
2098
fc94c1909c18 evolve: update the capabilities and commands name for obshashrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2093
diff changeset
   355
@bundle2.parthandler('_donotusemeever_evoext_obshashrange_1', ())
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   356
def _processqueryrange(op, inpart):
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   357
    assert op.reply is not None
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   358
    replies = []
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   359
    data = inpart.read(24)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   360
    while data:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   361
        n = data[:20]
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   362
        index = _unpack('>I', data[20:])[0]
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   363
        r = op.repo.changelog.rev(n)
2130
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   364
        rhash = stablerange.stablerange(op.repo, r, index).obshash
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   365
        replies.append(data + rhash)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   366
        data = inpart.read(24)
2098
fc94c1909c18 evolve: update the capabilities and commands name for obshashrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2093
diff changeset
   367
    op.reply.newpart('reply:_donotusemeever_evoext_obshashrange_1', data=iter(replies))
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   368
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   369
2098
fc94c1909c18 evolve: update the capabilities and commands name for obshashrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2093
diff changeset
   370
@bundle2.parthandler('reply:_donotusemeever_evoext_obshashrange_1', ())
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   371
def _processqueryrangereply(op, inpart):
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   372
    data = inpart.read(44)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   373
    while data:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   374
        key = data[:24]
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   375
        rhash = data[24:]
2098
fc94c1909c18 evolve: update the capabilities and commands name for obshashrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2093
diff changeset
   376
        op.records.add('_donotusemeever_evoext_obshashrange_1', {'key': key, 'value': rhash})
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   377
        data = inpart.read(44)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   378
2082
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   379
##############################
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   380
### Range Hash computation ###
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   381
##############################
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2083
diff changeset
   382
2082
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   383
@eh.command(
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   384
    'debugstablerange',
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   385
    [
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   386
        ('', 'rev', [], 'heads to start from'),
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   387
    ],
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   388
    _(''))
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   389
def debugstablerange(ui, repo, **opts):
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   390
    """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
   391
    """
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   392
    s = node.short
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   393
    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
   394
    # prewarm depth cache
2135
8f63f4b1c33e stablerange: add an official warmup function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
   395
    repo.stablerange.warmup(repo, revs)
2137
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2135
diff changeset
   396
    ranges = stablerange.subrangesclosure(repo, revs)
2083
778afb036245 discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2082
diff changeset
   397
    ui.status('rev         node index size depth      obshash\n')
2082
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   398
    for r in ranges:
2138
393fabaf4039 debugstablerange: minor code reformat
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2137
diff changeset
   399
        d = (r.head,
393fabaf4039 debugstablerange: minor code reformat
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2137
diff changeset
   400
             s(r.node),
393fabaf4039 debugstablerange: minor code reformat
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2137
diff changeset
   401
             r.index,
393fabaf4039 debugstablerange: minor code reformat
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2137
diff changeset
   402
             len(r),
393fabaf4039 debugstablerange: minor code reformat
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2137
diff changeset
   403
             r.depth,
393fabaf4039 debugstablerange: minor code reformat
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2137
diff changeset
   404
             node.short(r.obshash))
2083
778afb036245 discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2082
diff changeset
   405
        ui.status('%3d %s %5d %4d %5d %s\n' % d)
2082
3f787182509f discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2081
diff changeset
   406
2083
778afb036245 discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2082
diff changeset
   407
@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
   408
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
   409
    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
   410
    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
   411
778afb036245 discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2082
diff changeset
   412
@eh.addattr(obsolete.obsstore, 'rangeobshashcache')
778afb036245 discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2082
diff changeset
   413
@util.propertycache
778afb036245 discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2082
diff changeset
   414
def rangeobshashcache(obsstore):
778afb036245 discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2082
diff changeset
   415
    return {}
778afb036245 discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2082
diff changeset
   416
2076
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   417
#############################
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   418
### Tree Hash computation ###
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   419
#############################
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   420
2076
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   421
# Dash computed from a given changesets using all markers relevant to it and
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   422
# the obshash of its parents.  This is similar to what happend for changeset
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   423
# node where the parent is used in the computation
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   424
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   425
@eh.command(
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   426
    'debugobsrelsethashtree',
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   427
    [('', 'v0', None, 'hash on marker format "0"'),
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   428
     ('', 'v1', None, 'hash on marker format "1" (default)')], _(''))
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   429
def debugobsrelsethashtree(ui, repo, v0=False, v1=False):
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   430
    """display Obsolete markers, Relevant Set, Hash Tree
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   431
    changeset-node obsrelsethashtree-node
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   432
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   433
    It computed form the "orsht" of its parent and markers
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   434
    relevant to the changeset itself."""
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   435
    if v0 and v1:
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   436
        raise error.Abort('cannot only specify one format')
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   437
    elif v0:
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
   438
        treefunc = _obsrelsethashtreefm0
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   439
    else:
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
   440
        treefunc = _obsrelsethashtreefm1
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   441
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   442
    for chg, obs in treefunc(repo):
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   443
        ui.status('%s %s\n' % (node.hex(chg), node.hex(obs)))
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
   444
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   445
def _obsrelsethashtreefm0(repo):
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   446
    return _obsrelsethashtree(repo, obsolete._fm0encodeonemarker)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   447
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   448
def _obsrelsethashtreefm1(repo):
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   449
    return _obsrelsethashtree(repo, obsolete._fm1encodeonemarker)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   450
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   451
def _obsrelsethashtree(repo, encodeonemarker):
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   452
    cache = []
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   453
    unfi = repo.unfiltered()
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   454
    markercache = {}
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   455
    repo.ui.progress(_("preparing locally"), 0, total=len(unfi))
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   456
    for i in unfi:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   457
        ctx = unfi[i]
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   458
        entry = 0
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   459
        sha = hashlib.sha1()
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   460
        # add data from p1
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   461
        for p in ctx.parents():
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   462
            p = p.rev()
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   463
            if p < 0:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   464
                p = node.nullid
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   465
            else:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   466
                p = cache[p][1]
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   467
            if p != node.nullid:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   468
                entry += 1
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   469
                sha.update(p)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   470
        tmarkers = repo.obsstore.relevantmarkers([ctx.node()])
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   471
        if tmarkers:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   472
            bmarkers = []
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   473
            for m in tmarkers:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   474
                if m not in markercache:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   475
                    markercache[m] = encodeonemarker(m)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   476
                bmarkers.append(markercache[m])
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   477
            bmarkers.sort()
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   478
            for m in bmarkers:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   479
                entry += 1
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   480
                sha.update(m)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   481
        if entry:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   482
            cache.append((ctx.node(), sha.digest()))
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   483
        else:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   484
            cache.append((ctx.node(), node.nullid))
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   485
        repo.ui.progress(_("preparing locally"), i, total=len(unfi))
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   486
    repo.ui.progress(_("preparing locally"), None)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   487
    return cache
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   488
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   489
def _obshash(repo, nodes, version=0):
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   490
    if version == 0:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   491
        hashs = _obsrelsethashtreefm0(repo)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   492
    elif version == 1:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   493
        hashs = _obsrelsethashtreefm1(repo)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   494
    else:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   495
        assert False
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   496
    nm = repo.changelog.nodemap
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   497
    revs = [nm.get(n) for n in nodes]
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   498
    return [r is None and node.nullid or hashs[r][1] for r in revs]
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   499
2076
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   500
@eh.addattr(localrepo.localpeer, 'evoext_obshash')
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   501
def local_obshash(peer, nodes):
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   502
    return _obshash(peer._repo, nodes)
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   503
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   504
@eh.addattr(localrepo.localpeer, 'evoext_obshash1')
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   505
def local_obshash1(peer, nodes):
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   506
    return _obshash(peer._repo, nodes, version=1)
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   507
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   508
@eh.addattr(wireproto.wirepeer, 'evoext_obshash')
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   509
def peer_obshash(self, nodes):
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   510
    d = self._call("evoext_obshash", nodes=wireproto.encodelist(nodes))
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   511
    try:
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   512
        return wireproto.decodelist(d)
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   513
    except ValueError:
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   514
        self._abort(error.ResponseError(_("unexpected response:"), d))
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   515
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   516
@eh.addattr(wireproto.wirepeer, 'evoext_obshash1')
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   517
def peer_obshash1(self, nodes):
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   518
    d = self._call("evoext_obshash1", nodes=wireproto.encodelist(nodes))
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   519
    try:
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   520
        return wireproto.decodelist(d)
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   521
    except ValueError:
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   522
        self._abort(error.ResponseError(_("unexpected response:"), d))
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
   523
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
   524
def srv_obshash(repo, proto, nodes):
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   525
    return wireproto.encodelist(_obshash(repo, wireproto.decodelist(nodes)))
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   526
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   527
def srv_obshash1(repo, proto, nodes):
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   528
    return wireproto.encodelist(_obshash(repo, wireproto.decodelist(nodes),
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   529
                                version=1))
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   530
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   531
def _obshash_capabilities(orig, repo, proto):
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   532
    """wrapper to advertise new capability"""
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   533
    caps = orig(repo, proto)
2075
a7c0685ba6d9 evolution: drop the old __temporary__.advertiseobsolete option
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2061
diff changeset
   534
    if obsolete.isenabled(repo, obsolete.exchangeopt):
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
   535
        caps = caps.split()
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   536
        caps.append('_evoext_obshash_0')
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   537
        caps.append('_evoext_obshash_1')
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   538
        caps.sort()
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   539
        caps = ' '.join(caps)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   540
    return caps
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   541
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   542
@eh.extsetup
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   543
def obshash_extsetup(ui):
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   544
    hgweb_mod.perms['evoext_obshash'] = 'pull'
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   545
    hgweb_mod.perms['evoext_obshash1'] = 'pull'
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   546
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   547
    wireproto.commands['evoext_obshash'] = (srv_obshash, 'nodes')
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   548
    wireproto.commands['evoext_obshash1'] = (srv_obshash1, 'nodes')
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   549
    extensions.wrapfunction(wireproto, 'capabilities', _obshash_capabilities)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   550
    # wrap command content
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   551
    oldcap, args = wireproto.commands['capabilities']
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   552
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   553
    def newcap(repo, proto):
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   554
        return _obshash_capabilities(oldcap, repo, proto)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2054
diff changeset
   555
    wireproto.commands['capabilities'] = (newcap, args)