clfilter: add impactable filter
The `mutable` filter still have some chance to get invalidated. This will happen
when:
- you garbage collect hidden changeset,
- public phase is moved backward,
- something is changed in the filtering (this could be fixed)
So we introduce an even more stable filtering set: everything with a revision
number egal or higher than the first mutable changeset is filtered.
The only official use of this filter is for branchcache.
--- a/mercurial/repoview.py Wed Jan 02 01:57:46 2013 +0100
+++ b/mercurial/repoview.py Wed Jan 02 02:02:41 2013 +0100
@@ -40,10 +40,34 @@
return frozenset(repo.revs('draft() + secret()'))
return frozenset()
+def computeimpactable(repo):
+ """Everything impactable by mutable revision
+
+ The mutable filter still have some chance to get invalidated. This will
+ happen when:
+
+ - you garbage collect hidden changeset,
+ - public phase is moved backward,
+ - something is changed in the filtering (this could be fixed)
+
+ This filter out any mutable changeset and any public changeset that may be
+ impacted by something happening to a mutable revision.
+
+ This is achieved by filtered everything with a revision number egal or
+ higher than the first mutable changeset is filtered."""
+ assert not repo.changelog.filteredrevs
+ cl = repo.changelog
+ firstmutable = len(cl)
+ for roots in repo._phasecache.phaseroots[1:]:
+ if roots:
+ firstmutable = min(firstmutable, min(cl.rev(r) for r in roots))
+ return frozenset(xrange(firstmutable, len(cl)))
+
# function to compute filtered set
filtertable = {'hidden': computehidden,
'unserved': computeunserved,
- 'mutable': computemutable}
+ 'mutable': computemutable,
+ 'impactable': computeimpactable}
### Nearest subset relation
# Nearest subset of filter X is a filter Y so that:
# * Y is included in X,
@@ -52,7 +76,8 @@
# the ordering may be partial
subsettable = {None: 'hidden',
'hidden': 'unserved',
- 'unserved': 'mutable'}
+ 'unserved': 'mutable',
+ 'mutable': 'impactable'}
def filteredrevs(repo, filtername):
"""returns set of filtered revision for this filter name"""
--- a/tests/test-inherit-mode.t Wed Jan 02 01:57:46 2013 +0100
+++ b/tests/test-inherit-mode.t Wed Jan 02 02:02:41 2013 +0100
@@ -111,7 +111,7 @@
00770 ../push/.hg/
00660 ../push/.hg/00changelog.i
00770 ../push/.hg/cache/
- 00660 ../push/.hg/cache/branchheads-mutable
+ 00660 ../push/.hg/cache/branchheads-impactable
00660 ../push/.hg/requires
00770 ../push/.hg/store/
00660 ../push/.hg/store/00changelog.i
--- a/tests/test-newbranch.t Wed Jan 02 01:57:46 2013 +0100
+++ b/tests/test-newbranch.t Wed Jan 02 02:02:41 2013 +0100
@@ -176,7 +176,7 @@
$ hg push -qr 0 ../target
$ (cd ../target/; listbranchcaches)
- === .hg/cache/branchheads-mutable ===
+ === .hg/cache/branchheads-impactable ===
db01e8ea3388fd3c7c94e1436ea2bd6a53d581c5 0
db01e8ea3388fd3c7c94e1436ea2bd6a53d581c5 default
@@ -185,7 +185,7 @@
$ hg push -qf ../target
$ (cd ../target/; listbranchcaches)
- === .hg/cache/branchheads-mutable ===
+ === .hg/cache/branchheads-impactable ===
adf1a74a7f7b4cd193d12992f5d0d6a004ed21d6 4
1c28f494dae69a2f8fc815059d257eccf3fcfe75 default
adf1a74a7f7b4cd193d12992f5d0d6a004ed21d6 foo