Mercurial > hg
changeset 51252:fd1aa5e18f75
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`
author | Georges Racinet <georges.racinet@octobus.net> |
---|---|
date | Mon, 30 Oct 2023 21:28:30 +0100 |
parents | 0409bd6ba663 |
children | 96e05f1a99bd |
files | mercurial/scmutil.py |
diffstat | 1 files changed, 13 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- 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)