context: introduce an `isintroducedafter` method and use it in copies
Right now, copy tracing make effort to not traverse the graph too much to save
performance. It uses a "limit" acting as a floor revision past which data are
no longer relevant to the current copy tracing.
However, to enforce this limit, it does a call to `filectx.rev()` and that
call can trigger a graph traversal on its own. That extra graph traversal is
unaware of the current limit and can become very expensive. That cost is
increased by the nature of work done in adjust link rev, we are not only
walking down the graph, we are also checking the affected file for each
revision we walk through. Something significantly more expensive than the walk
itself.
To work around this we need to make the `filectx` operation aware of the
current limit. The first step is to introduce a dedicated method:
`isintroducedafter`. We'll then rework that method logic to stop traversal as
soon as possible.
from __future__ import absolute_import, print_function
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(object):
def __init__(self, ui):
self.ui = ui
class mockui(object):
def __init__(self, inbytes):
self.fin = io.BytesIO(inbytes)
self.fout = io.BytesIO()
self.ferr = io.BytesIO()
if __name__ == '__main__':
# Don't call into msvcrt to set BytesIO to binary mode
procutil.setbinary = lambda fp: True
silenttestrunner.main(__name__)