Mercurial > public > mercurial-scm > hg
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 |