mercurial/changelog.py
changeset 43447 476754edac1f
parent 43446 5ade47284dda
child 43448 c31fa28d1843
equal deleted inserted replaced
43446:5ade47284dda 43447:476754edac1f
    19     copies,
    19     copies,
    20     encoding,
    20     encoding,
    21     error,
    21     error,
    22     pycompat,
    22     pycompat,
    23     revlog,
    23     revlog,
    24     util,
       
    25 )
    24 )
    26 from .utils import (
    25 from .utils import (
    27     dateutil,
    26     dateutil,
    28     stringutil,
    27     stringutil,
    29 )
    28 )
   402         self._delayed = False
   401         self._delayed = False
   403         self._delaybuf = None
   402         self._delaybuf = None
   404         self._divert = False
   403         self._divert = False
   405         self.filteredrevs = frozenset()
   404         self.filteredrevs = frozenset()
   406         self._copiesstorage = opener.options.get(b'copies-storage')
   405         self._copiesstorage = opener.options.get(b'copies-storage')
   407 
       
   408     def _checknofilteredinrevs(self, revs):
       
   409         """raise the appropriate error if 'revs' contains a filtered revision
       
   410 
       
   411         This returns a version of 'revs' to be used thereafter by the caller.
       
   412         In particular, if revs is an iterator, it is converted into a set.
       
   413         """
       
   414         safehasattr = util.safehasattr
       
   415         if safehasattr(revs, '__next__'):
       
   416             # Note that inspect.isgenerator() is not true for iterators,
       
   417             revs = set(revs)
       
   418 
       
   419         filteredrevs = self.filteredrevs
       
   420         if safehasattr(revs, 'first'):  # smartset
       
   421             offenders = revs & filteredrevs
       
   422         else:
       
   423             offenders = filteredrevs.intersection(revs)
       
   424 
       
   425         for rev in offenders:
       
   426             raise error.FilteredIndexError(rev)
       
   427         return revs
       
   428 
       
   429     def headrevs(self, revs=None):
       
   430         if revs is None and self.filteredrevs:
       
   431             try:
       
   432                 return self.index.headrevsfiltered(self.filteredrevs)
       
   433             # AttributeError covers non-c-extension environments and
       
   434             # old c extensions without filter handling.
       
   435             except AttributeError:
       
   436                 return self._headrevs()
       
   437 
       
   438         if self.filteredrevs:
       
   439             revs = self._checknofilteredinrevs(revs)
       
   440         return super(changelog, self).headrevs(revs)
       
   441 
   406 
   442     def strip(self, *args, **kwargs):
   407     def strip(self, *args, **kwargs):
   443         # XXX make something better than assert
   408         # XXX make something better than assert
   444         # We can't expect proper strip behavior if we are filtered.
   409         # We can't expect proper strip behavior if we are filtered.
   445         assert not self.filteredrevs
   410         assert not self.filteredrevs