hgext3rd/evolve/obsexchange.py
author Anton Shestakov <av6@dwimlabs.net>
Sat, 22 Jun 2019 18:37:21 +0800
branchstable
changeset 4698 b89495215c6e
parent 4405 8b91088944ca
child 4714 c51fc0ae7a7e
permissions -rw-r--r--
tests: demonstrate prune --pair not moving bookmark correctly After `mkcommit n2` line the bookmark is on the correct changeset, but when we prune --pair the two newly created changesets (revs 13 and 14), the bookmark gets moved to their ancestor (rev 0). Instead, it should've moved to the last of their successors (rev 12).
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
4324
e913546b9d79 configitems: move the default values to the registrar decorator
Matt Harbison <matt_harbison@yahoo.com>
parents: 4235
diff changeset
    40
eh.configitem('experimental', '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
3669
0407965ae79e compat: deal with change in the wireproto module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3576
diff changeset
    61
    gboptsmap['evo_obscommon'] = 'nodes'
0407965ae79e compat: deal with change in the wireproto module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3576
diff changeset
    62
    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
    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
4235
e30119dfd626 style: fix various flake8 warning
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3709
diff changeset
    68
    if ('obsmarkers' in kwargs
e30119dfd626 style: fix various flake8 warning
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3709
diff changeset
    69
        and 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
    70
        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
    71
        if 'common' in boundaries:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    72
            common = boundaries['common']
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:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    74
                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
    75
            if common != [node.nullid]:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    76
                kwargs['evo_obscommon'] = common
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    77
        elif 'missing' in boundaries:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    78
            missing = boundaries['missing']
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    79
            if missing:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    80
                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
    81
                          % len(missing))
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    82
            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
    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):
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    86
    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
    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')
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    91
        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
    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
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    96
            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
    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')
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
   100
            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
   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
3669
0407965ae79e compat: deal with change in the wireproto module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3576
diff changeset
   141
    gboptsmap['evo_obscommon'] = '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
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
    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
   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)
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
    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
   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
3682
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   153
    oldcap, args = wireprotov1server.commands['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)
3682
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   157
    wireprotov1server.commands['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()
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
        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
   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:
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
            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
   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)
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
    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
   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
    """
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
    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
   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:
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
        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
   195
    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
   196
        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
   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:
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   199
        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
   200
    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
   201
        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
   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
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   223
    opts = wireprotov1server.options('', ['heads', 'common'], others)
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
   224
    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
   225
        if k in ('heads', '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()
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   230
    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
   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
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   235
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
   236
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
   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):
3172
aed2cac9edc3 wireproto: avoid exposing pushkey abort for server without evolution
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3153
diff changeset
   259
    pushkey._namespaces['obsolete'] = (forbidpushkey, forbidlistkey)