hgext/simple4server.py
author Pierre-Yves David <pierre-yves.david@fb.com>
Tue, 11 Nov 2014 15:48:02 +0000
changeset 1158 0f6c97421cd9
parent 1097 580a2d838996
child 1215 004e21b8d67b
child 1245 580a8f5ea462
permissions -rw-r--r--
merge stable into default
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
660
e6e47c432ffd hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     1
'''enable experimental obsolescence feature of Mercurial
e6e47c432ffd hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     2
e6e47c432ffd hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     3
OBSOLESCENCE IS AN EXPERIMENTAL FEATURE MAKE SURE YOU UNDERSTOOD THE INVOLVED
e6e47c432ffd hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     4
CONCEPT BEFORE USING IT.
e6e47c432ffd hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     5
e6e47c432ffd hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     6
/!\ THIS EXTENSION IS INTENDED FOR SERVER SIDE ONLY USAGE /!\
e6e47c432ffd hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     7
e6e47c432ffd hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     8
For client side usages it is recommended to use the evolve extension for
e6e47c432ffd hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     9
improved user interface.'''
e6e47c432ffd hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    10
963
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
    11
testedwith = '3.0.1'
873
c758717ff3c7 evolve: add 2.9.1 compatibility seal to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 872
diff changeset
    12
buglink = 'https://bitbucket.org/marmoute/mutable-history/issues'
c758717ff3c7 evolve: add 2.9.1 compatibility seal to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 872
diff changeset
    13
660
e6e47c432ffd hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    14
import mercurial.obsolete
e6e47c432ffd hgext: add a simpler extension to enable obsolete on server
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    15
mercurial.obsolete._enabled = True
822
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
    16
852
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    17
import struct
872
2a2db401a55b simple4server: fix a missing import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 869
diff changeset
    18
from mercurial import util
822
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
    19
from mercurial import wireproto
852
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    20
from mercurial import extensions
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    21
from mercurial import obsolete
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    22
from cStringIO import StringIO
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    23
from mercurial import node
869
e9eeef0d07ec exchange: enforce permission on new wireprotocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 866
diff changeset
    24
from mercurial.hgweb import hgweb_mod
963
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
    25
from mercurial import bundle2
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
    26
from mercurial import localrepo
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
    27
from mercurial import exchange
852
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    28
_pack = struct.pack
822
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
    29
963
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
    30
gboptslist = gboptsmap = None
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
    31
try:
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
    32
    from mercurial import obsolete
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
    33
    if not obsolete._enabled:
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
    34
        obsolete._enabled = True
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
    35
    from mercurial import wireproto
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
    36
    gboptslist = getattr(wireproto, 'gboptslist', None)
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
    37
    gboptsmap = getattr(wireproto, 'gboptsmap', None)
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
    38
except (ImportError, AttributeError):
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
    39
    raise util.Abort('Your Mercurial is too old for this version of Evolve\n'
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
    40
                     'requires version 3.0.1 or above')
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
    41
882
48804a8d7472 simple4server: option to advertise obsolescence support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 878
diff changeset
    42
# Start of simple4server specific content
48804a8d7472 simple4server: option to advertise obsolescence support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 878
diff changeset
    43
48804a8d7472 simple4server: option to advertise obsolescence support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 878
diff changeset
    44
from mercurial import pushkey
48804a8d7472 simple4server: option to advertise obsolescence support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 878
diff changeset
    45
48804a8d7472 simple4server: option to advertise obsolescence support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 878
diff changeset
    46
# specific content also include the wrapping int extsetup
48804a8d7472 simple4server: option to advertise obsolescence support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 878
diff changeset
    47
def _nslist(orig, repo):
48804a8d7472 simple4server: option to advertise obsolescence support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 878
diff changeset
    48
    rep = orig(repo)
48804a8d7472 simple4server: option to advertise obsolescence support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 878
diff changeset
    49
    if not repo.ui.configbool('__temporary__', 'advertiseobsolete', True):
48804a8d7472 simple4server: option to advertise obsolescence support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 878
diff changeset
    50
        rep.pop('obsolete')
48804a8d7472 simple4server: option to advertise obsolescence support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 878
diff changeset
    51
    return rep
48804a8d7472 simple4server: option to advertise obsolescence support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 878
diff changeset
    52
48804a8d7472 simple4server: option to advertise obsolescence support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 878
diff changeset
    53
# End of simple4server specific content
48804a8d7472 simple4server: option to advertise obsolescence support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 878
diff changeset
    54
48804a8d7472 simple4server: option to advertise obsolescence support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 878
diff changeset
    55
48804a8d7472 simple4server: option to advertise obsolescence support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 878
diff changeset
    56
