Mercurial > public > mercurial-scm > hg-stable
diff mercurial/obsolete.py @ 51642:f28c52a9f7b4
exchange: improve computation of relevant markers for large repos
Find the candidates for nodes with relevant markers by going over
all markers instead of iterating over all nodes. Most nodes will
not have markers anyway.
Further optimize the code by allowing revsets as well, which reduces the
materialization cost.
author | Joerg Sonnenberger <joerg@bec.de> |
---|---|
date | Tue, 11 Jun 2024 18:47:50 +0200 |
parents | bf1d26bd5b6a |
children | ff523675cd69 |
line wrap: on
line diff
--- a/mercurial/obsolete.py Wed Jun 12 11:29:11 2024 +0200 +++ b/mercurial/obsolete.py Tue Jun 11 18:47:50 2024 +0200 @@ -771,10 +771,11 @@ _addchildren(self.children, markers) _checkinvalidmarkers(self.repo, markers) - def relevantmarkers(self, nodes): - """return a set of all obsolescence markers relevant to a set of nodes. + def relevantmarkers(self, nodes=None, revs=None): + """return a set of all obsolescence markers relevant to a set of + nodes or revisions. - "relevant" to a set of nodes mean: + "relevant" to a set of nodes or revisions mean: - marker that use this changeset as successor - prune marker of direct children on this changeset @@ -782,10 +783,24 @@ markers It is a set so you cannot rely on order.""" + if nodes is None: + nodes = set() + if revs is None: + revs = set() - pendingnodes = set(nodes) + get_rev = self.repo.unfiltered().changelog.index.get_rev + pendingnodes = set() + for marker in self._all: + for node in (marker[0],) + marker[1] + (marker[5] or ()): + if node in nodes: + pendingnodes.add(node) + elif revs: + rev = get_rev(node) + if rev is not None and rev in revs: + pendingnodes.add(node) seenmarkers = set() - seennodes = set(pendingnodes) + seenmarkers = set() + seennodes = set() precursorsmarkers = self.predecessors succsmarkers = self.successors children = self.children