# HG changeset patch # User Pierre-Yves David # Date 1710327071 -3600 # Node ID 2664cacd2457d54ef37f26b2d835d6e5dd3ba937 # Parent b4a6a1ff8fce2b240f26388f2701e30f98b52fd1 tags-cache: directly operate on rev-num warming hgtagsfnodescache Not having to goes through nodeid speed up things notably. ### data-env-vars.name = mozilla-try-2023-03-22-zstd-sparse-revlog # benchmark.name = hg.debug.debug-update-cache # bin-env-vars.hg.flavor = default # bin-env-vars.hg.py-re2-module = default # benchmark.variants.pre-state = warm before-this-series: 19.947581 before-this-changes: 18.916804 (-5.17%, -1.03) this-changesets: 17.493725 (-12.30%, -2.45) diff -r b4a6a1ff8fce -r 2664cacd2457 mercurial/tags.py --- a/mercurial/tags.py Wed Mar 13 11:38:28 2024 +0100 +++ b/mercurial/tags.py Wed Mar 13 11:51:11 2024 +0100 @@ -83,9 +83,7 @@ def warm_cache(repo): """ensure the cache is properly filled""" unfi = repo.unfiltered() - tonode = unfi.changelog.node - nodes = [tonode(r) for r in unfi.changelog.revs()] - _getfnodes(repo.ui, repo, nodes) + _getfnodes(repo.ui, repo, revs=unfi.changelog.revs()) def fnoderevs(ui, repo, revs): @@ -498,7 +496,7 @@ return (repoheads, cachefnode, valid, None, True) -def _getfnodes(ui, repo, nodes): +def _getfnodes(ui, repo, nodes=None, revs=None): """return .hgtags fnodes for a list of changeset nodes Return value is a {node: fnode} mapping. There will be no entry for nodes @@ -510,9 +508,21 @@ validated_fnodes = set() unknown_entries = set() + if nodes is None and revs is None: + raise error.ProgrammingError("need to specify either nodes or revs") + elif nodes is not None and revs is None: + to_rev = repo.changelog.index.rev + nodes_revs = ((n, to_rev(n)) for n in nodes) + elif nodes is None and revs is not None: + to_node = repo.changelog.node + nodes_revs = ((to_node(r), r) for r in revs) + else: + msg = "need to specify only one of nodes or revs" + raise error.ProgrammingError(msg) + flog = None - for node in nodes: - fnode = fnodescache.getfnode(node) + for node, rev in nodes_revs: + fnode = fnodescache.getfnode(node=node, rev=rev) if fnode != repo.nullid: if fnode not in validated_fnodes: if flog is None: @@ -765,7 +775,7 @@ # TODO: zero fill entire record, because it's invalid not missing? self._raw.extend(b'\xff' * (wantedlen - rawlen)) - def getfnode(self, node, computemissing=True): + def getfnode(self, node, computemissing=True, rev=None): """Obtain the filenode of the .hgtags file at a specified revision. If the value is in the cache, the entry will be validated and returned. @@ -780,7 +790,8 @@ if node == self._repo.nullid: return node - rev = self._repo.changelog.rev(node) + if rev is None: + rev = self._repo.changelog.rev(node) self.lookupcount += 1