##// END OF EJS Templates
dagop: extract DAG local heads functionality from revlog...
Gregory Szorc -
r40036:8af835af default
parent child Browse files
Show More
@@ -773,6 +773,42 b' def headrevs(revs, parentsfn):'
773 773
774 774 return headrevs
775 775
776 def headrevssubset(revsfn, parentrevsfn, startrev=None, stoprevs=None):
777 """Returns the set of all revs that have no children with control.
778
779 ``revsfn`` is a callable that with no arguments returns an iterator over
780 all revision numbers in topological order. With a ``start`` argument, it
781 returns revision numbers starting at that number.
782
783 ``parentrevsfn`` is a callable receiving a revision number and returns an
784 iterable of parent revision numbers, where values can include nullrev.
785
786 ``startrev`` is a revision number at which to start the search.
787
788 ``stoprevs`` is an iterable of revision numbers that, when encountered,
789 will stop DAG traversal beyond them. Parents of revisions in this
790 collection will be heads.
791 """
792 if startrev is None:
793 startrev = nullrev
794
795 stoprevs = set(stoprevs or [])
796
797 reachable = {startrev}
798 heads = {startrev}
799
800 for rev in revsfn(start=startrev + 1):
801 for prev in parentrevsfn(rev):
802 if prev in reachable:
803 if rev not in stoprevs:
804 reachable.add(rev)
805 heads.add(rev)
806
807 if prev in heads and prev not in stoprevs:
808 heads.remove(prev)
809
810 return heads
811
776 812 def linearize(revs, parentsfn):
777 813 """Linearize and topologically sort a list of revisions.
778 814
@@ -1069,25 +1069,16 b' class revlog(object):'
1069 1069 return [self.node(r) for r in self.headrevs()]
1070 1070
1071 1071 if start is None:
1072 start = nullid
1073 if stop is None:
1074 stop = []
1075 stoprevs = set([self.rev(n) for n in stop])
1076 startrev = self.rev(start)
1077 reachable = {startrev}
1078 heads = {startrev}
1079
1080 parentrevs = self.parentrevs
1081 for r in self.revs(start=startrev + 1):
1082 for p in parentrevs(r):
1083 if p in reachable:
1084 if r not in stoprevs:
1085 reachable.add(r)
1086 heads.add(r)
1087 if p in heads and p not in stoprevs:
1088 heads.remove(p)
1089
1090 return [self.node(r) for r in heads]
1072 start = nullrev
1073 else:
1074 start = self.rev(start)
1075
1076 stoprevs = set(self.rev(n) for n in stop or [])
1077
1078 revs = dagop.headrevssubset(self.revs, self.parentrevs, startrev=start,
1079 stoprevs=stoprevs)
1080
1081 return [self.node(rev) for rev in revs]
1091 1082
1092 1083 def children(self, node):
1093 1084 """find the children of a given node"""
General Comments 0
You need to be logged in to leave comments. Login now