hgext3rd/evolve/obsexchange.py
author Martin von Zweigbergk <martinvonz@google.com>
Thu, 30 Apr 2020 10:05:14 -0700
changeset 5341 13376ca93fa3
parent 5212 99123c3229b4
permissions -rw-r--r--
evolve: always create commit when resolving divergence When resolving content-divergence, the final commit we create may end up empty (which means that Mercurial won't even create it). We've had code for handling that in evolve ever since 41bf6c27a122 (evolve: stabilize now handle conflicting changeset, 2012-08-23). However, that resolved the issue by marking on the divergent commits as successor. As Pierre-Yves has pointed out (in other code reviews), we should instead be creating a new successor. So that's what this patch does. It does that by setting `ui.allowemptycommit` while creating the final commit. However, that is not enough, because we may end up creating the same nodeid as already existed (we'd then end up trying to mark the "new" commit a successor of itself). To solve that, we add some salt to the commit extras. That salt affects lots of tests.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2053
f3765c4a352a exchange: rename the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2047
diff changeset
     1
# Code dedicated to the exchange of obsolescence markers
f3765c4a352a exchange: rename the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2047
diff changeset
     2
#
f3765c4a352a exchange: rename the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2047
diff changeset
     3
# Copyright 2017 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
f3765c4a352a exchange: rename the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2047
diff changeset
     4
#
f3765c4a352a exchange: rename the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2047
diff changeset
     5
# This software may be used and distributed according to the terms of the
f3765c4a352a exchange: rename the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2047
diff changeset
     6
# GNU General Public License version 2 or any later version.
1414
4198e2fad6ba evolve: add an help topic about evolution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1413
diff changeset
     7
2044
d31ad31e456b exchange: move code related to exchange into a 'evolve.exchange' submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2043
diff changeset
     8
from __future__ import absolute_import
2032
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
     9
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
    10
from mercurial import (
2523
3629446411b3 compat: adapt to buildobsmarkerspart move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2275
diff changeset
    11
    bundle2,
3153
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
    12
    error,
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
    13
    exchange,
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    14
    extensions,
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
    15
    node,
2044
d31ad31e456b exchange: move code related to exchange into a 'evolve.exchange' submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2043
diff changeset
    16
    obsolete,
3153
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
    17
    pushkey,
2044
d31ad31e456b exchange: move code related to exchange into a 'evolve.exchange' submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2043
diff changeset
    18
    util,
5180
515d425c0a05 compat: drop 4.5 related compatibility around wireprotocol module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4907
diff changeset
    19
    wireprototypes,
515d425c0a05 compat: drop 4.5 related compatibility around wireprotocol module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4907
diff changeset
    20
    wireprotov1server
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
    21
)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    22
3173
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
    23
from mercurial.hgweb import common as hgwebcommon
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
    24
2041
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
    25
from . import (
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
    26
    exthelper,
2047
ce39d0f9976d serveronly: give the sub extension a way to access to the 'evolve' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2044
diff changeset
    27
    utility,
2054
f9d65d24b9f9 discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2053
diff changeset
    28
    obsdiscovery,
2041
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
    29
)
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
    30
2044
d31ad31e456b exchange: move code related to exchange into a 'evolve.exchange' submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2043
diff changeset
    31
eh = exthelper.exthelper()
2275
fff7a678f659 extension: simplify the extensions helper hierarchy
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2117
diff changeset
    32
eh.merge(obsdiscovery.eh)
2047
ce39d0f9976d serveronly: give the sub extension a way to access to the 'evolve' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2044
diff changeset
    33
obsexcmsg = utility.obsexcmsg
816
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
    34
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
    35
eh.configitem(b'experimental', b'verbose-obsolescence-exchange', False)
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    36
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    37
_bestformat = max(obsolete.formats.keys())
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    38
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    39
#####################################################
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    40
### Support for subset specification in getbundle ###
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    41
#####################################################
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    42
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    43
# Adds support for the 'evo_obscommon' argument to getbundle This argument use
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    44
# the data recovered from the discovery to request only a subpart of the
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    45
# obsolete subtree.
2058
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    46
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    47
@eh.uisetup
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    48
def addgetbundleargs(self):
5180
515d425c0a05 compat: drop 4.5 related compatibility around wireprotocol module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4907
diff changeset
    49
    gboptsmap = wireprototypes.GETBUNDLE_ARGUMENTS
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
    50
    gboptsmap[b'evo_obscommon'] = b'nodes'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
    51
    gboptsmap[b'evo_missing_nodes'] = b'nodes'
