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 |