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()