mercurial/revlog.py
changeset 17672 474047947b8f
parent 17537 31f32a96e1e3
child 17673 d686c6876ef6
equal deleted inserted replaced
17671:fdd0fc046cf1 17672:474047947b8f
   254     def __len__(self):
   254     def __len__(self):
   255         return len(self.index) - 1
   255         return len(self.index) - 1
   256     def __iter__(self):
   256     def __iter__(self):
   257         for i in xrange(len(self)):
   257         for i in xrange(len(self)):
   258             yield i
   258             yield i
       
   259     def revs(self, start=0, stop=None):
       
   260         """iterate over all rev in this revlog (from start to stop)"""
       
   261         if stop is None:
       
   262             stop = len(self)
       
   263         else:
       
   264             stop += 1
       
   265         return xrange(start, stop)
   259 
   266 
   260     @util.propertycache
   267     @util.propertycache
   261     def nodemap(self):
   268     def nodemap(self):
   262         self.rev(self.node(0))
   269         self.rev(self.node(0))
   263         return self._nodecache
   270         return self._nodecache
   372             for i in self:
   379             for i in self:
   373                 yield i
   380                 yield i
   374             return
   381             return
   375 
   382 
   376         seen = set(revs)
   383         seen = set(revs)
   377         for i in xrange(first + 1, len(self)):
   384         for i in self.revs(start=first + 1):
   378             for x in self.parentrevs(i):
   385             for x in self.parentrevs(i):
   379                 if x != nullrev and x in seen:
   386                 if x != nullrev and x in seen:
   380                     seen.add(i)
   387                     seen.add(i)
   381                     yield i
   388                     yield i
   382                     break
   389                     break
   547         # Our topologically sorted list of output nodes.
   554         # Our topologically sorted list of output nodes.
   548         orderedout = []
   555         orderedout = []
   549         # Don't start at nullid since we don't want nullid in our output list,
   556         # Don't start at nullid since we don't want nullid in our output list,
   550         # and if nullid shows up in descendants, empty parents will look like
   557         # and if nullid shows up in descendants, empty parents will look like
   551         # they're descendants.
   558         # they're descendants.
   552         for r in xrange(max(lowestrev, 0), highestrev + 1):
   559         for r in self.revs(start=max(lowestrev, 0), stop=highestrev + 1):
   553             n = self.node(r)
   560             n = self.node(r)
   554             isdescendant = False
   561             isdescendant = False
   555             if lowestrev == nullrev:  # Everybody is a descendant of nullid
   562             if lowestrev == nullrev:  # Everybody is a descendant of nullid
   556                 isdescendant = True
   563                 isdescendant = True
   557             elif n in descendants:
   564             elif n in descendants:
   604         count = len(self)
   611         count = len(self)
   605         if not count:
   612         if not count:
   606             return [nullrev]
   613             return [nullrev]
   607         ishead = [1] * (count + 1)
   614         ishead = [1] * (count + 1)
   608         index = self.index
   615         index = self.index
   609         for r in xrange(count):
   616         for r in self:
   610             e = index[r]
   617             e = index[r]
   611             ishead[e[5]] = ishead[e[6]] = 0
   618             ishead[e[5]] = ishead[e[6]] = 0
   612         return [r for r in xrange(count) if ishead[r]]
   619         return [r for r in xrange(count) if ishead[r]]
   613 
   620 
   614     def heads(self, start=None, stop=None):
   621     def heads(self, start=None, stop=None):
   632         startrev = self.rev(start)
   639         startrev = self.rev(start)
   633         reachable = set((startrev,))
   640         reachable = set((startrev,))
   634         heads = set((startrev,))
   641         heads = set((startrev,))
   635 
   642 
   636         parentrevs = self.parentrevs
   643         parentrevs = self.parentrevs
   637         for r in xrange(startrev + 1, len(self)):
   644         for r in self.revs(start=startrev + 1):
   638             for p in parentrevs(r):
   645             for p in parentrevs(r):
   639                 if p in reachable:
   646                 if p in reachable:
   640                     if r not in stoprevs:
   647                     if r not in stoprevs:
   641                         reachable.add(r)
   648                         reachable.add(r)
   642                     heads.add(r)
   649                     heads.add(r)
   647 
   654 
   648     def children(self, node):
   655     def children(self, node):
   649         """find the children of a given node"""
   656         """find the children of a given node"""
   650         c = []
   657         c = []
   651         p = self.rev(node)
   658         p = self.rev(node)
   652         for r in range(p + 1, len(self)):
   659         for r in self.revs(start=p + 1):
   653             prevs = [pr for pr in self.parentrevs(r) if pr != nullrev]
   660             prevs = [pr for pr in self.parentrevs(r) if pr != nullrev]
   654             if prevs:
   661             if prevs:
   655                 for pr in prevs:
   662                 for pr in prevs:
   656                     if pr == p:
   663                     if pr == p:
   657                         c.append(self.node(r))
   664                         c.append(self.node(r))