Mercurial > public > mercurial-scm > hg
comparison mercurial/obsolete.py @ 51641: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 |
comparison
equal
deleted
inserted
replaced
51639:69c5f8d6c710 | 51641:f28c52a9f7b4 |
---|---|
769 _addpredecessors(self.predecessors, markers) | 769 _addpredecessors(self.predecessors, markers) |
770 if self._cached('children'): | 770 if self._cached('children'): |
771 _addchildren(self.children, markers) | 771 _addchildren(self.children, markers) |
772 _checkinvalidmarkers(self.repo, markers) | 772 _checkinvalidmarkers(self.repo, markers) |
773 | 773 |
774 def relevantmarkers(self, nodes): | 774 def relevantmarkers(self, nodes=None, revs=None): |
775 """return a set of all obsolescence markers relevant to a set of nodes. | 775 """return a set of all obsolescence markers relevant to a set of |
776 | 776 nodes or revisions. |
777 "relevant" to a set of nodes mean: | 777 |
778 "relevant" to a set of nodes or revisions mean: | |
778 | 779 |
779 - marker that use this changeset as successor | 780 - marker that use this changeset as successor |
780 - prune marker of direct children on this changeset | 781 - prune marker of direct children on this changeset |
781 - recursive application of the two rules on predecessors of these | 782 - recursive application of the two rules on predecessors of these |
782 markers | 783 markers |
783 | 784 |
784 It is a set so you cannot rely on order.""" | 785 It is a set so you cannot rely on order.""" |
785 | 786 if nodes is None: |
786 pendingnodes = set(nodes) | 787 nodes = set() |
788 if revs is None: | |
789 revs = set() | |
790 | |
791 get_rev = self.repo.unfiltered().changelog.index.get_rev | |
792 pendingnodes = set() | |
793 for marker in self._all: | |
794 for node in (marker[0],) + marker[1] + (marker[5] or ()): | |
795 if node in nodes: | |
796 pendingnodes.add(node) | |
797 elif revs: | |
798 rev = get_rev(node) | |
799 if rev is not None and rev in revs: | |
800 pendingnodes.add(node) | |
787 seenmarkers = set() | 801 seenmarkers = set() |
788 seennodes = set(pendingnodes) | 802 seenmarkers = set() |
803 seennodes = set() | |
789 precursorsmarkers = self.predecessors | 804 precursorsmarkers = self.predecessors |
790 succsmarkers = self.successors | 805 succsmarkers = self.successors |
791 children = self.children | 806 children = self.children |
792 while pendingnodes: | 807 while pendingnodes: |
793 direct = set() | 808 direct = set() |