hgext3rd/evolve/obsexchange.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Sat, 25 Nov 2017 18:53:23 -0500
changeset 3266 bc173e7f3b6f
parent 3173 3afe20410b55
child 3500 a43fdbd6f7eb
permissions -rw-r--r--
stablesort: simplify processing of non-merge changesets As long as a changeset as only one parent, the next element in the sort (starting from the head) has to be that parent. We detect and take advantage of that shortcut in the non-merge case.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2053
f3765c4a352a exchange: rename the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2047
diff changeset
     1
# Code dedicated to the exchange of obsolescence markers
f3765c4a352a exchange: rename the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2047
diff changeset
     2
#
f3765c4a352a exchange: rename the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2047
diff changeset
     3
# Copyright 2017 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
f3765c4a352a exchange: rename the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2047
diff changeset
     4
#
f3765c4a352a exchange: rename the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2047
diff changeset
     5
# This software may be used and distributed according to the terms of the
f3765c4a352a exchange: rename the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2047
diff changeset
     6
# GNU General Public License version 2 or any later version.
1414
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
     7
2044
d31ad31e456b exchange: move code related to exchange into a 'evolve.exchange' submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2043
diff changeset
     8
from __future__ import absolute_import
2032
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
     9
1678
1247d87a738d py3: tolerate io/StringIO divergence
timeless@gmail.com
parents: 1677
diff changeset
    10
try:
1247d87a738d py3: tolerate io/StringIO divergence
timeless@gmail.com
parents: 1677
diff changeset
    11
    import StringIO as io
1247d87a738d py3: tolerate io/StringIO divergence
timeless@gmail.com
parents: 1677
diff changeset
    12
    StringIO = io.StringIO
1247d87a738d py3: tolerate io/StringIO divergence
timeless@gmail.com
parents: 1677
diff changeset
    13
except ImportError:
1247d87a738d py3: tolerate io/StringIO divergence
timeless@gmail.com
parents: 1677
diff changeset
    14
    import io
1247d87a738d py3: tolerate io/StringIO divergence
timeless@gmail.com
parents: 1677
diff changeset
    15
    StringIO = io.StringIO
2032
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
    16
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
    17
from mercurial import (
2523
3629446411b3 compat: adapt to buildobsmarkerspart move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2275
diff changeset
    18
    bundle2,
3153
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
    19
    error,
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
    20
    exchange,
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    21
    extensions,
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    22
    lock as lockmod,
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
    23
    node,
2044
d31ad31e456b exchange: move code related to exchange into a 'evolve.exchange' submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2043
diff changeset
    24
    obsolete,
3153
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
    25
    pushkey,
2044
d31ad31e456b exchange: move code related to exchange into a 'evolve.exchange' submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2043
diff changeset
    26
    util,
d31ad31e456b exchange: move code related to exchange into a 'evolve.exchange' submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2043
diff changeset
    27
    wireproto,
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
    28
)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    29
3173
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
    30
from mercurial.hgweb import common as hgwebcommon
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
    31
2041
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
    32
from . import (
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
    33
    exthelper,
2047
ce39d0f9976d serveronly: give the sub extension a way to access to the 'evolve' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2044
diff changeset
    34
    utility,
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2053
diff changeset
    35
    obsdiscovery,
2041
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
    36
)
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
    37
2044
d31ad31e456b exchange: move code related to exchange into a 'evolve.exchange' submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2043
diff changeset
    38
eh = exthelper.exthelper()
2275
fff7a678f659 extension: simplify the extensions helper hierarchy
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2117
diff changeset
    39
eh.merge(obsdiscovery.eh)
2047
ce39d0f9976d serveronly: give the sub extension a way to access to the 'evolve' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2044
diff changeset
    40
obsexcmsg = utility.obsexcmsg
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2053
diff changeset
    41
obsexcprg = utility.obsexcprg
816
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
    42
3080
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 2523
diff changeset
    43
eh.configitem('experimental', 'verbose-obsolescence-exchange')
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    44
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    45
_bestformat = max(obsolete.formats.keys())
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    46
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    47
#####################################################
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    48
### Support for subset specification in getbundle ###
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    49
#####################################################
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    50
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    51
# Adds support for the 'evo_obscommon' argument to getbundle This argument use
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    52
# the data recovered from the discovery to request only a subpart of the
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    53
# obsolete subtree.
2058
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    54
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    55
@eh.uisetup
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    56
def addgetbundleargs(self):
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    57
    wireproto.gboptsmap['evo_obscommon'] = 'nodes'
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    58
    wireproto.gboptsmap['evo_missing_nodes'] = 'nodes'
