comparison mercurial/branchmap.py @ 51532:a0ef462cf1a4

branchcache: filter obsolete revisions sooner Since we won't do anything with the obsolete revisions, we can just ignore them sooner.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Wed, 06 Mar 2024 15:54:22 +0100
parents f85f23f1479b
children 50850689d3c0
comparison
equal deleted inserted replaced
51531:f85f23f1479b 51532:a0ef462cf1a4
282 missing heads, and a generator of nodes that are strictly a superset of 282 missing heads, and a generator of nodes that are strictly a superset of
283 heads missing, this function updates self to be correct. 283 heads missing, this function updates self to be correct.
284 """ 284 """
285 starttime = util.timer() 285 starttime = util.timer()
286 cl = repo.changelog 286 cl = repo.changelog
287 # Faster than using ctx.obsolete()
288 obsrevs = obsolete.getrevs(repo, b'obsolete')
287 # collect new branch entries 289 # collect new branch entries
288 newbranches = {} 290 newbranches = {}
289 getbranchinfo = repo.revbranchcache().branchinfo 291 getbranchinfo = repo.revbranchcache().branchinfo
290 max_rev = -1 292 max_rev = -1
291 for r in revgen: 293 for r in revgen:
294 max_rev = max(max_rev, r)
295 if r in obsrevs:
296 # We ignore obsolete changesets as they shouldn't be
297 # considered heads.
298 continue
292 branch, closesbranch = getbranchinfo(r) 299 branch, closesbranch = getbranchinfo(r)
293 newbranches.setdefault(branch, []).append(r) 300 newbranches.setdefault(branch, []).append(r)
294 if closesbranch: 301 if closesbranch:
295 self._closednodes.add(cl.node(r)) 302 self._closednodes.add(cl.node(r))
296 max_rev = max(max_rev, r)
297 if max_rev < 0: 303 if max_rev < 0:
298 msg = "running branchcache.update without revision to update" 304 msg = "running branchcache.update without revision to update"
299 raise error.ProgrammingError(msg) 305 raise error.ProgrammingError(msg)
300 306
301 # Delay fetching the topological heads until they are needed. 307 # Delay fetching the topological heads until they are needed.
303 topoheads = None 309 topoheads = None
304 310
305 # If a changeset is visible, its parents must be visible too, so 311 # If a changeset is visible, its parents must be visible too, so
306 # use the faster unfiltered parent accessor. 312 # use the faster unfiltered parent accessor.
307 parentrevs = repo.unfiltered().changelog.parentrevs 313 parentrevs = repo.unfiltered().changelog.parentrevs
308
309 # Faster than using ctx.obsolete()
310 obsrevs = obsolete.getrevs(repo, b'obsolete')
311 314
312 for branch, newheadrevs in newbranches.items(): 315 for branch, newheadrevs in newbranches.items():
313 # For every branch, compute the new branchheads. 316 # For every branch, compute the new branchheads.
314 # A branchhead is a revision such that no descendant is on 317 # A branchhead is a revision such that no descendant is on
315 # the same branch. 318 # the same branch.
347 # This computation is heavy and avoided if at all possible. 350 # This computation is heavy and avoided if at all possible.
348 bheads = self._entries.get(branch, []) 351 bheads = self._entries.get(branch, [])
349 bheadset = {cl.rev(node) for node in bheads} 352 bheadset = {cl.rev(node) for node in bheads}
350 uncertain = set() 353 uncertain = set()
351 for newrev in sorted(newheadrevs): 354 for newrev in sorted(newheadrevs):
352 if newrev in obsrevs:
353 # We ignore obsolete changesets as they shouldn't be
354 # considered heads.
355 continue
356
357 if not bheadset: 355 if not bheadset:
358 bheadset.add(newrev) 356 bheadset.add(newrev)
359 continue 357 continue
360 358
361 parents = [p for p in parentrevs(newrev) if p != nullrev] 359 parents = [p for p in parentrevs(newrev) if p != nullrev]