diff --git a/mercurial/revlog.py b/mercurial/revlog.py --- a/mercurial/revlog.py +++ b/mercurial/revlog.py @@ -97,6 +97,10 @@ REVIDX_RAWTEXT_CHANGING_FLAGS parsers = policy.importmod(r'parsers') +try: + from . import rustext +except ImportError: + rustext = None # Aliased for performance. _zlibdecompress = zlib.decompress @@ -779,12 +783,28 @@ for r in revs: checkrev(r) # and we're sure ancestors aren't filtered as well - if util.safehasattr(parsers, 'rustlazyancestors'): - return ancestor.rustlazyancestors( - self.index, revs, - stoprev=stoprev, inclusive=inclusive) - return ancestor.lazyancestors(self._uncheckedparentrevs, revs, - stoprev=stoprev, inclusive=inclusive) + + # rustext can be an unloaded module (see hgdemandimport) + # so we need to trigger an actual import to check for its presence, + # which is done by looking up any attribute. + # If in the future we reach the point where the ancestor module + # can be imported by policy, we will be able to get rid of this + global rustext + if rustext is not None: + try: + rustext.__name__ + except ImportError: + rustext = None + if rustext is not None: + lazyancestors = rustext.ancestor.lazyancestors + arg = self.index + elif util.safehasattr(parsers, 'rustlazyancestors'): + lazyancestors = ancestor.rustlazyancestors + arg = self.index + else: + lazyancestors = ancestor.lazyancestors + arg = self._uncheckedparentrevs + return lazyancestors(arg, revs, stoprev=stoprev, inclusive=inclusive) def descendants(self, revs): return dagop.descendantrevs(revs, self.revs, self.parentrevs)