874
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
    57
# from evolve extension: 1a23c7c52a43
822
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
    58
def srv_pushobsmarkers(repo, proto):
874
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
    59
    """That receives a stream of markers and apply then to the repo"""
822
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
    60
    fp = StringIO()
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
    61
    proto.redirect()
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
    62
    proto.getfile(fp)
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
    63
    data = fp.getvalue()
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
    64
    fp.close()
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
    65
    lock = repo.lock()
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
    66
    try:
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
    67
        tr = repo.transaction('pushkey: obsolete markers')
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
    68
        try:
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
    69
            repo.obsstore.mergemarkers(tr, data)
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
    70
            tr.close()
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
    71
        finally:
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
    72
            tr.release()
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
    73
    finally:
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
    74
        lock.release()
888
097ddcb0da25 evolve: add a hook related to the new pushobsmarkers command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 884
diff changeset
    75
    repo.hook('evolve_pushobsmarkers')
822
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
    76
    return wireproto.pushres(0)
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
    77
874
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
    78
# from evolve extension: 1a23c7c52a43
852
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    79
def _getobsmarkersstream(repo, heads=None, common=None):
874
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
    80
    """Get a binary stream for all markers relevant to `::<heads> - ::<common>`
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
    81
    """
852
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    82
    revset = ''
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    83
    args = []
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    84
    repo = repo.unfiltered()
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    85
    if heads is None:
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    86
        revset = 'all()'
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    87
    elif heads:
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    88
        revset += "(::%ln)"
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    89
        args.append(heads)
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    90
    else:
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    91
        assert False, 'pulling no heads?'
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    92
    if common:
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    93
        revset += ' - (::%ln)'
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    94
        args.append(common)
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    95
    nodes = [c.node() for c in repo.set(revset, *args)]
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    96
    markers = repo.obsstore.relevantmarkers(nodes)
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    97
    obsdata = StringIO()
1091
236a8e81551e compat: use in-core encodemarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1090
diff changeset
    98
    for chunk in obsolete.encodemarkers(markers, True):
236a8e81551e compat: use in-core encodemarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1090
diff changeset
    99
        obsdata.write(chunk)
852
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
   100
    obsdata.seek(0)
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
   101
    return obsdata
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
   102
1067
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   103
if not util.safehasattr(obsolete.obsstore, 'relevantmarkers'):
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   104
    # from evolve extension: 1a23c7c52a43
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   105
    class pruneobsstore(obsolete.obsstore):
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   106
        """And extended obsstore class that read parent information from v1 format
874
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
   107
1067
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   108
        Evolve extension adds parent information in prune marker. We use it to make
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   109
        markers relevant to pushed changeset."""
852
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
   110
1067
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   111
        def __init__(self, *args, **kwargs):
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   112
            self.prunedchildren = {}
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   113
            return super(pruneobsstore, self).__init__(*args, **kwargs)
852
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
   114
1067
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   115
        def _load(self, markers):
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   116
            markers = self._prunedetectingmarkers(markers)
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   117
            return super(pruneobsstore, self)._load(markers)
852
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
   118
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
   119
1067
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   120
        def _prunedetectingmarkers(self, markers):
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   121
            for m in markers:
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   122
                if not m[1]: # no successors
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   123
                    meta = obsolete.decodemeta(m[3])
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   124
                    if 'p1' in meta:
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   125
                        p1 = node.bin(meta['p1'])
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   126
                        self.prunedchildren.setdefault(p1, set()).add(m)
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   127
                    if 'p2' in meta:
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   128
                        p2 = node.bin(meta['p2'])
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   129
                        self.prunedchildren.setdefault(p2, set()).add(m)
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   130
                yield m
852
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
   131
1067
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   132
    # from evolve extension: 1a23c7c52a43
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   133
    def relevantmarkers(self, nodes):
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   134
        """return a set of all obsolescence marker relevant to a set of node.
852
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
   135
1067
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   136
        "relevant" to a set of node mean:
852
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
   137
1067
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   138
        - marker that use this changeset as successors
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   139
        - prune marker of direct children on this changeset.
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   140
        - recursive application of the two rules on precursors of these markers
852
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
   141
1067
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   142
        It is a set so you cannot rely on order"""
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   143
        seennodes = set(nodes)
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   144
        seenmarkers = set()
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   145
        pendingnodes = set(nodes)
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   146
        precursorsmarkers = self.precursors
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   147
        prunedchildren = self.prunedchildren
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   148
        while pendingnodes:
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   149
            direct = set()
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   150
            for current in pendingnodes:
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   151
                direct.update(precursorsmarkers.get(current, ()))
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   152
                direct.update(prunedchildren.get(current, ()))
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   153
            direct -= seenmarkers
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   154
            pendingnodes = set([m[0] for m in direct])
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   155
            seenmarkers |= direct
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   156
            pendingnodes -= seennodes
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   157
            seennodes |= pendingnodes
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   158
        return seenmarkers
