hgext/simple4server.py
author Martijn Pieters <mjpieters@fb.com>
Wed, 30 Nov 2016 11:17:55 +0000
changeset 1778 924b76a51d18
parent 1757 86e71a0b3319
permissions -rw-r--r--
wireproto: chunking and compression is forthwith to be handled by hgweb Various functions disappeared in the process. Use the new streamres API but fall back to the old way if the keyword arguments are not accepted. See https://www.mercurial-scm.org/repo/hg/rev/2add671bf55b
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
1730
346de2c1b0e9 evolve: drop point release of versions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 1727
diff changeset
    11
testedwith = '3.3 3.4-rc'
1727
c353a84fb09f simple4server: update buglink to point to bz.mercurial-scm.org
Anton Shestakov <av6@dwimlabs.net>
parents: 1713
diff changeset
    12
buglink = 'https://bz.mercurial-scm.org/'
873
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
822
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
    15
1713
00612a019547 evolve: use hashlib to compute sha1 hashes
Jeroen Vaelen <jeroen@fb.com>
parents: 1548
diff changeset
    16
import hashlib
852
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    17
import struct
1757
86e71a0b3319 errors: add missing imports of mercurial.error
Martin von Zweigbergk <martinvonz@google.com>
parents: 1730
diff changeset
    18
from mercurial import error
872
2a2db401a55b simple4server: fix a missing import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 869
diff changeset
    19
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
    20
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
    21
from mercurial import extensions
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    22
from mercurial import obsolete
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    23
from cStringIO import StringIO
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    24
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
    25
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
    26
from mercurial import bundle2
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
    27
from mercurial import localrepo
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
    28
from mercurial import exchange
1245
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
    29
from mercurial import node
852
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
    30
_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
    31
963
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
    32
gboptslist = gboptsmap = None
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
    33
try:
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
    34
    from mercurial import obsolete
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):
1548
4229d1dae5ad check-code: make simple4server.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1331
diff changeset
    39
    raise error.Abort('Your Mercurial is too old for this version of Evolve\n'
4229d1dae5ad check-code: make simple4server.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1331
diff changeset
    40
                      'requires version 3.0.1 or above')
963
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):
1548
4229d1dae5ad check-code: make simple4server.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1331
diff changeset
   106
        """And extended obsstore class that read parent information from v1
4229d1dae5ad check-code: make simple4server.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1331
diff changeset
   107
        format
874
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
   108
1548
4229d1dae5ad check-code: make simple4server.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1331
diff changeset
   109
        Evolve extension adds parent information in prune marker.
4229d1dae5ad check-code: make simple4server.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1331
diff changeset
   110
        We use it to make 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
   111
1067
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   112
        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
   113
            self.prunedchildren = {}
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   114
            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
   115
1067
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   116
        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
   117
            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
   118
            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
   119
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
   120
1067
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   121
        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
   122
            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
   123
                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
   124
                    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
   125
                    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
   126
                        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
   127
                        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
   128
                    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
   129
                        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
   130
                        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
   131
                yield m
852
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
   132
1067
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   133
    # 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
   134
    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
   135
        """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
   136
1067
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   137
        "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
   138
1067
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   139
        - 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
   140
        - 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
   141
        - 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
   142
1067
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   143
        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
   144
        seennodes = set(nodes)
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   145
        seenmarkers = set()
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   146
        pendingnodes = set(nodes)
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   147
        precursorsmarkers = self.precursors
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   148
        prunedchildren = self.prunedchildren
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   149
        while pendingnodes:
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   150
            direct = set()
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   151
            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
   152
                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
   153
                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
   154
            direct -= seenmarkers
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   155
            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
   156
            seenmarkers |= direct
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   157
            pendingnodes -= seennodes
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   158
            seennodes |= pendingnodes
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   159
        return seenmarkers
852
aa722de36179 exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 826
diff changeset
   160
