hgext3rd/evolve/obsexchange.py
author Anton Shestakov <av6@dwimlabs.net>
Thu, 23 Jan 2020 17:40:52 +0700
branchmercurial-5.0
changeset 5087 5d76b320420e
parent 4814 48b30ff742cb
child 4907 0ce6510b45ab
permissions -rw-r--r--
test-compat: merge mercurial-5.1 into mercurial-5.0
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:
4405
8b91088944ca obsexchange: avoid importing io/StringIO module with a different name
Anton Shestakov <av6@dwimlabs.net>
parents: 4324
diff changeset
    11
    from StringIO import StringIO
1678
1247d87a738d py3: tolerate io/StringIO divergence
timeless@gmail.com
parents: 1677
diff changeset
    12
except ImportError:
4405
8b91088944ca obsexchange: avoid importing io/StringIO module with a different name
Anton Shestakov <av6@dwimlabs.net>
parents: 4324
diff changeset
    13
    from io import 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
    14
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
    15
from mercurial import (
2523
3629446411b3 compat: adapt to buildobsmarkerspart move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2275
diff changeset
    16
    bundle2,
3153
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
    17
    error,
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
    18
    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
    19
    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
    20
    lock as lockmod,
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
    21
    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
    22
    obsolete,
3153
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
    23
    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
    24
    util,
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
    25
)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    26
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
    27
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
    28
2041
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
    29
from . import (
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
    30
    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
    31
    utility,
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2053
diff changeset
    32
    obsdiscovery,
2041
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
    33
)
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
    34
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
    35
eh = exthelper.exthelper()
2275
fff7a678f659 extension: simplify the extensions helper hierarchy
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2117
diff changeset
    36
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
    37
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
    38
obsexcprg = utility.obsexcprg
816
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
    39
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
    40
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
    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
_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
    43
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
### 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
    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
# 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
    49
# 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
    50
# obsolete subtree.
2058
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    51
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    52
@eh.uisetup
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    53
def addgetbundleargs(self):
3682
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
    54
    try:
3709
aaa6adbbb47a compat: handle different `ui.edit` signature with Mercurial 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3708
diff changeset
    55
        from mercurial import wireprototypes
aaa6adbbb47a compat: handle different `ui.edit` signature with Mercurial 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3708
diff changeset
    56
        gboptsmap = wireprototypes.GETBUNDLE_ARGUMENTS
aaa6adbbb47a compat: handle different `ui.edit` signature with Mercurial 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3708
diff changeset
    57
    except (ImportError, AttributeError):