852
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
   159
878
5cb2744a6d36 simple4server: update "from <changeset>" statement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 877
diff changeset
   160
# from evolve extension: cf35f38d6a10
826
bee5e1105e6c exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 822
diff changeset
   161
def srv_pullobsmarkers(repo, proto, others):
874
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
   162
    """serves a binary stream of markers.
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
   163
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
   164
    Serves relevant to changeset between heads and common. The stream is prefix
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
   165
    by a -string- representation of an integer. This integer is the size of the
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
   166
    stream."""
826
bee5e1105e6c exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 822
diff changeset
   167
    opts = wireproto.options('', ['heads', 'common'], others)
bee5e1105e6c exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 822
diff changeset
   168
    for k, v in opts.iteritems():
bee5e1105e6c exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 822
diff changeset
   169
        if k in ('heads', 'common'):
bee5e1105e6c exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 822
diff changeset
   170
            opts[k] = wireproto.decodelist(v)
bee5e1105e6c exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 822
diff changeset
   171
    obsdata = _getobsmarkersstream(repo, **opts)
877
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 876
diff changeset
   172
    finaldata = StringIO()
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 876
diff changeset
   173
    obsdata = obsdata.getvalue()
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 876
diff changeset
   174
    finaldata.write('%20i' % len(obsdata))
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 876
diff changeset
   175
    finaldata.write(obsdata)
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 876
diff changeset
   176
    finaldata.seek(0)
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 876
diff changeset
   177
    return wireproto.streamres(proto.groupchunks(finaldata))
826
bee5e1105e6c exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 822
diff changeset
   178
866
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   179
874
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
   180
# from evolve extension: 1a23c7c52a43
866
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   181
def _obsrelsethashtree(repo):
874
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
   182
    """Build an obshash for every node in a repo
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
   183
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
   184
    return a [(node), (obshash)] list. in revision order."""
866
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   185
    cache = []
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   186
    unfi = repo.unfiltered()
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   187
    for i in unfi:
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   188
        ctx = unfi[i]
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   189
        entry = 0
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   190
        sha = util.sha1()
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   191
        # add data from p1
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   192
        for p in ctx.parents():
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   193
            p = p.rev()
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   194
            if p < 0:
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   195
                p = node.nullid
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   196
            else:
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   197
                p = cache[p][1]
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   198
            if p != node.nullid:
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   199
                entry += 1
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   200
                sha.update(p)
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   201
        tmarkers = repo.obsstore.relevantmarkers([ctx.node()])
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   202
        if tmarkers:
1090
4a6479395a9d compat: rename encodeonemarkers to _fm0encodemarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1073
diff changeset
   203
            bmarkers = [obsolete._fm0encodeonemarker(m) for m in tmarkers]
866
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   204
            bmarkers.sort()
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   205
            for m in bmarkers:
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   206
                entry += 1
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   207
                sha.update(m)
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   208
        if entry:
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   209
            cache.append((ctx.node(), sha.digest()))
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   210
        else:
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   211
            cache.append((ctx.node(), node.nullid))
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   212
    return cache
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   213
874
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
   214
# from evolve extension: 1a23c7c52a43
866
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   215
def _obshash(repo, nodes):
874
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
   216
    """hash of binary version of relevant markers + obsparent
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
   217
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
   218
    (special case so that all empty are hashed as nullid)"""
866
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   219
    hashs = _obsrelsethashtree(repo)
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   220
    nm = repo.changelog.nodemap
1073
f15f02007a0b obshash: resist to unknown revision during discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1067
diff changeset
   221
    revs = [nm.get(n) for n in nodes]
f15f02007a0b obshash: resist to unknown revision during discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1067
diff changeset
   222
    return [r is None and node.nullid or hashs[r][1] for r in revs]
866
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   223
874
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
   224
# from evolve extension: 1a23c7c52a43
866
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   225
def srv_obshash(repo, proto, nodes):
874
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
   226
    """give the obshash of a a set of node
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
   227
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
   228
    Used for markes discovery"""
866
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   229
    return wireproto.encodelist(_obshash(repo, wireproto.decodelist(nodes)))
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   230
874
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
   231
# from evolve extension: 1a23c7c52a43
822
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
   232
def capabilities(orig, repo, proto):
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
   233
    """wrapper to advertise new capability"""
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
   234
    caps = orig(repo, proto)
