diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py --- a/mercurial/dirstate.py +++ b/mercurial/dirstate.py @@ -27,6 +27,12 @@ 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 @@ # 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 @@ 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.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 @@ # '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):