3682
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
    58
        # <= hg 4.5
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
    59
        from mercurial import wireproto
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
    60
        gboptsmap = wireproto.gboptsmap
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
    61
    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
    62
    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
    63
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    64
@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
    65
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
    66
    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
    67
    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
    68
    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
    69
        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
    70
        boundaries = obsdiscovery.buildpullobsmarkersboundaries(pullop)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
    71
        if b'common' in boundaries:
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
    72
            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
    73
            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
    74
                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
    75
            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
    76
                kwargs[b'evo_obscommon'] = 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
    77
        elif b'missing' in boundaries:
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
    78
            missing = boundaries[b'missing']
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    79
            if missing:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
    80
                obsexcmsg(ui, b'request obsmarkers for %d common nodes\n'
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    81
                          % len(missing))
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
    82
            kwargs[b'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
    83
    return ret
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    84
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
    85
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
    86
    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
    87
        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
    88
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    89
    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
    90
        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
    91
        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
    92
            if heads is None:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    93
                heads = repo.heads()
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    94
            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
    95
            assert obscommon
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
    96
            obsset = repo.unfiltered().set(b'::%ln - ::%ln', heads, obscommon)
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    97
            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
    98
        else:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    99
            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
   100
            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
   101
            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
   102
        markers = repo.obsstore.relevantmarkers(subset)
2523
3629446411b3 compat: adapt to buildobsmarkerspart move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2275
diff changeset
   103
        if util.safehasattr(bundle2, 'buildobsmarkerspart'):
3629446411b3 compat: adapt to buildobsmarkerspart move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2275
diff changeset
   104
            bundle2.buildobsmarkerspart(bundler, markers)
3629446411b3 compat: adapt to buildobsmarkerspart move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2275
diff changeset
   105
        else:
3629446411b3 compat: adapt to buildobsmarkerspart move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2275
diff changeset
   106
            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
   107
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   108
# 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
   109
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
   110
    """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
   111
    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
   112
    if obsolete.isenabled(repo, obsolete.exchangeopt):
3500
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3173
diff changeset
   113
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3173
diff changeset
   114
        # Compat hg 4.6+ (2f7290555c96)
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3173
diff changeset
   115
        bytesresponse = False
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3173
diff changeset
   116
        if util.safehasattr(caps, 'data'):
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3173
diff changeset
   117
            bytesresponse = True
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3173
diff changeset
   118
            caps = caps.data
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3173
diff changeset
   119
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
   120
        caps = caps.split()
3500
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3173
diff changeset
   121
        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
   122
        caps.sort()
3500
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3173
diff changeset
   123
        caps = b' '.join(caps)
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3173
diff changeset
   124
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3173
diff changeset
   125
        # Compat hg 4.6+ (2f7290555c96)
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3173
diff changeset
   126
        if bytesresponse:
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3173
diff changeset
   127
            from mercurial import wireprototypes
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3173
diff changeset
   128
            caps = wireprototypes.bytesresponse(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):
3682
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   133
    try:
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   134
        from mercurial import wireprototypes, wireprotov1server
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   135
        gboptsmap = wireprototypes.GETBUNDLE_ARGUMENTS
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   136
    except (ImportError, AttributeError):
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   137
        # <= hg 4.5
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   138
        from mercurial import wireproto
3669
0407965ae79e compat: deal with change in the wireproto module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3576
diff changeset
   139
        gboptsmap = wireproto.gboptsmap
3682
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   140
        wireprotov1server = wireproto
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
    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
   142
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
    # 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
   144
    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
   145
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
    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
   147
        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
   148
    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
   149
3682
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   150
    extensions.wrapfunction(wireprotov1server, 'capabilities',
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   151
                            _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
   152
    # 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
   153
    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
   154
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
    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
   156
        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
   157
    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
   158
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
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
   160
    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
   161
    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
   162
        lock = repo.lock()
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   163
        tr = repo.transaction(b'pushkey: obsolete 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
   164
        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
   165
        if new is not None:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   166
            obsexcmsg(repo.ui, b"%i obsolescence markers added\n" % new, True)
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
   167
        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
   168
    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
   169
        lockmod.release(tr, lock)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   170
    repo.hook(b'evolve_pushobsmarkers')
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
   171
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
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
   173
    """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
   174
    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
   175
    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
   176
    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
   177
    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
   178
    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
   179
    _pushobsmarkers(repo, data)
3682
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   180
    try:
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   181
        from mercurial import wireprototypes
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   182
        wireprototypes.pushres # force demandimport
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   183
    except (ImportError, AttributeError):
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   184
        from mercurial import wireproto as wireprototypes
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   185
    return wireprototypes.pushres(0)
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
   186
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
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
   188
    """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
   189
    """
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   190
    revset = b''
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
   191
    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
   192
    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
   193
    if heads is None:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   194
        revset = b'all()'
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
   195
    elif heads:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   196
        revset += b"(::%ln)"
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
   197
        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
   198
    else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   199
        assert False, b'pulling no heads?'
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
   200
    if 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
   201
        revset += b' - (::%ln)'
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
   202
        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
   203
    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
   204
    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
   205
    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
   206
    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
   207
        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
   208
    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
   209
    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
   210
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   211
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
   212
    """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
   213
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   214
    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
   215
    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
   216
    stream."""
3682
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   217
    try:
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   218
        from mercurial import wireprototypes, wireprotov1server
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   219
        wireprototypes.pushres # force demandimport
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   220
    except (ImportError, AttributeError):
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   221
        from mercurial import wireproto as wireprototypes
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   222
        wireprotov1server = wireprototypes
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   223
    opts = wireprotov1server.options(b'', [b'heads', b'common'], others)
4714
c51fc0ae7a7e py3: switch from iteritems() to items()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4405
diff changeset
   224
    for k, v in opts.items():
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   225
        if k in (b'heads', b'common'):
3682
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   226
            opts[k] = wireprototypes.decodelist(v)
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
   227
    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
   228
    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
   229
    obsdata = obsdata.getvalue()
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   230
    finaldata.write(b'%20i' % len(obsdata))
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
   231
    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
   232
    finaldata.seek(0)
3682
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   233
    return wireprototypes.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
   234
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   235
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
   236
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
   237
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
   238
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
   239
    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
   240
        # 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
   241
        # 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
   242
        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
   243
        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
   244
3153
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   245
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
   246
    """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
   247
    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
   248
    raise err
3153
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   249
3172
aed2cac9edc3 wireproto: avoid exposing pushkey abort for server without evolution
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3153
diff changeset
   250
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
   251
    """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
   252
    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
   253
        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
   254
        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
   255
    return {}
aed2cac9edc3 wireproto: avoid exposing pushkey abort for server without evolution
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3153
diff changeset
   256
3153
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   257
@eh.uisetup
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   258
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
   259
    pushkey._namespaces[b'obsolete'] = (forbidpushkey, forbidlistkey)