381 self._phasesets: PhaseSets = None |
381 self._phasesets: PhaseSets = None |
382 |
382 |
383 def hasnonpublicphases(self, repo: "localrepo.localrepository") -> bool: |
383 def hasnonpublicphases(self, repo: "localrepo.localrepository") -> bool: |
384 """detect if there are revisions with non-public phase""" |
384 """detect if there are revisions with non-public phase""" |
385 repo = repo.unfiltered() |
385 repo = repo.unfiltered() |
386 cl = repo.changelog |
386 self._ensure_phase_sets(repo) |
387 if len(cl) > self._loadedrevslen: |
|
388 self.invalidate() |
|
389 self.loadphaserevs(repo) |
|
390 return any( |
387 return any( |
391 revs for phase, revs in self._phaseroots.items() if phase != public |
388 revs for phase, revs in self._phaseroots.items() if phase != public |
392 ) |
389 ) |
393 |
390 |
394 def nonpublicphaseroots( |
391 def nonpublicphaseroots( |
398 |
395 |
399 The roots are not minimized, so if the secret revisions are |
396 The roots are not minimized, so if the secret revisions are |
400 descendants of draft revisions, their roots will still be present. |
397 descendants of draft revisions, their roots will still be present. |
401 """ |
398 """ |
402 repo = repo.unfiltered() |
399 repo = repo.unfiltered() |
403 cl = repo.changelog |
400 self._ensure_phase_sets(repo) |
404 if len(cl) > self._loadedrevslen: |
|
405 self.invalidate() |
|
406 self.loadphaserevs(repo) |
|
407 return set().union( |
401 return set().union( |
408 *[ |
402 *[ |
409 revs |
403 revs |
410 for phase, revs in self._phaseroots.items() |
404 for phase, revs in self._phaseroots.items() |
411 if phase != public |
405 if phase != public |
418 phases: Iterable[int], |
412 phases: Iterable[int], |
419 subset: Optional[Any] = None, |
413 subset: Optional[Any] = None, |
420 ) -> Any: |
414 ) -> Any: |
421 # TODO: finish typing this |
415 # TODO: finish typing this |
422 """return a smartset for the given phases""" |
416 """return a smartset for the given phases""" |
423 self.loadphaserevs(repo) # ensure phase's sets are loaded |
417 self._ensure_phase_sets(repo) # ensure phase's sets are loaded |
424 phases = set(phases) |
418 phases = set(phases) |
425 publicphase = public in phases |
419 publicphase = public in phases |
426 |
420 |
427 if publicphase: |
421 if publicphase: |
428 # In this case, phases keeps all the *other* phases. |
422 # In this case, phases keeps all the *other* phases. |
509 ps.difference_update(lowerroots) |
503 ps.difference_update(lowerroots) |
510 lowerroots.update(ps) |
504 lowerroots.update(ps) |
511 self._phasesets[phase] = ps |
505 self._phasesets[phase] = ps |
512 self._loadedrevslen = len(cl) |
506 self._loadedrevslen = len(cl) |
513 |
507 |
514 def loadphaserevs(self, repo: "localrepo.localrepository") -> None: |
508 def _ensure_phase_sets(self, repo: "localrepo.localrepository") -> None: |
515 """ensure phase information is loaded in the object""" |
509 """ensure phase information is loaded in the object and up to date""" |
|
510 update = False |
516 if self._phasesets is None: |
511 if self._phasesets is None: |
|
512 update = True |
|
513 elif len(repo.changelog) > self._loadedrevslen: |
|
514 update = True |
|
515 if update: |
517 try: |
516 try: |
518 res = self._getphaserevsnative(repo) |
517 res = self._getphaserevsnative(repo) |
519 self._loadedrevslen, self._phasesets = res |
518 self._loadedrevslen, self._phasesets = res |
520 except AttributeError: |
519 except AttributeError: |
521 self._computephaserevspure(repo) |
520 self._computephaserevspure(repo) |
|
521 assert self._loadedrevslen == len(repo.changelog) |
522 |
522 |
523 def invalidate(self): |
523 def invalidate(self): |
524 self._loadedrevslen = 0 |
524 self._loadedrevslen = 0 |
525 self._phasesets = None |
525 self._phasesets = None |
526 |
526 |
532 # be replaced without us being notified. |
532 # be replaced without us being notified. |
533 if rev == nullrev: |
533 if rev == nullrev: |
534 return public |
534 return public |
535 if rev < nullrev: |
535 if rev < nullrev: |
536 raise ValueError(_(b'cannot lookup negative revision')) |
536 raise ValueError(_(b'cannot lookup negative revision')) |
|
537 # double check self._loadedrevslen to avoid an extra method call as |
|
538 # python is slow for that. |
537 if rev >= self._loadedrevslen: |
539 if rev >= self._loadedrevslen: |
538 self.invalidate() |
540 self._ensure_phase_sets(repo) |
539 self.loadphaserevs(repo) |
|
540 for phase in trackedphases: |
541 for phase in trackedphases: |
541 if rev in self._phasesets[phase]: |
542 if rev in self._phasesets[phase]: |
542 return phase |
543 return phase |
543 return public |
544 return public |
544 |
545 |