author | Pierre-Yves David <pierre-yves.david@fb.com> |
Wed, 27 Aug 2014 18:15:39 +0200 | |
changeset 1090 | 4a6479395a9d |
parent 1073 | f15f02007a0b |
child 1091 | 236a8e81551e |
permissions | -rw-r--r-- |
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 mercurial.obsolete: 19e9478c1a22 |
852
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
79 |
def _encodemarkersstream(fp, markers): |
874
19a7ed6384a9
simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
873
diff
changeset
|
80 |
"""write a binary version of a set of markers |
19a7ed6384a9
simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
873
diff
changeset
|
81 |
|
19a7ed6384a9
simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
873
diff
changeset
|
82 |
Includes the initial version number""" |
852
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
83 |
fp.write(_pack('>B', 0)) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
84 |
for mark in markers: |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
85 |
fp.write(obsolete._encodeonemarker(mark)) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
86 |
|
874
19a7ed6384a9
simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
873
diff
changeset
|
87 |
# 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
|
88 |
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
|
89 |
"""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
|
90 |
""" |
852
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
91 |
revset = '' |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
92 |
args = [] |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
93 |
repo = repo.unfiltered() |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
94 |
if heads is None: |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
95 |
revset = 'all()' |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
96 |
elif heads: |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
97 |
revset += "(::%ln)" |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
98 |
args.append(heads) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
99 |
else: |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
100 |
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
|
101 |
if common: |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
102 |
revset += ' - (::%ln)' |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
103 |
args.append(common) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
104 |
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
|
105 |
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
|
106 |
obsdata = StringIO() |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
107 |
_encodemarkersstream(obsdata, markers) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
108 |
obsdata.seek(0) |
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
109 |
return obsdata |
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 |
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
|
112 |
# 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
|
113 |
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
|
114 |
"""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
|
115 |
|
1067
5d063fed9e3d
evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
963
diff
changeset
|
116 |
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
|
117 |
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
|
118 |
|
1067
5d063fed9e3d
evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
963
diff
changeset
|
119 |
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
|
120 |
self.prunedchildren = {} |
5d063fed9e3d
evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
963
diff
changeset
|
121 |
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
|
122 |
|
1067
5d063fed9e3d
evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
963
diff
changeset
|
123 |
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
|
124 |
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
|
125 |
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
|
126 |
|
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
127 |
|
1067
5d063fed9e3d
evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
963
diff
changeset
|
128 |
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
|
129 |
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
|
130 |
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
|
131 |
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
|
132 |
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
|
133 |
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
|
134 |
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
|
135 |
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
|
136 |
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
|
137 |
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
|
138 |
yield m |
852
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
139 |
|
1067
5d063fed9e3d
evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
963
diff
changeset
|
140 |
# 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
|
141 |
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
|
142 |
"""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
|
143 |
|
1067
5d063fed9e3d
evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
963
diff
changeset
|
144 |
"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
|
145 |
|
1067
5d063fed9e3d
evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
963
diff
changeset
|
146 |
- 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
|
147 |
- 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
|
148 |
- 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
|
149 |
|
1067
5d063fed9e3d
evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
963
diff
changeset
|
150 |
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
|
151 |
seennodes = set(nodes) |
5d063fed9e3d
evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
963
diff
changeset
|
152 |
seenmarkers = set() |
5d063fed9e3d
evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
963
diff
changeset
|
153 |
pendingnodes = set(nodes) |
5d063fed9e3d
evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
963
diff
changeset
|
154 |
precursorsmarkers = self.precursors |
5d063fed9e3d
evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
963
diff
changeset
|
155 |
prunedchildren = self.prunedchildren |
5d063fed9e3d
evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
963
diff
changeset
|
156 |
while pendingnodes: |
5d063fed9e3d
evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
963
diff
changeset
|
157 |
direct = set() |
5d063fed9e3d
evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
963
diff
changeset
|
158 |
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
|
159 |
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
|
160 |
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
|
161 |
direct -= seenmarkers |
5d063fed9e3d
evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
963
diff
changeset
|
162 |
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
|
163 |
seenmarkers |= direct |
5d063fed9e3d
evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
963
diff
changeset
|
164 |
pendingnodes -= seennodes |
5d063fed9e3d
evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
963
diff
changeset
|
165 |
seennodes |= pendingnodes |
5d063fed9e3d
evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
963
diff
changeset
|
166 |
return seenmarkers |
852
aa722de36179
exchange: fix pulling from simple for server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
826
diff
changeset
|
167 |
|
878
5cb2744a6d36
simple4server: update "from <changeset>" statement
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
877
diff
changeset
|
168 |
# 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
|
169 |
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
|
170 |
"""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
|
171 |
|
19a7ed6384a9
simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
873
diff
changeset
|
172 |
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
|
173 |
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
|
174 |
stream.""" |
826
bee5e1105e6c
exchange: add the pullmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
822
diff
changeset
|
175 |
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
|
176 |
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
|
177 |
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
|
178 |
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
|
179 |
obsdata = _getobsmarkersstream(repo, **opts) |
877
cf35f38d6a10
exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
876
diff
changeset
|
180 |
finaldata = StringIO() |
cf35f38d6a10
exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
876
diff
changeset
|
181 |
obsdata = obsdata.getvalue() |
cf35f38d6a10
exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
876
diff
changeset
|
182 |
finaldata.write('%20i' % len(obsdata)) |
cf35f38d6a10
exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
876
diff
changeset
|
183 |
finaldata.write(obsdata) |
cf35f38d6a10
exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
876
diff
changeset
|
184 |
finaldata.seek(0) |
cf35f38d6a10
exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
876
diff
changeset
|
185 |
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
|
186 |
|
866
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
187 |
|
874
19a7ed6384a9
simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
873
diff
changeset
|
188 |
# 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
|
189 |
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
|
190 |
"""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
|
191 |
|
19a7ed6384a9
simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
873
diff
changeset
|
192 |
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
|
193 |
cache = [] |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
194 |
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
|
195 |
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
|
196 |
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
|
197 |
entry = 0 |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
198 |
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
|
199 |
# 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
|
200 |
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
|
201 |
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
|
202 |
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
|
203 |
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
|
204 |
else: |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
205 |
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
|
206 |
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
|
207 |
entry += 1 |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
208 |
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
|
209 |
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
|
210 |
if tmarkers: |
1090
4a6479395a9d
compat: rename encodeonemarkers to _fm0encodemarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1073
diff
changeset
|
211 |
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
|
212 |
bmarkers.sort() |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
213 |
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
|
214 |
entry += 1 |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
215 |
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
|
216 |
if entry: |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
217 |
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
|
218 |
else: |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
219 |
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
|
220 |
return cache |
c6dc5822e640
simple4server: add the wireproto command for obsolescence markers discovery
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
852
diff
changeset
|
221 |
|
874
19a7ed6384a9
simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
873
diff
changeset
|
222 |
# 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
|
223 |
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
|
224 |
"""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
|
225 |
|
19a7ed6384a9
simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
873
diff
changeset
|
226 |
(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
|
227 |
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
|
228 |
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
|
229 |
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
|
230 |
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
|
231 |
|
874
19a7ed6384a9
simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
873
diff
changeset
|
232 |
# 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
|
233 |
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
|
234 |
"""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
|
235 |
|
19a7ed6384a9
simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
873
diff
changeset
|
236 |
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
|
237 |
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
|
238 |
|
874
19a7ed6384a9
simple4server: add origin and documentation to most function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
873
diff
changeset
|
239 |
# 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
|
240 |
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
|
241 |
"""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
|
242 |
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
|
243 |
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
|
244 |
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
|
245 |
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
|
246 |
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
|
247 |
caps += ' _evoext_obshash_0' |
963
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
248 |
caps += ' _evoext_b2x_obsmarkers_0' |
822
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
249 |
return caps |
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
250 |
|
963
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
251 |
|
876
8c9601a6c4e0
simple4server: update "from <changeset>" statement
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
875
diff
changeset
|
252 |
# 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
|
253 |
# heavily modified |
822
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
254 |
def extsetup(ui): |
963
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
255 |
localrepo.moderncaps.add('_evoext_b2x_obsmarkers_0') |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
256 |
if gboptsmap is not None: |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
257 |
gboptsmap['evo_obsmarker'] = 'plain' |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
258 |
gboptsmap['evo_obscommon'] = 'plain' |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
259 |
gboptsmap['evo_obsheads'] = 'plain' |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
260 |
else: |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
261 |
gboptslist.append('evo_obsheads') |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
262 |
gboptslist.append('evo_obscommon') |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
263 |
gboptslist.append('evo_obsmarker') |
1067
5d063fed9e3d
evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
963
diff
changeset
|
264 |
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
|
265 |
obsolete.obsstore = pruneobsstore |
5d063fed9e3d
evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
963
diff
changeset
|
266 |
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
|
267 |
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
|
268 |
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
|
269 |
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
|
270 |
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
|
271 |
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
|
272 |
# wrap module content |
963
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
273 |
extensions.wrapfunction(exchange, '_getbundleextrapart', _getbundleextrapart) |
822
5f5d269278e9
exchange: add the pushmarker wireproto command to simple4server
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
660
diff
changeset
|
274 |
extensions.wrapfunction(wireproto, 'capabilities', capabilities) |
875
10867a8e27c6
exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
874
diff
changeset
|
275 |
# wrap command content |
10867a8e27c6
exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
874
diff
changeset
|
276 |
oldcap, args = wireproto.commands['capabilities'] |
10867a8e27c6
exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
874
diff
changeset
|
277 |
def newcap(repo, proto): |
10867a8e27c6
exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
874
diff
changeset
|
278 |
return capabilities(oldcap, repo, proto) |
10867a8e27c6
exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
874
diff
changeset
|
279 |
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
|
280 |
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
|
281 |
# specific simple4server content |
48804a8d7472
simple4server: option to advertise obsolescence support
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
878
diff
changeset
|
282 |
extensions.wrapfunction(pushkey, '_nslist', _nslist) |
48804a8d7472
simple4server: option to advertise obsolescence support
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
878
diff
changeset
|
283 |
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
|
284 |
|
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
285 |
|
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
286 |
#from evolve extension |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
287 |
@bundle2.parthandler('evolve:b2x:obsmarkerv1') |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
288 |
def handleobsmarkerv1(op, inpart): |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
289 |
"""add a stream of obsmarker to the repo""" |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
290 |
tr = op.gettransaction() |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
291 |
advparams = dict(inpart.advisoryparams) |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
292 |
length = advparams.get('totalbytes') |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
293 |
if length is None: |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
294 |
obsdata = inpart.read() |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
295 |
else: |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
296 |
length = int(length) |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
297 |
data = StringIO() |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
298 |
current = 0 |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
299 |
op.ui.progress('OBSEXC', current, unit="bytes", total=length) |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
300 |
while current < length: |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
301 |
readsize = min(length-current, 4096) |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
302 |
data.write(inpart.read(readsize)) |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
303 |
current += readsize |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
304 |
op.ui.progress('OBSEXC', current, unit="bytes", total=length) |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
305 |
op.ui.progress('OBSEXC', None) |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
306 |
obsdata = data.getvalue() |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
307 |
totalsize = len(obsdata) |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
308 |
old = len(op.repo.obsstore._all) |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
309 |
op.repo.obsstore.mergemarkers(tr, obsdata) |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
310 |
new = len(op.repo.obsstore._all) - old |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
311 |
op.records.add('evo_obsmarkers', {'new': new, 'bytes': totalsize}) |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
312 |
tr.hookargs['evolve_new_obsmarkers'] = str(new) |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
313 |
|
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
314 |
#from evolve extension |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
315 |
def _getbundleextrapart(orig, bundler, repo, source, **kwargs): |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
316 |
if int(kwargs.pop('evo_obsmarker', False)): |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
317 |
common = kwargs.pop('evo_obscommon') |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
318 |
common = wireproto.decodelist(common) |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
319 |
heads = kwargs.pop('evo_obsheads') |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
320 |
heads = wireproto.decodelist(heads) |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
321 |
obsdata = _getobsmarkersstream(repo, common=common, heads=heads) |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
322 |
if len(obsdata.getvalue()) > 5: |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
323 |
advparams = [('totalbytes', str(len(obsdata.getvalue())))] |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
324 |
obspart = bundle2.bundlepart('EVOLVE:B2X:OBSMARKERV1', |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
325 |
advisoryparams=advparams, |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
326 |
data=obsdata) |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
327 |
bundler.addpart(obspart) |
f80e8e3c3726
simple4server: backport the bundle2 exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
888
diff
changeset
|
328 |
orig(bundler, repo, source) |