diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -174,7 +174,7 @@ if not kwargs.get(b'rev') and not kwargs.get(b'change'): use_unfiltered = True - return repo.unfiltered() if use_unfiltered else repo + return repo.filtered(b'notreally') if use_unfiltered else repo # Commands start here, listed alphabetically diff --git a/mercurial/repoview.py b/mercurial/repoview.py --- a/mercurial/repoview.py +++ b/mercurial/repoview.py @@ -169,6 +169,7 @@ # Otherwise your filter will have to recompute all its branches cache # from scratch (very slow). filtertable = { + b'notreally': lambda repo, visibilityexceptions=None: frozenset(), b'visible': computehidden, b'visible-hidden': computehidden, b'served.hidden': computesecret, @@ -336,6 +337,24 @@ return super(filteredchangelogmixin, self).flags(rev) +def poisonwalktoheads(unfichangelog): + cl = copy.copy(unfichangelog) + + def poison(*args, **kwargs): + raise error.ProgrammingError('called method on changelog that requries ' + 'filtering, but filtering was not requested') + + class filteredchangelog(cl.__class__): + tiprev = poison + headrevs = poison + __iter__ = poison + children = poison + + cl.__class__ = filteredchangelog + + return cl + + class repoview(object): """Provide a read/write view of a repo through a filtered changelog @@ -404,8 +423,13 @@ cl = None # could have been made None by the previous if if cl is None: - # Only filter if there's something to filter - cl = wrapchangelog(unfichangelog, revs) if revs else unfichangelog + if self.filtername == b'notreally': + cl = poisonwalktoheads(unfichangelog) + elif revs: + # Only filter if there's something to filter + cl = wrapchangelog(unfichangelog, revs) + else: + cl = unfichangelog object.__setattr__(self, '_clcache', cl) object.__setattr__(self, '_clcachekey', newkey) return cl