1778
924b76a51d18 wireproto: chunking and compression is forthwith to be handled by hgweb
Martijn Pieters <mjpieters@fb.com>
parents: 1757
diff changeset
   161
# The wireproto.streamres API changed, handling chunking and compression
924b76a51d18 wireproto: chunking and compression is forthwith to be handled by hgweb
Martijn Pieters <mjpieters@fb.com>
parents: 1757
diff changeset
   162
# directly. Handle either case.
924b76a51d18 wireproto: chunking and compression is forthwith to be handled by hgweb
Martijn Pieters <mjpieters@fb.com>
parents: 1757
diff changeset
   163
if util.safehasattr(wireproto.abstractserverproto, 'groupchunks'):
924b76a51d18 wireproto: chunking and compression is forthwith to be handled by hgweb
Martijn Pieters <mjpieters@fb.com>
parents: 1757
diff changeset
   164
    # We need to handle chunking and compression directly
924b76a51d18 wireproto: chunking and compression is forthwith to be handled by hgweb
Martijn Pieters <mjpieters@fb.com>
parents: 1757
diff changeset
   165
    def streamres(d, proto):
924b76a51d18 wireproto: chunking and compression is forthwith to be handled by hgweb
Martijn Pieters <mjpieters@fb.com>
parents: 1757
diff changeset
   166
        return wireproto.streamres(proto.groupchunks(d))
924b76a51d18 wireproto: chunking and compression is forthwith to be handled by hgweb
Martijn Pieters <mjpieters@fb.com>
parents: 1757
diff changeset
   167
else:
924b76a51d18 wireproto: chunking and compression is forthwith to be handled by hgweb
Martijn Pieters <mjpieters@fb.com>
parents: 1757
diff changeset
   168
    # Leave chunking and compression to streamres
924b76a51d18 wireproto: chunking and compression is forthwith to be handled by hgweb
Martijn Pieters <mjpieters@fb.com>
parents: 1757
diff changeset
   169
    def streamres(d, proto):
924b76a51d18 wireproto: chunking and compression is forthwith to be handled by hgweb
Martijn Pieters <mjpieters@fb.com>
parents: 1757
diff changeset
   170
        return wireproto.streamres(reader=d, v1compressible=True)
924b76a51d18 wireproto: chunking and compression is forthwith to be handled by hgweb
Martijn Pieters <mjpieters@fb.com>
parents: 1757
diff changeset
   171
878
5cb2744a6d36 simple4server: update "from <changeset>" statement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 877
diff changeset
   172
# 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
   173
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
   174
    """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
   175
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
   176
    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
   177
    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
   178
    stream."""
826
bee5e1105e6c exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 822
diff changeset
   179
    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
   180
    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
   181
        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
   182
            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
   183
    obsdata = _getobsmarkersstream(repo, **opts)
877
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 876
diff changeset
   184
    finaldata = StringIO()
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 876
diff changeset
   185
    obsdata = obsdata.getvalue()
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 876
diff changeset
   186
    finaldata.write('%20i' % len(obsdata))
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 876
diff changeset
   187
    finaldata.write(obsdata)
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 876
diff changeset
   188
    finaldata.seek(0)
1778
924b76a51d18 wireproto: chunking and compression is forthwith to be handled by hgweb
Martijn Pieters <mjpieters@fb.com>
parents: 1757
diff changeset
   189
    return streamres(finaldata, proto)
826
bee5e1105e6c exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 822
diff changeset
   190
866
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   191
1246
c7db753ca300 #iforgottoamendagain
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1245
diff changeset
   192
# from evolve extension: 3249814dabd1
1245
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
   193
def _obsrelsethashtreefm0(repo):
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
   194
    return _obsrelsethashtree(repo, obsolete._fm0encodeonemarker)
874
19a7ed6384a9 simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 873
diff changeset
   195
1246
c7db753ca300 #iforgottoamendagain
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1245
diff changeset
   196
# from evolve extension: 3249814dabd1
1245
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
   197
