hgext3rd/evolve/obsexchange.py
author Anton Shestakov <av6@dwimlabs.net>
Fri, 08 May 2020 19:49:07 +0800
branchmercurial-5.3
changeset 5361 51b8024878e9
parent 5212 99123c3229b4
permissions -rw-r--r--
test-compat: back out changeset 591a0afd2ef3
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
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
    10
from mercurial import (
2523
3629446411b3 compat: adapt to buildobsmarkerspart move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2275
diff changeset
    11
    bundle2,
3153
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
    12
    error,
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
    13
    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
    14
    extensions,
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
    15
    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
    16
    obsolete,
3153
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
    17
    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
    18
    util,
5180
515d425c0a05 compat: drop 4.5 related compatibility around wireprotocol module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4907
diff changeset
    19
    wireprototypes,
515d425c0a05 compat: drop 4.5 related compatibility around wireprotocol module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4907
diff changeset
    20
    wireprotov1server
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
    21
)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    22
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
    23
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
    24
2041
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
    25
from . import (
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
    26
    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
    27
    utility,
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2053
diff changeset
    28
    obsdiscovery,
2041
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
    29
)
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
    30
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
    31
eh = exthelper.exthelper()
2275
fff7a678f659 extension: simplify the extensions helper hierarchy
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2117
diff changeset
    32
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
    33
obsexcmsg = utility.obsexcmsg
816
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
    34
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
    35
eh.configitem(b'experimental', b'verbose-obsolescence-exchange', False)
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
    36
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    37
_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
    38
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    39
#####################################################
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    40
### 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
    41
#####################################################
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    42
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    43
# 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
    44
# 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
    45
# obsolete subtree.
2058
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    46
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    47
@eh.uisetup
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    48
def addgetbundleargs(self):
5180
515d425c0a05 compat: drop 4.5 related compatibility around wireprotocol module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4907
diff changeset
    49
    gboptsmap = wireprototypes.GETBUNDLE_ARGUMENTS
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
    50
    gboptsmap[b'evo_obscommon'] = b'nodes'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
    51
    gboptsmap[b'evo_missing_nodes'] = b'nodes'
2058
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    52
5202
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    53
ARGUMENTS_LIMIT = 200
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    54
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    55
OVERFLOW_MSG = """obsmarkers differ for %d common nodes
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    56
|
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    57
| This might be too much for the remote HTTP server that doesn't accept
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    58
| arguments through POST request. (config: experimental.httppostargs=yes)
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    59
|
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    60
| Falling back to a less efficient fetching method.
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    61
|
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    62
| More efficient fetching method is possible and will be used in the future.
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    63
"""
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    64
2058
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    65
@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
    66
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
    67
    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
    68
    ui = pullop.repo.ui
4803
88472e743c64 python3: add byte prefix for objects that look like kwargs but aren't
Raphaël Gomès <rgomes@octobus.net>
parents: 4714
diff changeset
    69
    if (b'obsmarkers' in kwargs
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
    70
        and pullop.remote.capable(b'_evoext_getbundle_obscommon')):
2076
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    71
        boundaries = obsdiscovery.buildpullobsmarkersboundaries(pullop)
5202
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    72
        use_common = True
5201
7c6d08cd1221 obsexchange: swap the 'common' and 'missing' clause
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4907
diff changeset
    73
        if b'missing' in boundaries:
5202
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    74
            use_common = False
5201
7c6d08cd1221 obsexchange: swap the 'common' and 'missing' clause
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4907
diff changeset
    75
            missing = boundaries[b'missing']
5202
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    76
            # using getattr since `limitedarguments` is missing
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    77
            # hg <= 5.0 (69921d02daaf)
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    78
            limitedarguments = getattr(pullop.remote, 'limitedarguments', False)
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    79
            if limitedarguments and len(missing) > ARGUMENTS_LIMIT:
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    80
                obsexcmsg(ui, OVERFLOW_MSG % len(missing))
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    81
                use_common = True
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    82
            else:
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    83
                if missing:
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    84
                    obsexcmsg(ui, b'request obsmarkers for %d common nodes\n'
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    85
                              % len(missing))
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    86
                kwargs[b'evo_missing_nodes'] = missing
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    87
        if use_common and b'common' in boundaries:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
    88
            common = boundaries[b'common']
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    89
            if common != pullop.common:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
    90
                obsexcmsg(ui, b'request obsmarkers for some common nodes\n')
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    91
            if common != [node.nullid]:
4803
88472e743c64 python3: add byte prefix for objects that look like kwargs but aren't
Raphaël Gomès <rgomes@octobus.net>
parents: 4714
diff changeset
    92
                kwargs[b'evo_obscommon'] = common
