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