##// END OF EJS Templates
wireproto: port keep command to wire protocol v2...
Gregory Szorc -
r37504:6847542b default
parent child Browse files
Show More
@@ -0,0 +1,121 b''
1 $ . $TESTDIR/wireprotohelpers.sh
2
3 $ hg init server
4 $ enablehttpv2 server
5 $ cd server
6 $ hg debugdrawdag << EOF
7 > C D
8 > |/
9 > B
10 > |
11 > A
12 > EOF
13
14 $ hg log -T '{rev}:{node} {desc}\n'
15 3:be0ef73c17ade3fc89dc41701eb9fc3a91b58282 D
16 2:26805aba1e600a82e93661149f2313866a221a7b C
17 1:112478962961147124edd43549aedd1a335e44bf B
18 0:426bada5c67598ca65036d57d9e4b64b0c1ce7a0 A
19
20 $ hg serve -p $HGPORT -d --pid-file hg.pid -E error.log
21 $ cat hg.pid > $DAEMON_PIDS
22
23 No arguments returns something reasonable
24
25 $ sendhttpv2peer << EOF
26 > command known
27 > EOF
28 creating http peer for wire protocol version 2
29 sending known command
30 s> POST /api/exp-http-v2-0001/ro/known HTTP/1.1\r\n
31 s> Accept-Encoding: identity\r\n
32 s> accept: application/mercurial-exp-framing-0003\r\n
33 s> content-type: application/mercurial-exp-framing-0003\r\n
34 s> content-length: 20\r\n
35 s> host: $LOCALIP:$HGPORT\r\n (glob)
36 s> user-agent: Mercurial debugwireproto\r\n
37 s> \r\n
38 s> \x0c\x00\x00\x01\x00\x01\x01\x11\xa1DnameEknown
39 s> makefile('rb', None)
40 s> HTTP/1.1 200 OK\r\n
41 s> Server: testing stub value\r\n
42 s> Date: $HTTP_DATE$\r\n
43 s> Content-Type: application/mercurial-exp-framing-0003\r\n
44 s> Transfer-Encoding: chunked\r\n
45 s> \r\n
46 s> 9\r\n
47 s> \x01\x00\x00\x01\x00\x02\x01F
48 s> @
49 s> \r\n
50 received frame(size=1; request=1; stream=2; streamflags=stream-begin; type=bytes-response; flags=eos|cbor)
51 s> 0\r\n
52 s> \r\n
53 response: []
54
55 Single known node works
56
57 $ sendhttpv2peer << EOF
58 > command known
59 > nodes eval:[b'\x42\x6b\xad\xa5\xc6\x75\x98\xca\x65\x03\x6d\x57\xd9\xe4\xb6\x4b\x0c\x1c\xe7\xa0']
60 > EOF
61 creating http peer for wire protocol version 2
62 sending known command
63 s> POST /api/exp-http-v2-0001/ro/known HTTP/1.1\r\n
64 s> Accept-Encoding: identity\r\n
65 s> accept: application/mercurial-exp-framing-0003\r\n
66 s> content-type: application/mercurial-exp-framing-0003\r\n
67 s> content-length: 54\r\n
68 s> host: $LOCALIP:$HGPORT\r\n (glob)
69 s> user-agent: Mercurial debugwireproto\r\n
70 s> \r\n
71 s> .\x00\x00\x01\x00\x01\x01\x11\xa2Dargs\xa1Enodes\x81TBk\xad\xa5\xc6u\x98\xcae\x03mW\xd9\xe4\xb6K\x0c\x1c\xe7\xa0DnameEknown
72 s> makefile('rb', None)
73 s> HTTP/1.1 200 OK\r\n
74 s> Server: testing stub value\r\n
75 s> Date: $HTTP_DATE$\r\n
76 s> Content-Type: application/mercurial-exp-framing-0003\r\n
77 s> Transfer-Encoding: chunked\r\n
78 s> \r\n
79 s> a\r\n
80 s> \x02\x00\x00\x01\x00\x02\x01F
81 s> A1
82 s> \r\n
83 received frame(size=2; request=1; stream=2; streamflags=stream-begin; type=bytes-response; flags=eos|cbor)
84 s> 0\r\n
85 s> \r\n
86 response: [b'1']
87
88 Multiple nodes works
89
90 $ sendhttpv2peer << EOF
91 > command known
92 > nodes eval:[b'\x42\x6b\xad\xa5\xc6\x75\x98\xca\x65\x03\x6d\x57\xd9\xe4\xb6\x4b\x0c\x1c\xe7\xa0', b'00000000000000000000', b'\x11\x24\x78\x96\x29\x61\x14\x71\x24\xed\xd4\x35\x49\xae\xdd\x1a\x33\x5e\x44\xbf']
93 > EOF
94 creating http peer for wire protocol version 2
95 sending known command
96 s> POST /api/exp-http-v2-0001/ro/known HTTP/1.1\r\n
97 s> Accept-Encoding: identity\r\n
98 s> accept: application/mercurial-exp-framing-0003\r\n
99 s> content-type: application/mercurial-exp-framing-0003\r\n
100 s> content-length: 96\r\n
101 s> host: $LOCALIP:$HGPORT\r\n (glob)
102 s> user-agent: Mercurial debugwireproto\r\n
103 s> \r\n
104 s> X\x00\x00\x01\x00\x01\x01\x11\xa2Dargs\xa1Enodes\x83TBk\xad\xa5\xc6u\x98\xcae\x03mW\xd9\xe4\xb6K\x0c\x1c\xe7\xa0T00000000000000000000T\x11$x\x96)a\x14q$\xed\xd45I\xae\xdd\x1a3^D\xbfDnameEknown
105 s> makefile('rb', None)
106 s> HTTP/1.1 200 OK\r\n
107 s> Server: testing stub value\r\n
108 s> Date: $HTTP_DATE$\r\n
109 s> Content-Type: application/mercurial-exp-framing-0003\r\n
110 s> Transfer-Encoding: chunked\r\n
111 s> \r\n
112 s> c\r\n
113 s> \x04\x00\x00\x01\x00\x02\x01F
114 s> C101
115 s> \r\n
116 received frame(size=4; request=1; stream=2; streamflags=stream-begin; type=bytes-response; flags=eos|cbor)
117 s> 0\r\n
118 s> \r\n
119 response: [b'101']
120
121 $ cat error.log
@@ -1686,3 +1686,19 b' of DAG heads. The array can be empty if '
1686 changesets satisfied the request.
1686 changesets satisfied the request.
1687
1687
1688 TODO consider exposing phase of heads in response
1688 TODO consider exposing phase of heads in response
1689
1690 known
1691 -----
1692
1693 Determine whether a series of changeset nodes is known to the server.
1694
1695 The command accepts the following arguments:
1696
1697 nodes
1698 (array of bytestrings) List of changeset nodes whose presence to
1699 query.
1700
1701 The response is a bytestring where each byte contains a 0 or 1 for the
1702 corresponding requested node at the same index.
1703
1704 TODO use a bit array for even more compact response
@@ -1041,7 +1041,8 b' def lookup(repo, proto, key):'
1041 success = 0
1041 success = 0
1042 return wireprototypes.bytesresponse('%d %s\n' % (success, r))
1042 return wireprototypes.bytesresponse('%d %s\n' % (success, r))
1043
1043
1044 @wireprotocommand('known', 'nodes *', permission='pull')
1044 @wireprotocommand('known', 'nodes *', permission='pull',
1045 transportpolicy=POLICY_V1_ONLY)
1045 def known(repo, proto, nodes, others):
1046 def known(repo, proto, nodes, others):
1046 v = ''.join(b and '1' or '0' for b in repo.known(decodelist(nodes)))
1047 v = ''.join(b and '1' or '0' for b in repo.known(decodelist(nodes)))
1047 return wireprototypes.bytesresponse(v)
1048 return wireprototypes.bytesresponse(v)
@@ -1215,3 +1216,10 b' def headsv2(repo, proto, publiconly=Fals'
1215 repo = repo.filtered('immutable')
1216 repo = repo.filtered('immutable')
1216
1217
1217 return wireprototypes.cborresponse(repo.heads())
1218 return wireprototypes.cborresponse(repo.heads())
1219
1220 @wireprotocommand('known', 'nodes', permission='pull',
1221 transportpolicy=POLICY_V2_ONLY)
1222 def knownv2(repo, proto, nodes=None):
1223 nodes = nodes or []
1224 result = b''.join(b'1' if n else b'0' for n in repo.known(nodes))
1225 return wireprototypes.cborresponse(result)
General Comments 0
You need to be logged in to leave comments. Login now