# HG changeset patch # User Georges Racinet # Date 1698697710 -3600 # Node ID fd1aa5e18f75a3b6556797614def10f5583b34d3 # Parent 0409bd6ba6632da30516756edc7fe62b794f1f22 rust-revlog: using the ad-hoc `NodeTree` in scmutil Now that we have an independent `NodeTree` class able to work natively on the pure Rust index, we use it in `mercurial.scmutil`, with automatic invalidation after mutation of the index. This code path is tested by `test-revisions.t` and `test-template-functions.t` diff -r 0409bd6ba663 -r fd1aa5e18f75 mercurial/scmutil.py --- a/mercurial/scmutil.py Mon Oct 30 22:36:30 2023 +0100 +++ b/mercurial/scmutil.py Mon Oct 30 21:28:30 2023 +0100 @@ -555,20 +555,23 @@ nodetree = None if cache is not None: nodetree = cache.get(b'disambiguationnodetree') + is_invalidated = getattr(nodetree, 'is_invalidated', lambda: False) + if is_invalidated(): + nodetree = None if not nodetree: - if hasattr(parsers, 'nodetree'): - # The CExt is the only implementation to provide a nodetree - # class so far. + if hasattr(parsers, 'nodetree') and isinstance( + cl.index, parsers.index + ): index = cl.index - if hasattr(index, 'get_cindex'): - # the rust wrapped need to give access to its internal index - index = index.get_cindex() nodetree = parsers.nodetree(index, len(revs)) - for r in revs: - nodetree.insert(r) - if cache is not None: - cache[b'disambiguationnodetree'] = nodetree + elif getattr(cl.index, 'is_rust', False): + nodetree = rustrevlog.NodeTree(cl.index) + if nodetree is not None: + for r in revs: + nodetree.insert(r) + if cache is not None: + cache[b'disambiguationnodetree'] = nodetree length = max(nodetree.shortest(node), minlength) prefix = hexnode[:length] return disambiguate(prefix)