mercurial/revlog.py
changeset 3928 4df475e22248
parent 3893 6b4127c7d52a
parent 3925 27230c29bfec
child 3930 01d98d68d697
equal deleted inserted replaced
3924:a8bd7280330f 3928:4df475e22248
   714         assert orderedout
   714         assert orderedout
   715         assert roots
   715         assert roots
   716         assert heads
   716         assert heads
   717         return (orderedout, roots, heads)
   717         return (orderedout, roots, heads)
   718 
   718 
   719     def heads(self, start=None):
   719     def heads(self, start=None, stop=None):
   720         """return the list of all nodes that have no children
   720         """return the list of all nodes that have no children
   721 
   721 
   722         if start is specified, only heads that are descendants of
   722         if start is specified, only heads that are descendants of
   723         start will be returned
   723         start will be returned
   724 
   724         if stop is specified, it will consider all the revs from stop
       
   725         as if they had no children
   725         """
   726         """
   726         if start is None:
   727         if start is None:
   727             start = nullid
   728             start = nullid
       
   729         if stop is None:
       
   730             stop = []
       
   731         stoprevs = dict.fromkeys([self.rev(n) for n in stop])
   728         startrev = self.rev(start)
   732         startrev = self.rev(start)
   729         reachable = {startrev: 1}
   733         reachable = {startrev: 1}
   730         heads = {startrev: 1}
   734         heads = {startrev: 1}
   731 
   735 
   732         parentrevs = self.parentrevs
   736         parentrevs = self.parentrevs
   733         for r in xrange(startrev + 1, self.count()):
   737         for r in xrange(startrev + 1, self.count()):
   734             for p in parentrevs(r):
   738             for p in parentrevs(r):
   735                 if p in reachable:
   739                 if p in reachable:
   736                     reachable[r] = 1
   740                     if r not in stoprevs:
       
   741                         reachable[r] = 1
   737                     heads[r] = 1
   742                     heads[r] = 1
   738                 if p in heads:
   743                 if p in heads and p not in stoprevs:
   739                     del heads[p]
   744                     del heads[p]
       
   745 
   740         return [self.node(r) for r in heads]
   746         return [self.node(r) for r in heads]
   741 
   747 
   742     def children(self, node):
   748     def children(self, node):
   743         """find the children of a given node"""
   749         """find the children of a given node"""
   744         c = []
   750         c = []