comparison mercurial/changelog.py @ 43447:476754edac1f

repoview: move changelog.headrevs() override to filteredchangelog Differential Revision: https://phab.mercurial-scm.org/D7241
author Martin von Zweigbergk <martinvonz@google.com>
date Tue, 05 Nov 2019 14:16:46 -0800
parents 5ade47284dda
children c31fa28d1843
comparison
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