2058
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    52
5202
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    53
ARGUMENTS_LIMIT = 200
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    54
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    55
OVERFLOW_MSG = """obsmarkers differ for %d common nodes
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    56
|
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    57
| This might be too much for the remote HTTP server that doesn't accept
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    58
| arguments through POST request. (config: experimental.httppostargs=yes)
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    59
|
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    60
| Falling back to a less efficient fetching method.
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    61
|
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    62
| More efficient fetching method is possible and will be used in the future.
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    63
"""
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    64
2058
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    65
@eh.wrapfunction(exchange, '_pullbundle2extraprepare')
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    66
def _addobscommontob2pull(orig, pullop, kwargs):
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    67
    ret = orig(pullop, kwargs)
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    68
    ui = pullop.repo.ui
4803
88472e743c64 python3: add byte prefix for objects that look like kwargs but aren't
Raphaël Gomès <rgomes@octobus.net>
parents: 4714
diff changeset
    69
    if (b'obsmarkers' in kwargs
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
    70
        and pullop.remote.capable(b'_evoext_getbundle_obscommon')):
2076
5c6d05c34ba4 obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2075
diff changeset
    71
        boundaries = obsdiscovery.buildpullobsmarkersboundaries(pullop)
5202
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    72
        use_common = True
5201
7c6d08cd1221 obsexchange: swap the 'common' and 'missing' clause
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4907
diff changeset
    73
        if b'missing' in boundaries:
5202
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    74
            use_common = False
5201
7c6d08cd1221 obsexchange: swap the 'common' and 'missing' clause
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4907
diff changeset
    75
            missing = boundaries[b'missing']
5202
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    76
            # using getattr since `limitedarguments` is missing
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    77
            # hg <= 5.0 (69921d02daaf)
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    78
            limitedarguments = getattr(pullop.remote, 'limitedarguments', False)
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    79
            if limitedarguments and len(missing) > ARGUMENTS_LIMIT:
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    80
                obsexcmsg(ui, OVERFLOW_MSG % len(missing))
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    81
                use_common = True
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    82
            else:
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    83
                if missing:
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    84
                    obsexcmsg(ui, b'request obsmarkers for %d common nodes\n'
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    85
                              % len(missing))
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    86
                kwargs[b'evo_missing_nodes'] = missing
c0b8804066dc obsexchange: fallback to simpler request for dumb http server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5201
diff changeset
    87
        if use_common and b'common' in boundaries:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
    88
            common = boundaries[b'common']
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    89
            if common != pullop.common:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
    90
                obsexcmsg(ui, b'request obsmarkers for some common nodes\n')
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
    91
            if common != [node.nullid]:
4803
88472e743c64 python3: add byte prefix for objects that look like kwargs but aren't
Raphaël Gomès <rgomes@octobus.net>
parents: 4714
diff changeset
    92
                kwargs[b'evo_obscommon'] = common
2058
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    93
    return ret
92c2a54f98ee exchange: split between modern and legacy code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2057
diff changeset
    94
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    95
def _getbundleobsmarkerpart(orig, bundler, repo, source, **kwargs):
4804
079dbf36e884 python3: add raw prefix in cases harder to analyze at the token level
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
    96
    if not (set([r'evo_obscommon', r'evo_missing_nodes']) & set(kwargs)):
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    97
        return orig(bundler, repo, source, **kwargs)
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    98
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
    99
    if kwargs.get('obsmarkers', False):
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
   100
        heads = kwargs.get('heads')
4804
079dbf36e884 python3: add raw prefix in cases harder to analyze at the token level
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   101
        if r'evo_obscommon' in kwargs:
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
   102
            if heads is None:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
   103
                heads = repo.heads()
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
   104
            obscommon = kwargs.get('evo_obscommon', ())
5205
240efc3ab4dd exchange: deal with empty obscommon
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5202
diff changeset
   105
            if obscommon:
240efc3ab4dd exchange: deal with empty obscommon
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5202
diff changeset
   106
                obsset = repo.unfiltered().set(b'::%ln - ::%ln', heads, obscommon)
240efc3ab4dd exchange: deal with empty obscommon
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5202
diff changeset
   107
            else:
240efc3ab4dd exchange: deal with empty obscommon
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5202
diff changeset
   108
                obsset = repo.unfiltered().set(b'::%ln', heads)
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
   109
            subset = [c.node() for c in obsset]
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
   110
        else:
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
   111
            common = kwargs.get('common')
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   112
            subset = [c.node() for c in repo.unfiltered().set(b'only(%ln, %ln)', heads, common)]
2084
b1f029dcf573 discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2079
diff changeset
   113
            subset += kwargs['evo_missing_nodes']
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   114
        markers = repo.obsstore.relevantmarkers(subset)
2523
3629446411b3 compat: adapt to buildobsmarkerspart move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2275
diff changeset
   115
        if util.safehasattr(bundle2, 'buildobsmarkerspart'):
3629446411b3 compat: adapt to buildobsmarkerspart move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2275
diff changeset
   116
            bundle2.buildobsmarkerspart(bundler, markers)
3629446411b3 compat: adapt to buildobsmarkerspart move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2275
diff changeset
   117
        else:
