D7241: repoview: move changelog.headrevs() override to filteredchangelog
martinvonz (Martin von Zweigbergk)
phabricator at mercurial-scm.org
Tue Nov 5 22:38:58 EST 2019
Closed by commit rHGdbcd0b043d4f: repoview: move changelog.headrevs() override to filteredchangelog (authored by martinvonz).
This revision was automatically updated to reflect the committed changes.
REPOSITORY
rHG Mercurial
CHANGES SINCE LAST UPDATE
https://phab.mercurial-scm.org/D7241?vs=17571&id=17591
CHANGES SINCE LAST ACTION
https://phab.mercurial-scm.org/D7241/new/
REVISION DETAIL
https://phab.mercurial-scm.org/D7241
AFFECTED FILES
mercurial/changelog.py
mercurial/repoview.py
CHANGE DETAILS
diff --git a/mercurial/repoview.py b/mercurial/repoview.py
--- a/mercurial/repoview.py
+++ b/mercurial/repoview.py
@@ -18,6 +18,7 @@
setattr,
)
from . import (
+ error,
obsolete,
phases,
pycompat,
@@ -252,6 +253,40 @@
if i not in self.filteredrevs:
yield i
+ def _checknofilteredinrevs(self, revs):
+ """raise the appropriate error if 'revs' contains a filtered revision
+
+ This returns a version of 'revs' to be used thereafter by the caller.
+ In particular, if revs is an iterator, it is converted into a set.
+ """
+ safehasattr = util.safehasattr
+ if safehasattr(revs, '__next__'):
+ # Note that inspect.isgenerator() is not true for iterators,
+ revs = set(revs)
+
+ filteredrevs = self.filteredrevs
+ if safehasattr(revs, 'first'): # smartset
+ offenders = revs & filteredrevs
+ else:
+ offenders = filteredrevs.intersection(revs)
+
+ for rev in offenders:
+ raise error.FilteredIndexError(rev)
+ return revs
+
+ def headrevs(self, revs=None):
+ if revs is None and self.filteredrevs:
+ try:
+ return self.index.headrevsfiltered(self.filteredrevs)
+ # AttributeError covers non-c-extension environments and
+ # old c extensions without filter handling.
+ except AttributeError:
+ return self._headrevs()
+
+ if self.filteredrevs:
+ revs = self._checknofilteredinrevs(revs)
+ return super(filteredchangelog, self).headrevs(revs)
+
cl.__class__ = filteredchangelog
return cl
diff --git a/mercurial/changelog.py b/mercurial/changelog.py
--- a/mercurial/changelog.py
+++ b/mercurial/changelog.py
@@ -21,7 +21,6 @@
error,
pycompat,
revlog,
- util,
)
from .utils import (
dateutil,
@@ -405,40 +404,6 @@
self.filteredrevs = frozenset()
self._copiesstorage = opener.options.get(b'copies-storage')
- def _checknofilteredinrevs(self, revs):
- """raise the appropriate error if 'revs' contains a filtered revision
-
- This returns a version of 'revs' to be used thereafter by the caller.
- In particular, if revs is an iterator, it is converted into a set.
- """
- safehasattr = util.safehasattr
- if safehasattr(revs, '__next__'):
- # Note that inspect.isgenerator() is not true for iterators,
- revs = set(revs)
-
- filteredrevs = self.filteredrevs
- if safehasattr(revs, 'first'): # smartset
- offenders = revs & filteredrevs
- else:
- offenders = filteredrevs.intersection(revs)
-
- for rev in offenders:
- raise error.FilteredIndexError(rev)
- return revs
-
- def headrevs(self, revs=None):
- if revs is None and self.filteredrevs:
- try:
- return self.index.headrevsfiltered(self.filteredrevs)
- # AttributeError covers non-c-extension environments and
- # old c extensions without filter handling.
- except AttributeError:
- return self._headrevs()
-
- if self.filteredrevs:
- revs = self._checknofilteredinrevs(revs)
- return super(changelog, self).headrevs(revs)
-
def strip(self, *args, **kwargs):
# XXX make something better than assert
# We can't expect proper strip behavior if we are filtered.
To: martinvonz, #hg-reviewers, indygreg
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list