This is pretty straightforward. We don't yet handle errors because we
don't have an error handling mechanism in place yet.
I'm also tempted to fold this into known. We'll come back to this
later.
hg-reviewers |
This is pretty straightforward. We don't yet handle errors because we
don't have an error handling mechanism in place yet.
I'm also tempted to fold this into known. We'll come back to this
later.
Automatic diff as part of commit; lint not applicable. |
Automatic diff as part of commit; unit tests not applicable. |
Path | Packages | |||
---|---|---|---|---|
M | mercurial/help/internals/wireprotocol.txt (15 lines) | |||
M | mercurial/wireproto.py (17 lines) | |||
M | tests/test-wireproto-command-capabilities.t (4 lines) | |||
A | M | tests/test-wireproto-command-lookup.t (55 lines) |
Status | Author | Revision | |
---|---|---|---|
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg |
namespace | namespace | ||||
(bytestring) Pushkey namespace to query. | (bytestring) Pushkey namespace to query. | ||||
The response is a map with bytestring keys and values. | The response is a map with bytestring keys and values. | ||||
TODO consider using binary to represent nodes in certain pushkey namespaces. | TODO consider using binary to represent nodes in certain pushkey namespaces. | ||||
lookup | |||||
------ | |||||
Try to resolve a value to a changeset revision. | |||||
Unlike ``known`` which operates on changeset nodes, lookup operates on | |||||
node fragments and other names that a user may use. | |||||
The command receives the following arguments: | |||||
key | |||||
(bytestring) Value to try to resolve. | |||||
On success, returns a bytestring containing the resolved node. | |||||
pushkey | pushkey | ||||
------- | ------- | ||||
Set a value using the ``pushkey`` protocol. | Set a value using the ``pushkey`` protocol. | ||||
The command receives the following arguments: | The command receives the following arguments: | ||||
namespace | namespace |
return wireprototypes.bytesresponse('capabilities: %s\n' % caps) | return wireprototypes.bytesresponse('capabilities: %s\n' % caps) | ||||
@wireprotocommand('listkeys', 'namespace', permission='pull', | @wireprotocommand('listkeys', 'namespace', permission='pull', | ||||
transportpolicy=POLICY_V1_ONLY) | transportpolicy=POLICY_V1_ONLY) | ||||
def listkeys(repo, proto, namespace): | def listkeys(repo, proto, namespace): | ||||
d = sorted(repo.listkeys(encoding.tolocal(namespace)).items()) | d = sorted(repo.listkeys(encoding.tolocal(namespace)).items()) | ||||
return wireprototypes.bytesresponse(pushkeymod.encodekeys(d)) | return wireprototypes.bytesresponse(pushkeymod.encodekeys(d)) | ||||
@wireprotocommand('lookup', 'key', permission='pull') | @wireprotocommand('lookup', 'key', permission='pull', | ||||
transportpolicy=POLICY_V1_ONLY) | |||||
def lookup(repo, proto, key): | def lookup(repo, proto, key): | ||||
try: | try: | ||||
k = encoding.tolocal(key) | k = encoding.tolocal(key) | ||||
n = repo.lookup(k) | n = repo.lookup(k) | ||||
r = hex(n) | r = hex(n) | ||||
success = 1 | success = 1 | ||||
except Exception as inst: | except Exception as inst: | ||||
r = stringutil.forcebytestr(inst) | r = stringutil.forcebytestr(inst) | ||||
transportpolicy=POLICY_V2_ONLY) | transportpolicy=POLICY_V2_ONLY) | ||||
def listkeysv2(repo, proto, namespace=None): | def listkeysv2(repo, proto, namespace=None): | ||||
keys = repo.listkeys(encoding.tolocal(namespace)) | keys = repo.listkeys(encoding.tolocal(namespace)) | ||||
keys = {encoding.fromlocal(k): encoding.fromlocal(v) | keys = {encoding.fromlocal(k): encoding.fromlocal(v) | ||||
for k, v in keys.iteritems()} | for k, v in keys.iteritems()} | ||||
return wireprototypes.cborresponse(keys) | return wireprototypes.cborresponse(keys) | ||||
@wireprotocommand('lookup', | |||||
args={ | |||||
'key': b'foo', | |||||
}, | |||||
permission='pull', | |||||
transportpolicy=POLICY_V2_ONLY) | |||||
def lookupv2(repo, proto, key): | |||||
key = encoding.tolocal(key) | |||||
# TODO handle exception. | |||||
node = repo.lookup(key) | |||||
return wireprototypes.cborresponse(node) | |||||
@wireprotocommand('pushkey', | @wireprotocommand('pushkey', | ||||
args={ | args={ | ||||
'namespace': b'ns', | 'namespace': b'ns', | ||||
'key': b'key', | 'key': b'key', | ||||
'old': b'old', | 'old': b'old', | ||||
'new': b'new', | 'new': b'new', | ||||
}, | }, | ||||
permission='push', | permission='push', |
s> HTTP/1.1 200 OK\r\n | s> HTTP/1.1 200 OK\r\n | ||||
s> Server: testing stub value\r\n | s> Server: testing stub value\r\n | ||||
s> Date: $HTTP_DATE$\r\n | s> Date: $HTTP_DATE$\r\n | ||||
s> Content-Type: application/mercurial-exp-framing-0003\r\n | s> Content-Type: application/mercurial-exp-framing-0003\r\n | ||||
s> Transfer-Encoding: chunked\r\n | s> Transfer-Encoding: chunked\r\n | ||||
s> \r\n | s> \r\n | ||||
s> *\r\n (glob) | s> *\r\n (glob) | ||||
s> *\x00\x01\x00\x02\x01F (glob) | s> *\x00\x01\x00\x02\x01F (glob) | ||||
s> \xa2Hcommands\xa9Eheads\xa2Dargs\xa1Jpubliconly\xf4Kpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\x81HdeadbeefKpermissions\x81DpullFlookup\xa2Dargs\xa1CkeyFlegacyKpermissions\x81DpullGpushkey\xa2Dargs\xa4CkeyCkeyCnewCnewColdColdInamespaceBnsKpermissions\x81DpullHlistkeys\xa2Dargs\xa1InamespaceBnsKpermissions\x81DpullHunbundle\xa2Dargs\xa1EheadsFlegacyKpermissions\x81DpushIbranchmap\xa2Dargs\xa0Kpermissions\x81DpullIgetbundle\xa2Dargs\xa1A*FlegacyKpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullKcompression\x82\xa1DnameDzstd\xa1DnameDzlib | s> \xa2Hcommands\xa9Eheads\xa2Dargs\xa1Jpubliconly\xf4Kpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\x81HdeadbeefKpermissions\x81DpullFlookup\xa2Dargs\xa1CkeyCfooKpermissions\x81DpullGpushkey\xa2Dargs\xa4CkeyCkeyCnewCnewColdColdInamespaceBnsKpermissions\x81DpushHlistkeys\xa2Dargs\xa1InamespaceBnsKpermissions\x81DpullHunbundle\xa2Dargs\xa1EheadsFlegacyKpermissions\x81DpushIbranchmap\xa2Dargs\xa0Kpermissions\x81DpullIgetbundle\xa2Dargs\xa1A*FlegacyKpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullKcompression\x82\xa1DnameDzstd\xa1DnameDzlib | ||||
s> \r\n | s> \r\n | ||||
received frame(size=*; request=1; stream=2; streamflags=stream-begin; type=bytes-response; flags=eos|cbor) (glob) | received frame(size=*; request=1; stream=2; streamflags=stream-begin; type=bytes-response; flags=eos|cbor) (glob) | ||||
s> 0\r\n | s> 0\r\n | ||||
s> \r\n | s> \r\n | ||||
response: [{b'commands': {b'branchmap': {b'args': {}, b'permissions': [b'pull']}, b'capabilities': {b'args': {}, b'permissions': [b'pull']}, b'getbundle': {b'args': {b'*': b'legacy'}, b'permissions': [b'pull']}, b'heads': {b'args': {b'publiconly': False}, b'permissions': [b'pull']}, b'known': {b'args': {b'nodes': [b'deadbeef']}, b'permissions': [b'pull']}, b'listkeys': {b'args': {b'namespace': b'ns'}, b'permissions': [b'pull']}, b'lookup': {b'args': {b'key': b'legacy'}, b'permissions': [b'pull']}, b'pushkey': {b'args': {b'key': b'key', b'namespace': b'ns', b'new': b'new', b'old': b'old'}, b'permissions': [b'pull']}, b'unbundle': {b'args': {b'heads': b'legacy'}, b'permissions': [b'push']}}, b'compression': [{b'name': b'zstd'}, {b'name': b'zlib'}]}] | response: [{b'commands': {b'branchmap': {b'args': {}, b'permissions': [b'pull']}, b'capabilities': {b'args': {}, b'permissions': [b'pull']}, b'getbundle': {b'args': {b'*': b'legacy'}, b'permissions': [b'pull']}, b'heads': {b'args': {b'publiconly': False}, b'permissions': [b'pull']}, b'known': {b'args': {b'nodes': [b'deadbeef']}, b'permissions': [b'pull']}, b'listkeys': {b'args': {b'namespace': b'ns'}, b'permissions': [b'pull']}, b'lookup': {b'args': {b'key': b'foo'}, b'permissions': [b'pull']}, b'pushkey': {b'args': {b'key': b'key', b'namespace': b'ns', b'new': b'new', b'old': b'old'}, b'permissions': [b'push']}, b'unbundle': {b'args': {b'heads': b'legacy'}, b'permissions': [b'push']}}, b'compression': [{b'name': b'zstd'}, {b'name': b'zlib'}]}] | ||||
$ cat error.log | $ cat error.log |
As before, can we merge this with something else?