2058
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    59
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    60
@eh.wrapfunction(exchange, '_pullbundle2extraprepare')
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    61
def _addobscommontob2pull(orig, pullop, kwargs):
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    62
    ret = orig(pullop, kwargs)
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    63
    ui = pullop.repo.ui
2058
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    64
    if ('obsmarkers' in kwargs and
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    65
        pullop.remote.capable('_evoext_getbundle_obscommon')):
2076
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    66
        boundaries = obsdiscovery.buildpullobsmarkersboundaries(pullop)
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    67
        if 'common' in boundaries:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    68
            common = boundaries['common']
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    69
            if common != pullop.common:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    70
                obsexcmsg(ui, 'request obsmarkers for some common nodes\n')
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    71
            if common != [node.nullid]:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    72
                kwargs['evo_obscommon'] = common
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    73
        elif 'missing' in boundaries:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    74
            missing = boundaries['missing']
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    75
            if missing:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    76
                obsexcmsg(ui, 'request obsmarkers for %d common nodes\n'
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    77
                          % len(missing))
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    78
            kwargs['evo_missing_nodes'] = missing
2058
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    79
    return ret
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    80
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    81
def _getbundleobsmarkerpart(orig, bundler, repo, source, **kwargs):
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    82
    if not (set(['evo_obscommon', 'evo_missing_nodes']) & set(kwargs)):
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    83
        return orig(bundler, repo, source, **kwargs)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    84
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    85
    if kwargs.get('obsmarkers', False):
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    86
        heads = kwargs.get('heads')
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    87
        if 'evo_obscommon' in kwargs:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    88
            if heads is None:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    89
                heads = repo.heads()
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    90
            obscommon = kwargs.get('evo_obscommon', ())
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    91
            assert obscommon
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    92
            obsset = repo.unfiltered().set('::%ln - ::%ln', heads, obscommon)
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    93
            subset = [c.node() for c in obsset]
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    94
        else:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    95
            common = kwargs.get('common')
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    96
            subset = [c.node() for c in repo.unfiltered().set('only(%ln, %ln)', heads, common)]
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    97
            subset += kwargs['evo_missing_nodes']
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    98
        markers = repo.obsstore.relevantmarkers(subset)
2523
3629446411b3 compat: adapt to buildobsmarkerspart move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2275
diff changeset
    99
        if util.safehasattr(bundle2, 'buildobsmarkerspart'):
3629446411b3 compat: adapt to buildobsmarkerspart move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2275
diff changeset
   100
            bundle2.buildobsmarkerspart(bundler, markers)
3629446411b3 compat: adapt to buildobsmarkerspart move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2275
diff changeset
   101
        else:
