Show More
@@ -365,6 +365,14 b' def _trackphasechange(data, rev, old, ne' | |||
|
365 | 365 | data.insert(low + 1, (range(rev, rev + 1), t)) |
|
366 | 366 | |
|
367 | 367 | |
|
368 | # consider incrementaly updating the phase set the update set is not bigger | |
|
369 | # than this size | |
|
370 | # | |
|
371 | # Be warned, this number is picked arbitrarily, without any benchmark. It | |
|
372 | # should blindly pickup "small update" | |
|
373 | INCREMENTAL_PHASE_SETS_UPDATE_MAX_UPDATE = 100 | |
|
374 | ||
|
375 | ||
|
368 | 376 | class phasecache: |
|
369 | 377 | def __init__( |
|
370 | 378 | self, |
@@ -508,19 +516,72 b' class phasecache:' | |||
|
508 | 516 | self._loadedrevslen = len(cl) |
|
509 | 517 | |
|
510 | 518 | def _ensure_phase_sets(self, repo: "localrepo.localrepository") -> None: |
|
511 |
"""ensure phase information is loaded in the object |
|
|
512 | update = False | |
|
519 | """ensure phase information is loaded in the object""" | |
|
520 | assert repo.filtername is None | |
|
521 | update = -1 | |
|
522 | cl = repo.changelog | |
|
523 | cl_size = len(cl) | |
|
513 | 524 | if self._phasesets is None: |
|
514 |
update = |
|
|
515 | elif len(repo.changelog) > self._loadedrevslen: | |
|
516 | update = True | |
|
517 | if update: | |
|
525 | update = 0 | |
|
526 | else: | |
|
527 | if cl_size > self._loadedrevslen: | |
|
528 | # check if an incremental update is worth it. | |
|
529 | # note we need a tradeoff here because the whole logic is not | |
|
530 | # stored and implemented in native code nd datastructure. | |
|
531 | # Otherwise the incremental update woul always be a win. | |
|
532 | missing = cl_size - self._loadedrevslen | |
|
533 | if missing <= INCREMENTAL_PHASE_SETS_UPDATE_MAX_UPDATE: | |
|
534 | update = self._loadedrevslen | |
|
535 | else: | |
|
536 | update = 0 | |
|
537 | ||
|
538 | if update == 0: | |
|
518 | 539 | try: |
|
519 | 540 | res = self._getphaserevsnative(repo) |
|
520 | 541 | self._loadedrevslen, self._phasesets = res |
|
521 | 542 | except AttributeError: |
|
522 | 543 | self._computephaserevspure(repo) |
|
523 | 544 | assert self._loadedrevslen == len(repo.changelog) |
|
545 | elif update > 0: | |
|
546 | # good candidate for native code | |
|
547 | assert update == self._loadedrevslen | |
|
548 | if self.hasnonpublicphases(repo): | |
|
549 | start = self._loadedrevslen | |
|
550 | get_phase = self.phase | |
|
551 | rev_phases = [0] * missing | |
|
552 | parents = cl.parentrevs | |
|
553 | sets = {phase: set() for phase in self._phasesets} | |
|
554 | for phase, roots in self._phaseroots.items(): | |
|
555 | # XXX should really store the max somewhere | |
|
556 | for r in roots: | |
|
557 | if r >= start: | |
|
558 | rev_phases[r - start] = phase | |
|
559 | for rev in range(start, cl_size): | |
|
560 | phase = rev_phases[rev - start] | |
|
561 | p1, p2 = parents(rev) | |
|
562 | if p1 == nullrev: | |
|
563 | p1_phase = public | |
|
564 | elif p1 >= start: | |
|
565 | p1_phase = rev_phases[p1 - start] | |
|
566 | else: | |
|
567 | p1_phase = max(phase, get_phase(repo, p1)) | |
|
568 | if p2 == nullrev: | |
|
569 | p2_phase = public | |
|
570 | elif p2 >= start: | |
|
571 | p2_phase = rev_phases[p2 - start] | |
|
572 | else: | |
|
573 | p2_phase = max(phase, get_phase(repo, p2)) | |
|
574 | phase = max(phase, p1_phase, p2_phase) | |
|
575 | if phase > public: | |
|
576 | rev_phases[rev - start] = phase | |
|
577 | sets[phase].add(rev) | |
|
578 | ||
|
579 | # Be careful to preserve shallow-copied values: do not update | |
|
580 | # phaseroots values, replace them. | |
|
581 | for phase, extra in sets.items(): | |
|
582 | if extra: | |
|
583 | self._phasesets[phase] = self._phasesets[phase] | extra | |
|
584 | self._loadedrevslen = cl_size | |
|
524 | 585 | |
|
525 | 586 | def invalidate(self): |
|
526 | 587 | self._loadedrevslen = 0 |
General Comments 0
You need to be logged in to leave comments.
Login now