# HG changeset patch # User Raphaël Gomès # Date 2019-05-06 20:51:10 # Node ID 9c6c0f736e1d9199d5234226009f7b9e5792fab0 # Parent e240bec26626eaa5fdd7a428ce36a920023c62f6 rust-dirstate: call parse/pack bindings from Python A future patch will need to address the issue of Rust module policy, to avoid having ugly duplicate imports and conditionals all over the place. As the rewrite of dirstate in Rust progresses, we will need fewer of those "contact points". Differential Revision: https://phab.mercurial-scm.org/D6350 diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py --- a/mercurial/dirstate.py +++ b/mercurial/dirstate.py @@ -27,6 +27,12 @@ from . import ( util, ) +try: + from . import rustext + rustext.__name__ # force actual import (see hgdemandimport) +except ImportError: + rustext = None + parsers = policy.importmod(r'parsers') propertycache = util.propertycache @@ -1465,7 +1471,12 @@ class dirstatemap(object): # parsing the dirstate. # # (we cannot decorate the function directly since it is in a C module) - parse_dirstate = util.nogc(parsers.parse_dirstate) + if rustext is not None: + parse_dirstate = rustext.dirstate.parse_dirstate + else: + parse_dirstate = parsers.parse_dirstate + + parse_dirstate = util.nogc(parse_dirstate) p = parse_dirstate(self._map, self.copymap, st) if not self._dirtyparents: self.setparents(*p) @@ -1476,7 +1487,12 @@ class dirstatemap(object): self.get = self._map.get def write(self, st, now): - st.write(parsers.pack_dirstate(self._map, self.copymap, + if rustext is not None: + pack_dirstate = rustext.dirstate.pack_dirstate + else: + pack_dirstate = parsers.pack_dirstate + + st.write(pack_dirstate(self._map, self.copymap, self.parents(), now)) st.close() self._dirtyparents = False diff --git a/tests/fakedirstatewritetime.py b/tests/fakedirstatewritetime.py --- a/tests/fakedirstatewritetime.py +++ b/tests/fakedirstatewritetime.py @@ -16,6 +16,12 @@ from mercurial import ( ) from mercurial.utils import dateutil +try: + from mercurial import rustext + rustext.__name__ # force actual import (see hgdemandimport) +except ImportError: + rustext = None + configtable = {} configitem = registrar.configitem(configtable) @@ -51,16 +57,22 @@ def fakewrite(ui, func): # 'fakenow' value and 'touch -t YYYYmmddHHMM' argument easy fakenow = dateutil.parsedate(fakenow, [b'%Y%m%d%H%M'])[0] - orig_pack_dirstate = parsers.pack_dirstate + if rustext is not None: + orig_module = rustext.dirstate + orig_pack_dirstate = rustext.dirstate.pack_dirstate + else: + orig_module = parsers + orig_pack_dirstate = parsers.pack_dirstate + orig_dirstate_getfsnow = dirstate._getfsnow wrapper = lambda *args: pack_dirstate(fakenow, orig_pack_dirstate, *args) - parsers.pack_dirstate = wrapper + orig_module.pack_dirstate = wrapper dirstate._getfsnow = lambda *args: fakenow try: return func() finally: - parsers.pack_dirstate = orig_pack_dirstate + orig_module.pack_dirstate = orig_pack_dirstate dirstate._getfsnow = orig_dirstate_getfsnow def _poststatusfixup(orig, workingctx, status, fixup):