884
4ae115cf3efd sinmple4server: advertise new cap only when advertising obsolescence
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 882
diff changeset
   235
    advertise = repo.ui.configbool('__temporary__', 'advertiseobsolete', True)
4ae115cf3efd sinmple4server: advertise new cap only when advertising obsolescence
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 882
diff changeset
   236
    if obsolete._enabled and advertise:
822
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
   237
        caps += ' _evoext_pushobsmarkers_0'
826
bee5e1105e6c exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 822
diff changeset
   238
        caps += ' _evoext_pullobsmarkers_0'
866
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   239
        caps += ' _evoext_obshash_0'
1097
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1091
diff changeset
   240
        caps += ' _evoext_getbundle_obscommon'
822
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
   241
    return caps
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
   242
1097
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1091
diff changeset
   243
def _getbundleobsmarkerpart(orig, bundler, repo, source, heads=None, common=None,
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1091
diff changeset
   244
                            bundlecaps=None, **kwargs):
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1091
diff changeset
   245
    if 'evo_obscommon' not in kwargs:
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1091
diff changeset
   246
        return orig(bundler, repo, source, heads, common, bundlecaps, **kwargs)
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1091
diff changeset
   247
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1091
diff changeset
   248
    if kwargs.get('obsmarkers', False):
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1091
diff changeset
   249
        if heads is None:
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1091
diff changeset
   250
            heads = repo.heads()
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1091
diff changeset
   251
        obscommon = kwargs.get('evo_obscommon', ())
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1091
diff changeset
   252
        obsset = repo.set('::%ln - ::%ln', heads, obscommon)
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1091
diff changeset
   253
        subset = [c.node() for c in obsset]
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1091
diff changeset
   254
        markers = repo.obsstore.relevantmarkers(subset)
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1091
diff changeset
   255
        exchange.buildobsmarkerspart(bundler, markers)
963
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
   256
876
8c9601a6c4e0 simple4server: update "from <changeset>" statement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 875
diff changeset
   257
# from evolve extension: 10867a8e27c6
874
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
   258
# heavily modified
822
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
   259
def extsetup(ui):
963
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
   260
    localrepo.moderncaps.add('_evoext_b2x_obsmarkers_0')
1097
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1091
diff changeset
   261
    gboptsmap['evo_obscommon'] = 'nodes'
1067
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   262
    if not util.safehasattr(obsolete.obsstore, 'relevantmarkers'):
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   263
        obsolete.obsstore = pruneobsstore
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   264
        obsolete.obsstore.relevantmarkers = relevantmarkers
869
e9eeef0d07ec exchange: enforce permission on new wireprotocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 866
diff changeset
   265
    hgweb_mod.perms['evoext_pushobsmarkers_0'] = 'push'
e9eeef0d07ec exchange: enforce permission on new wireprotocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 866
diff changeset
   266
    hgweb_mod.perms['evoext_pullobsmarkers_0'] = 'pull'
e9eeef0d07ec exchange: enforce permission on new wireprotocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 866
diff changeset
   267
    hgweb_mod.perms['evoext_obshash'] = 'pull'
822
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
   268
    wireproto.commands['evoext_pushobsmarkers_0'] = (srv_pushobsmarkers, '')
826
bee5e1105e6c exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 822
diff changeset
   269
    wireproto.commands['evoext_pullobsmarkers_0'] = (srv_pullobsmarkers, '*')
875
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 874
diff changeset
   270
    # wrap module content
1097
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1091
diff changeset
   271
    extensions.wrapfunction(exchange, '_pullbundle2extraprepare', _getbundleobsmarkerpart)
822
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
   272
    extensions.wrapfunction(wireproto, 'capabilities', capabilities)
875
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 874
diff changeset
   273
    # wrap command content
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 874
diff changeset
   274
    oldcap, args = wireproto.commands['capabilities']
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 874
diff changeset
   275
    def newcap(repo, proto):
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 874
diff changeset
   276
        return capabilities(oldcap, repo, proto)
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 874
diff changeset
   277
    wireproto.commands['capabilities'] = (newcap, args)
866
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   278
    wireproto.commands['evoext_obshash'] = (srv_obshash, 'nodes')
882
48804a8d7472 simple4server: option to advertise obsolescence support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 878
diff changeset
   279
    # specific simple4server content
48804a8d7472 simple4server: option to advertise obsolescence support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 878
diff changeset
   280
    extensions.wrapfunction(pushkey, '_nslist', _nslist)
48804a8d7472 simple4server: option to advertise obsolescence support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 878
diff changeset
   281
    pushkey._namespaces['namespaces'] = (lambda *x: False, pushkey._nslist)
963
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
   282