def _obsrelsethashtreefm1(repo):
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
   198
    return _obsrelsethashtree(repo, obsolete._fm1encodeonemarker)
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
   199
1246
c7db753ca300 #iforgottoamendagain
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1245
diff changeset
   200
# from evolve extension: 3249814dabd1
1245
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
   201
def _obsrelsethashtree(repo, encodeonemarker):
866
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   202
    cache = []
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   203
    unfi = repo.unfiltered()
1245
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
   204
    markercache = {}
866
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   205
    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
   206
        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
   207
        entry = 0
1713
00612a019547 evolve: use hashlib to compute sha1 hashes
Jeroen Vaelen <jeroen@fb.com>
parents: 1548
diff changeset
   208
        sha = hashlib.sha1()
866
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   209
        # 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
   210
        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
   211
            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
   212
            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
   213
                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
   214
            else:
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   215
                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
   216
            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
   217
                entry += 1
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   218
                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
   219
        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
   220
        if tmarkers:
1245
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
   221
            bmarkers = []
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
   222
            for m in tmarkers:
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
   223
                if not m in markercache:
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
   224
                    markercache[m] = encodeonemarker(m)
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
   225
                bmarkers.append(markercache[m])
866
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   226
            bmarkers.sort()
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   227
            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
   228
                entry += 1
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   229
                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
   230
        if entry:
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   231
            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
   232
        else:
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   233
            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
   234
    return cache
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   235
1246
c7db753ca300 #iforgottoamendagain
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1245
diff changeset
   236
# from evolve extension: 3249814dabd1
1245
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
   237
def _obshash(repo, nodes, version=0):
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
   238
    if version == 0:
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
   239
        hashs = _obsrelsethashtreefm0(repo)
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
   240
    elif version ==1:
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
   241
        hashs = _obsrelsethashtreefm1(repo)
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
   242
    else:
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
   243
        assert False
866
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   244
    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
   245
    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
   246
    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
   247
1246
c7db753ca300 #iforgottoamendagain
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1245
diff changeset
   248
# from evolve extension: 3249814dabd1
866
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   249
def srv_obshash(repo, proto, nodes):
c6dc5822e640 simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 852
diff changeset
   250
    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
   251
1246
c7db753ca300 #iforgottoamendagain
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1245
diff changeset
   252
# from evolve extension: 3249814dabd1
1245
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
   253
def srv_obshash1(repo, proto, nodes):
1548
4229d1dae5ad check-code: make simple4server.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1331
diff changeset
   254
    return wireproto.encodelist(_obshash(repo, wireproto.decodelist(nodes),
4229d1dae5ad check-code: make simple4server.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1331
diff changeset
   255
                                version=1))
1245
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
   256
1246
c7db753ca300 #iforgottoamendagain
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1245
diff changeset
   257