2058
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    93
    return ret
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    94
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
    95
def _getbundleobsmarkerpart(orig, bundler, repo, source, **kwargs):
4804
079dbf36e884 python3: add raw prefix in cases harder to analyze at the token level
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
    96
    if not (set([r'evo_obscommon', r'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
    97
        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
    98
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    99
    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
   100
        heads = kwargs.get('heads')
4804
079dbf36e884 python3: add raw prefix in cases harder to analyze at the token level
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   101
        if r'evo_obscommon' in kwargs:
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
   102
            if heads is None:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
   103
                heads = repo.heads()
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
   104
            obscommon = kwargs.get('evo_obscommon', ())
5205
240efc3ab4dd exchange: deal with empty obscommon
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5202
diff changeset
   105
            if obscommon:
240efc3ab4dd exchange: deal with empty obscommon
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5202
diff changeset
   106
                obsset = repo.unfiltered().set(b'::%ln - ::%ln', heads, obscommon)
240efc3ab4dd exchange: deal with empty obscommon
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5202
diff changeset
   107
            else:
240efc3ab4dd exchange: deal with empty obscommon
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5202
diff changeset
   108
                obsset = repo.unfiltered().set(b'::%ln', heads)
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
   109
            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
   110
        else:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
   111
            common = kwargs.get('common')
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   112
            subset = [c.node() for c in repo.unfiltered().set(b'only(%ln, %ln)', heads, common)]
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
   113
            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
   114
        markers = repo.obsstore.relevantmarkers(subset)
2523
3629446411b3 compat: adapt to buildobsmarkerspart move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2275
diff changeset
   115
        if util.safehasattr(bundle2, 'buildobsmarkerspart'):
3629446411b3 compat: adapt to buildobsmarkerspart move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2275
diff changeset
   116
            bundle2.buildobsmarkerspart(bundler, markers)
3629446411b3 compat: adapt to buildobsmarkerspart move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2275
diff changeset
   117
        else:
3629446411b3 compat: adapt to buildobsmarkerspart move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2275
diff changeset
   118
            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
   119
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
# 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
   121
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
   122
    """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
   123
    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
   124
    if obsolete.isenabled(repo, obsolete.exchangeopt):
5180
515d425c0a05 compat: drop 4.5 related compatibility around wireprotocol module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4907
diff changeset
   125
        caps = caps.data.split()
3500
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3173
diff changeset
   126
        caps.append(b'_evoext_getbundle_obscommon')
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
   127
        caps.sort()
5180
515d425c0a05 compat: drop 4.5 related compatibility around wireprotocol module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4907
diff changeset
   128
        caps = wireprototypes.bytesresponse(b' '.join(caps))
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
   129
    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
   130
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
@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
   132
def extsetup_obscommon(ui):
5180
515d425c0a05 compat: drop 4.5 related compatibility around wireprotocol module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4907
diff changeset
   133
    gboptsmap = wireprototypes.GETBUNDLE_ARGUMENTS
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   134
    gboptsmap[b'evo_obscommon'] = b'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
   135
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
    # wrap module content
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   137
    origfunc = exchange.getbundle2partsmapping[b'obsmarkers']
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
   138
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
    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
   140
        return _getbundleobsmarkerpart(origfunc, *args, **kwargs)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   141
    exchange.getbundle2partsmapping[b'obsmarkers'] = newfunc
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
   142
3682
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   143
    extensions.wrapfunction(wireprotov1server, 'capabilities',
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   144
                            _obscommon_capabilities)
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
   145
    # wrap command content
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   146
    oldcap, args = wireprotov1server.commands[b'capabilities']
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
   147
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
    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
   149
        return _obscommon_capabilities(oldcap, repo, proto)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   150
    wireprotov1server.commands[b'capabilities'] = (newcap, args)
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
   151
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   152
abortmsg = b"won't exchange obsmarkers through pushkey"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   153
hint = b"upgrade your client or server to use the bundle2 protocol"
3153
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   154
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
   155
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
   156
    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
   157
        # 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
   158
        # 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
   159
        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
   160
        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
   161
3153
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   162
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
   163
    """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
   164
    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
   165
    raise err
3153
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   166
3172
aed2cac9edc3 wireproto: avoid exposing pushkey abort for server without evolution
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3153
diff changeset
   167
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
   168
    """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
   169
    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
   170
        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
   171
        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
   172
    return {}
aed2cac9edc3 wireproto: avoid exposing pushkey abort for server without evolution
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3153
diff changeset
   173
3153
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   174
@eh.uisetup
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   175
def setuppushkeyforbidding(ui):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   176
    pushkey._namespaces[b'obsolete'] = (forbidpushkey, forbidlistkey)