mercurial/revlog.py
changeset 40000 8af835af0a85
parent 39999 0b24fcd88066
child 40004 fa3dc85a747e
--- a/mercurial/revlog.py	Fri Sep 28 10:03:32 2018 -0700
+++ b/mercurial/revlog.py	Fri Sep 28 10:20:37 2018 -0700
@@ -1069,25 +1069,16 @@
             return [self.node(r) for r in self.headrevs()]
 
         if start is None:
-            start = nullid
-        if stop is None:
-            stop = []
-        stoprevs = set([self.rev(n) for n in stop])
-        startrev = self.rev(start)
-        reachable = {startrev}
-        heads = {startrev}
-
-        parentrevs = self.parentrevs
-        for r in self.revs(start=startrev + 1):
-            for p in parentrevs(r):
-                if p in reachable:
-                    if r not in stoprevs:
-                        reachable.add(r)
-                    heads.add(r)
-                if p in heads and p not in stoprevs:
-                    heads.remove(p)
-
-        return [self.node(r) for r in heads]
+            start = nullrev
+        else:
+            start = self.rev(start)
+
+        stoprevs = set(self.rev(n) for n in stop or [])
+
+        revs = dagop.headrevssubset(self.revs, self.parentrevs, startrev=start,
+                                    stoprevs=stoprevs)
+
+        return [self.node(rev) for rev in revs]
 
     def children(self, node):
         """find the children of a given node"""