3629446411b3 compat: adapt to buildobsmarkerspart move
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2275
diff changeset
   118
            exchange.buildobsmarkerspart(bundler, markers)
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   119
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   120
# manual wrap up in extsetup because of the wireproto.commands mapping
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   121
def _obscommon_capabilities(orig, repo, proto):
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   122
    """wrapper to advertise new capability"""
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   123
    caps = orig(repo, proto)
2075
a7c0685ba6d9 evolution: drop the old __temporary__.advertiseobsolete option
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2063
diff changeset
   124
    if obsolete.isenabled(repo, obsolete.exchangeopt):
5180
515d425c0a05 compat: drop 4.5 related compatibility around wireprotocol module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4907
diff changeset
   125
        caps = caps.data.split()
3500
a43fdbd6f7eb wireproto: fix *_capabilities for change of API types
Boris Feld <boris.feld@octobus.net>
parents: 3173
diff changeset
   126
        caps.append(b'_evoext_getbundle_obscommon')
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   127
        caps.sort()
5180
515d425c0a05 compat: drop 4.5 related compatibility around wireprotocol module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4907
diff changeset
   128
        caps = wireprototypes.bytesresponse(b' '.join(caps))
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   129
    return caps
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   130
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   131
@eh.extsetup
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   132
def extsetup_obscommon(ui):
5180
515d425c0a05 compat: drop 4.5 related compatibility around wireprotocol module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4907
diff changeset
   133
    gboptsmap = wireprototypes.GETBUNDLE_ARGUMENTS
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   134
    gboptsmap[b'evo_obscommon'] = b'nodes'
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   135
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   136
    # wrap module content
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   137
    origfunc = exchange.getbundle2partsmapping[b'obsmarkers']
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   138
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   139
    def newfunc(*args, **kwargs):
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   140
        return _getbundleobsmarkerpart(origfunc, *args, **kwargs)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   141
    exchange.getbundle2partsmapping[b'obsmarkers'] = newfunc
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   142
3682
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   143
    extensions.wrapfunction(wireprotov1server, 'capabilities',
72f61b9cb8e9 evolve: add support for hg >= b4d85bc1
Martin von Zweigbergk <martinvonz@google.com>
parents: 3677
diff changeset
   144
                            _obscommon_capabilities)
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   145
    # wrap command content
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   146
    oldcap, args = wireprotov1server.commands[b'capabilities']
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   147
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   148
    def newcap(repo, proto):
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   149
        return _obscommon_capabilities(oldcap, repo, proto)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   150
    wireprotov1server.commands[b'capabilities'] = (newcap, args)
2061
302aa8bbb3af exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2059
diff changeset
   151
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   152
abortmsg = b"won't exchange obsmarkers through pushkey"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   153
hint = b"upgrade your client or server to use the bundle2 protocol"
3153
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   154
3173
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
   155
class HTTPCompatibleAbort(hgwebcommon.ErrorResponse, error.Abort):
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
   156
    def __init__(self, message, code, hint=None):
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
   157
        # initialisation of each class is a bit messy.
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
   158
        # We explicitly do the dispatch
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
   159
        hgwebcommon.ErrorResponse.__init__(self, 410, message)
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
   160
        error.Abort.__init__(self, message, hint=hint)
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
   161
3153
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   162
def forbidpushkey(repo=None, key=None, old=None, new=None):
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   163
    """prevent exchange through pushkey"""
3173
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
   164
    err = HTTPCompatibleAbort(abortmsg, 410, hint=hint)
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
   165
    raise err
3153
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   166
3172
aed2cac9edc3 wireproto: avoid exposing pushkey abort for server without evolution
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3153
diff changeset
   167
def forbidlistkey(repo=None, key=None, old=None, new=None):
aed2cac9edc3 wireproto: avoid exposing pushkey abort for server without evolution
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3153
diff changeset
   168
    """prevent exchange through pushkey"""
aed2cac9edc3 wireproto: avoid exposing pushkey abort for server without evolution
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3153
diff changeset
   169
    if obsolete.isenabled(repo, obsolete.exchangeopt):
3173
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
   170
        err = HTTPCompatibleAbort(abortmsg, 410, hint=hint)
3afe20410b55 wireproto: gracefully fail on http when trying to use older pushkey method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3172
diff changeset
   171
        raise err
3172
aed2cac9edc3 wireproto: avoid exposing pushkey abort for server without evolution
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3153
diff changeset
   172
    return {}
aed2cac9edc3 wireproto: avoid exposing pushkey abort for server without evolution
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3153
diff changeset
   173
3153
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   174
@eh.uisetup
544354cfc626 pushkey: forbid usage of pushley to exchange markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3149
diff changeset
   175
def setuppushkeyforbidding(ui):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   176
    pushkey._namespaces[b'obsolete'] = (forbidpushkey, forbidlistkey)