rust-index: using `hg::index::Index` in `hg-cpython::dagops`
Hooking `headrevs` to the Rust index is straightforward as long as
we go the `PySharedRef` way. Direct attempts of obtaining a reference
to the inner `hg::index::Index` fail for lifetime reasons: the reference
is bound to the GIL, yet the `as_set` local variable is considered to
be static (the borrow checker clearly does not realize or care that this
set only stores `Revision` values).
In `rank()`, the chosen solution is the simplest as far as `hg-cpython` is
concerned, but it has the defect of removing an implementation
that would be easily adaptable if the core index did implement `RankedGraph`
(returning the same error as long as only `REVLOGV1` is supported), but that
would introduce a direct dependency of `hg-core` on the ``vcsgraph` crate.
import io
import unittest
import silenttestrunner
from mercurial import (
wireprotoserver,
wireprotov1server,
)
from mercurial.utils import procutil
class SSHServerGetArgsTests(unittest.TestCase):
def testparseknown(self):
tests = [
(b'* 0\nnodes 0\n', [b'', {}]),
(
b'* 0\nnodes 40\n1111111111111111111111111111111111111111\n',
[b'1111111111111111111111111111111111111111', {}],
),
]
for input, expected in tests:
self.assertparse(b'known', input, expected)
def assertparse(self, cmd, input, expected):
server = mockserver(input)
proto = wireprotoserver.sshv1protocolhandler(
server._ui, server._fin, server._fout
)
_func, spec = wireprotov1server.commands[cmd]
self.assertEqual(proto.getargs(spec), expected)
def mockserver(inbytes):
ui = mockui(inbytes)
repo = mockrepo(ui)
return wireprotoserver.sshserver(ui, repo)
class mockrepo:
def __init__(self, ui):
self.ui = ui
class mockui:
def __init__(self, inbytes):
self.fin = io.BytesIO(inbytes)
self.fout = io.BytesIO()
self.ferr = io.BytesIO()
def protectfinout(self):
return self.fin, self.fout
def restorefinout(self, fin, fout):
pass
if __name__ == '__main__':
# Don't call into msvcrt to set BytesIO to binary mode
procutil.setbinary = lambda fp: True
silenttestrunner.main(__name__)