3629446411b3 compat: adapt to buildobsmarkerspart move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2275
diff changeset
   102
            exchange.buildobsmarkerspart(bundler, markers)
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   103
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   104
# manual wrap up in extsetup because of the wireproto.commands mapping
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   105
def _obscommon_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: 2059
diff changeset
   106
    """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: 2059
diff changeset
   107
    caps = orig(repo, proto)
2075
a7c0685ba6d9 evolution: drop the old __temporary__.advertiseobsolete option
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2063
diff changeset
   108
    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: 2059
diff changeset
   109
        caps = caps.split()
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   110
        caps.append('_evoext_getbundle_obscommon')
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   111
        caps.sort()
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   112
        caps = ' '.join(caps)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   113
    return caps
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   114
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   115
@eh.extsetup
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   116
def extsetup_obscommon(ui):
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   117
    wireproto.gboptsmap['evo_obscommon'] = 'nodes'
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   118
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   119
    # wrap module content
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   120
    origfunc = exchange.getbundle2partsmapping['obsmarkers']
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   121
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   122
    def newfunc(*args, **kwargs):
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   123
        return _getbundleobsmarkerpart(origfunc, *args, **kwargs)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   124
    exchange.getbundle2partsmapping['obsmarkers'] = newfunc
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   125
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   126
    extensions.wrapfunction(wireproto, 'capabilities', _obscommon_capabilities)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   127
    # wrap command content
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   128
    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: 2059
diff changeset
   129
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   130
    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: 2059
diff changeset
   131
        return _obscommon_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: 2059
diff changeset
   132
    wireproto.commands['capabilities'] = (newcap, args)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   133
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   134
def _pushobsmarkers(repo, data):
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   135
    tr = lock = None
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   136
    try:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   137
        lock = repo.lock()
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   138
        tr = repo.transaction('pushkey: obsolete markers')
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   139
        new = repo.obsstore.mergemarkers(tr, data)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   140
        if new is not None:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   141
            obsexcmsg(repo.ui, "%i obsolescence markers added\n" % new, True)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   142
        tr.close()
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   143
    finally:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   144
        lockmod.release(tr, lock)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   145
    repo.hook('evolve_pushobsmarkers')
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   146
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   147
def srv_pushobsmarkers(repo, proto):
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   148
    """wireprotocol command"""
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   149
    fp = StringIO()
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   150
    proto.redirect()
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   151
    proto.getfile(fp)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   152
    data = fp.getvalue()
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   153
    fp.close()
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   154
    _pushobsmarkers(repo, data)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   155
    return wireproto.pushres(0)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   156
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   157
def _getobsmarkersstream(repo, heads=None, common=None):
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   158
    """Get a binary stream for all markers relevant to `::<heads> - ::<common>`
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   159
    """
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   160
    revset = ''
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   161
    args = []
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   162
    repo = repo.unfiltered()
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   163
    if heads is None:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   164
        revset = 'all()'
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   165
    elif heads:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   166
        revset += "(::%ln)"
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   167
        args.append(heads)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   168
    else:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   169
        assert False, 'pulling no heads?'
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   170
    if common:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   171
        revset += ' - (::%ln)'
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   172
        args.append(common)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   173
    nodes = [c.node() for c in repo.set(revset, *args)]
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   174
    markers = repo.obsstore.relevantmarkers(nodes)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   175
    obsdata = StringIO()
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   176
    for chunk in obsolete.encodemarkers(markers, True):
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   177
        obsdata.write(chunk)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   178
    obsdata.seek(0)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   179
    return obsdata
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   180
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   181
def srv_pullobsmarkers(repo, proto, others):
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   182
    """serves a binary stream of markers.
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   183
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   184
    Serves relevant to changeset between heads and common. The stream is prefix
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   185
    by a -string- representation of an integer. This integer is the size of the
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   186
    stream."""
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   187
    opts = wireproto.options('', ['heads', 'common'], others)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   188
    for k, v in opts.iteritems():
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   189
        if k in ('heads', 'common'):
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   190
            opts[k] = wireproto.decodelist(v)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   191
    obsdata = _getobsmarkersstream(repo, **opts)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   192
    finaldata = StringIO()
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   193
    obsdata = obsdata.getvalue()
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   194
    finaldata.write('%20i' % len(obsdata))
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   195
    finaldata.write(obsdata)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   196
    finaldata.seek(0)
3148
0ed75e700ad8 compat: drop compatibility for 'streamres' prior to 4.1
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3080
diff changeset
   197
    return wireproto.streamres(reader=finaldata, v1compressible=True)
3153
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   198
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   199
abortmsg = "won't exchange obsmarkers through pushkey"
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   200
hint = "upgrade your client or server to use the bundle2 protocol"
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   201
3173
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
   202
class HTTPCompatibleAbort(hgwebcommon.ErrorResponse, error.Abort):
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
   203
    def __init__(self, message, code, hint=None):
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
   204
        # initialisation of each class is a bit messy.
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
   205
        # We explicitly do the dispatch
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
   206
        hgwebcommon.ErrorResponse.__init__(self, 410, message)
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
   207
        error.Abort.__init__(self, message, hint=hint)
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
   208
3153
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   209
def forbidpushkey(repo=None, key=None, old=None, new=None):
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   210
    """prevent exchange through pushkey"""
3173
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
   211
    err = HTTPCompatibleAbort(abortmsg, 410, hint=hint)
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
   212
    raise err
3153
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   213
3172
aed2cac9edc3 wireproto: avoid exposing pushkey abort for server without evolution
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3153
diff changeset
   214
def forbidlistkey(repo=None, key=None, old=None, new=None):
aed2cac9edc3 wireproto: avoid exposing pushkey abort for server without evolution
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3153
diff changeset
   215
    """prevent exchange through pushkey"""
aed2cac9edc3 wireproto: avoid exposing pushkey abort for server without evolution
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3153
diff changeset
   216
    if obsolete.isenabled(repo, obsolete.exchangeopt):
3173
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
   217
        err = HTTPCompatibleAbort(abortmsg, 410, hint=hint)
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
   218
        raise err
3172
aed2cac9edc3 wireproto: avoid exposing pushkey abort for server without evolution
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3153
diff changeset
   219
    return {}
aed2cac9edc3 wireproto: avoid exposing pushkey abort for server without evolution
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3153
diff changeset
   220
3153
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   221
@eh.uisetup
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   222
def setuppushkeyforbidding(ui):
3172
aed2cac9edc3 wireproto: avoid exposing pushkey abort for server without evolution
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3153
diff changeset
   223
    pushkey._namespaces['obsolete'] = (forbidpushkey, forbidlistkey)