Mercurial > hg
comparison mercurial/changelog.py @ 41763:6843379bf99e
changelog: prefilter in headrevs()
In case where headrevs() is called on some revisions, we perform
the check that aren't filtered in advance, and switch revlog to
use its unchecked form.
This allows to work with alternative implementations that don't have knowledge
of the filtering system, such as the Rust one.
author | Georges Racinet <georges.racinet@octobus.net> |
---|---|
date | Wed, 20 Feb 2019 11:49:06 +0100 |
parents | b436059c1cca |
children | ae189674bdad |
comparison
equal
deleted
inserted
replaced
41762:cde37ed080c9 | 41763:6843379bf99e |
---|---|
20 from . import ( | 20 from . import ( |
21 encoding, | 21 encoding, |
22 error, | 22 error, |
23 pycompat, | 23 pycompat, |
24 revlog, | 24 revlog, |
25 util, | |
25 ) | 26 ) |
26 from .utils import ( | 27 from .utils import ( |
27 dateutil, | 28 dateutil, |
28 stringutil, | 29 stringutil, |
29 ) | 30 ) |
348 yield i | 349 yield i |
349 | 350 |
350 def reachableroots(self, minroot, heads, roots, includepath=False): | 351 def reachableroots(self, minroot, heads, roots, includepath=False): |
351 return self.index.reachableroots2(minroot, heads, roots, includepath) | 352 return self.index.reachableroots2(minroot, heads, roots, includepath) |
352 | 353 |
354 def _checknofilteredinrevs(self, revs): | |
355 """raise the appropriate error if 'revs' contains a filtered revision | |
356 | |
357 This returns a version of 'revs' to be used thereafter by the caller. | |
358 In particular, if revs is an iterator, it is converted into a set. | |
359 """ | |
360 safehasattr = util.safehasattr | |
361 if safehasattr(revs, '__next__'): | |
362 # Note that inspect.isgenerator() is not true for iterators, | |
363 revs = set(revs) | |
364 | |
365 filteredrevs = self.filteredrevs | |
366 if safehasattr(revs, 'first'): # smartset | |
367 offenders = revs & filteredrevs | |
368 else: | |
369 offenders = filteredrevs.intersection(revs) | |
370 | |
371 for rev in offenders: | |
372 raise error.FilteredIndexError(rev) | |
373 return revs | |
374 | |
353 def headrevs(self, revs=None): | 375 def headrevs(self, revs=None): |
354 if revs is None and self.filteredrevs: | 376 if revs is None and self.filteredrevs: |
355 try: | 377 try: |
356 return self.index.headrevsfiltered(self.filteredrevs) | 378 return self.index.headrevsfiltered(self.filteredrevs) |
357 # AttributeError covers non-c-extension environments and | 379 # AttributeError covers non-c-extension environments and |
358 # old c extensions without filter handling. | 380 # old c extensions without filter handling. |
359 except AttributeError: | 381 except AttributeError: |
360 return self._headrevs() | 382 return self._headrevs() |
361 | 383 |
384 if self.filteredrevs: | |
385 revs = self._checknofilteredinrevs(revs) | |
362 return super(changelog, self).headrevs(revs) | 386 return super(changelog, self).headrevs(revs) |
363 | 387 |
364 def strip(self, *args, **kwargs): | 388 def strip(self, *args, **kwargs): |
365 # XXX make something better than assert | 389 # XXX make something better than assert |
366 # We can't expect proper strip behavior if we are filtered. | 390 # We can't expect proper strip behavior if we are filtered. |