comparison mercurial/revlog.py @ 51262:f20c4b307a5a

rust-index: add fast-path for getting a list of all heads as nodes This avoids a lot of back-and-forth between Python and Rust. We forgo adding a fast-path in the `filteredchangelog` case yet. If it shows up in profiling, we might add the variant with a filter.
author Raphaël Gomès <rgomes@octobus.net>
date Tue, 05 Dec 2023 14:50:05 +0100
parents f94c10334bcb
children ceeb8fa23cc8
comparison
equal deleted inserted replaced
51261:9088c6d65ef6 51262:f20c4b307a5a
2360 ishead[r] = 1 # I may be an head 2360 ishead[r] = 1 # I may be an head
2361 e = index[r] 2361 e = index[r]
2362 ishead[e[5]] = ishead[e[6]] = 0 # my parent are not 2362 ishead[e[5]] = ishead[e[6]] = 0 # my parent are not
2363 return [r for r, val in enumerate(ishead) if val] 2363 return [r for r, val in enumerate(ishead) if val]
2364 2364
2365 def _head_node_ids(self):
2366 try:
2367 return self.index.head_node_ids()
2368 except AttributeError:
2369 return [self.node(r) for r in self.headrevs()]
2370
2365 def heads(self, start=None, stop=None): 2371 def heads(self, start=None, stop=None):
2366 """return the list of all nodes that have no children 2372 """return the list of all nodes that have no children
2367 2373
2368 if start is specified, only heads that are descendants of 2374 if start is specified, only heads that are descendants of
2369 start will be returned 2375 start will be returned
2371 as if they had no children 2377 as if they had no children
2372 """ 2378 """
2373 if start is None and stop is None: 2379 if start is None and stop is None:
2374 if not len(self): 2380 if not len(self):
2375 return [self.nullid] 2381 return [self.nullid]
2376 return [self.node(r) for r in self.headrevs()] 2382 return self._head_node_ids()
2377
2378 if start is None: 2383 if start is None:
2379 start = nullrev 2384 start = nullrev
2380 else: 2385 else:
2381 start = self.rev(start) 2386 start = self.rev(start)
2382 2387