diff --git a/mercurial/repoview.py b/mercurial/repoview.py --- a/mercurial/repoview.py +++ b/mercurial/repoview.py @@ -65,7 +65,7 @@ hidden.remove(p) stack.append(p) -def computehidden(repo): +def computehidden(repo, visibilityexceptions=None): """compute the set of hidden revision to filter During most operation hidden should be filtered.""" @@ -74,6 +74,8 @@ hidden = hideablerevs(repo) if hidden: hidden = set(hidden - pinnedrevs(repo)) + if visibilityexceptions: + hidden -= visibilityexceptions pfunc = repo.changelog.parentrevs mutablephases = (phases.draft, phases.secret) mutable = repo._phasecache.getrevset(repo, mutablephases) @@ -82,7 +84,7 @@ _revealancestors(pfunc, hidden, visible) return frozenset(hidden) -def computeunserved(repo): +def computeunserved(repo, visibilityexceptions=None): """compute the set of revision that should be filtered when used a server Secret and hidden changeset should not pretend to be here.""" @@ -100,7 +102,7 @@ else: return hiddens -def computemutable(repo): +def computemutable(repo, visibilityexceptions=None): assert not repo.changelog.filteredrevs # fast check to avoid revset call on huge repo if any(repo._phasecache.phaseroots[1:]): @@ -109,7 +111,7 @@ return frozenset(r for r in maymutable if getphase(repo, r)) return frozenset() -def computeimpactable(repo): +def computeimpactable(repo, visibilityexceptions=None): """Everything impactable by mutable revision The immutable filter still have some chance to get invalidated. This will @@ -134,22 +136,23 @@ firstmutable = max(0, firstmutable) return frozenset(xrange(firstmutable, len(cl))) -# function to compute filtered set +# function and visibility exceptions to compute filtered set # # When adding a new filter you MUST update the table at: # mercurial.branchmap.subsettable # Otherwise your filter will have to recompute all its branches cache # from scratch (very slow). -filtertable = {'visible': computehidden, - 'served': computeunserved, - 'immutable': computemutable, - 'base': computeimpactable} +filtertable = {'visible': (computehidden, set()), + 'served': (computeunserved, set()), + 'immutable': (computemutable, set()), + 'base': (computeimpactable, set())} def filterrevs(repo, filtername): """returns set of filtered revision for this filter name""" if filtername not in repo.filteredrevcache: - func = filtertable[filtername] - repo.filteredrevcache[filtername] = func(repo.unfiltered()) + func, visibilityexceptions = filtertable[filtername] + repo.filteredrevcache[filtername] = func(repo.unfiltered(), + visibilityexceptions) return repo.filteredrevcache[filtername] class repoview(object):