mercurial/phases.py
changeset 51412 1df8d84e7c99
parent 51409 89b638afeb07
child 51413 0c04074f5414
equal deleted inserted replaced
51411:630d5283ee82 51412:1df8d84e7c99
   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