# from evolve extension: 3249814dabd1
822
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
   258
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
   259
    """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
   260
    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
   261
    advertise = repo.ui.configbool('__temporary__', 'advertiseobsolete', True)
1215
004e21b8d67b server4simple: remove use of obsolete._enabled
Durham Goode <durham@fb.com>
parents: 1097
diff changeset
   262
    if obsolete.isenabled(repo, obsolete.exchangeopt) and advertise:
822
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
   263
        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
   264
        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
   265
        caps += ' _evoext_obshash_0'
1245
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
   266
        caps += ' _evoext_obshash_1'
1097
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1091
diff changeset
   267
        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
   268
    return caps
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
   269
1253
d03583da89c4 pull: fix bundle2 part generation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1252
diff changeset
   270
def _getbundleobsmarkerpart(orig, bundler, repo, source, **kwargs):
1097
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1091
diff changeset
   271
    if 'evo_obscommon' not in kwargs:
1253
d03583da89c4 pull: fix bundle2 part generation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1252
diff changeset
   272
        return orig(bundler, repo, source, **kwargs)
d03583da89c4 pull: fix bundle2 part generation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1252
diff changeset
   273
d03583da89c4 pull: fix bundle2 part generation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1252
diff changeset
   274
    heads = kwargs.get('heads')
d03583da89c4 pull: fix bundle2 part generation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1252
diff changeset
   275
    if 'evo_obscommon' not in kwargs:
d03583da89c4 pull: fix bundle2 part generation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1252
diff changeset
   276
        return orig(bundler, repo, source, **kwargs)
1097
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1091
diff changeset
   277
580a2d838996 pull: use discovery to pull less obsmarkers through bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1091
diff changeset
   278
    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
   279
        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
   280
            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
   281
        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
   282
        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
   283
        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
   284
        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
   285
        exchange.buildobsmarkerspart(bundler, markers)
963
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
   286
876
8c9601a6c4e0 simple4server: update "from <changeset>" statement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 875
diff changeset
   287
# 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
   288
# heavily modified
822
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
   289
def extsetup(ui):
963
f80e8e3c3726 simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 888
diff changeset
   290
    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
   291
    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
   292
    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
   293
        obsolete.obsstore = pruneobsstore
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 963
diff changeset
   294
        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
   295
    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
   296
    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
   297
    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
   298
    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
   299
    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
   300
    # wrap module content
1253
d03583da89c4 pull: fix bundle2 part generation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1252
diff changeset
   301
    origfunc = exchange.getbundle2partsmapping['obsmarkers']
d03583da89c4 pull: fix bundle2 part generation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1252
diff changeset
   302
    def newfunc(*args, **kwargs):
d03583da89c4 pull: fix bundle2 part generation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1252
diff changeset
   303
        return _getbundleobsmarkerpart(origfunc, *args, **kwargs)
d03583da89c4 pull: fix bundle2 part generation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1252
diff changeset
   304
    exchange.getbundle2partsmapping['obsmarkers'] = newfunc
822
5f5d269278e9 exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 660
diff changeset
   305
    extensions.wrapfunction(wireproto, 'capabilities', capabilities)
875
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 874
diff changeset
   306
    # wrap command content
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 874
diff changeset
   307
    oldcap, args = wireproto.commands['capabilities']
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 874
diff changeset
   308
    def newcap(repo, proto):
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 874
diff changeset
   309
        return capabilities(oldcap, repo, proto)
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 874
diff changeset
   310
    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
   311
    wireproto.commands['evoext_obshash'] = (srv_obshash, 'nodes')
1245
580a8f5ea462 discovery: port the new hashing version to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1097
diff changeset
   312
    wireproto.commands['evoext_obshash1'] = (srv_obshash1, 'nodes')
882
48804a8d7472 simple4server: option to advertise obsolescence support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 878
diff changeset
   313
    # specific simple4server content
48804a8d7472 simple4server: option to advertise obsolescence support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 878
diff changeset
   314
    extensions.wrapfunction(pushkey, '_nslist', _nslist)
48804a8d7472 simple4server: option to advertise obsolescence support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 878
diff changeset
   315
    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
   316
1215
004e21b8d67b server4simple: remove use of obsolete._enabled
Durham Goode <durham@fb.com>
parents: 1097
diff changeset
   317
def reposetup(ui, repo):
004e21b8d67b server4simple: remove use of obsolete._enabled
Durham Goode <durham@fb.com>
parents: 1097
diff changeset
   318
    evolveopts = ui.configlist('experimental', 'evolution')
004e21b8d67b server4simple: remove use of obsolete._enabled
Durham Goode <durham@fb.com>
parents: 1097
diff changeset
   319
    if not evolveopts:
004e21b8d67b server4simple: remove use of obsolete._enabled
Durham Goode <durham@fb.com>
parents: 1097
diff changeset
   320
        evolveopts = 'all'
004e21b8d67b server4simple: remove use of obsolete._enabled
Durham Goode <durham@fb.com>
parents: 1097
diff changeset
   321
        ui.setconfig('experimental', 'evolution', evolveopts)