diff mercurial/repoview.py @ 18245:aff706b3a21c

clfilter: add mutable filtering It filters all mutable changesets, leaving only public changeset unfiltered. This filtering set is expected to be much more stable that the previous one as public changeset are unlikely to disapear. The only official use of this filter is for branchcache.
author Pierre-Yves David <pierre-yves.david@logilab.fr>
date Wed, 02 Jan 2013 01:57:46 +0100
parents e4687edec014
children 58ca19edc043
line wrap: on
line diff
--- a/mercurial/repoview.py	Mon Jan 07 02:14:41 2013 +0100
+++ b/mercurial/repoview.py	Wed Jan 02 01:57:46 2013 +0100
@@ -8,6 +8,7 @@
 
 import copy
 import phases
+import util
 
 
 def computehidden(repo):
@@ -29,9 +30,20 @@
         return frozenset(repo.revs('hidden() + secret()'))
     return frozenset()
 
+def computemutable(repo):
+    """compute the set of revision that should be filtered when used a server
+
+    Secret and hidden changeset should not pretend to be here."""
+    assert not repo.changelog.filteredrevs
+    # fast check to avoid revset call on huge repo
+    if util.any(repo._phasecache.phaseroots[1:]):
+        return frozenset(repo.revs('draft() + secret()'))
+    return frozenset()
+
 # function to compute filtered set
 filtertable = {'hidden': computehidden,
-               'unserved': computeunserved}
+               'unserved': computeunserved,
+               'mutable':  computemutable}
 ### Nearest subset relation
 # Nearest subset of filter X is a filter Y so that:
 # * Y is included in X,
@@ -39,7 +51,8 @@
 # This create and ordering used for branchmap purpose.
 # the ordering may be partial
 subsettable = {None: 'hidden',
-               'hidden': 'unserved'}
+               'hidden': 'unserved',
+               'unserved': 'mutable'}
 
 def filteredrevs(repo, filtername):
     """returns set of filtered revision for this filter name"""