# HG changeset patch # User Pierre-Yves David # Date 2013-01-02 01:02:41 # Node ID 58ca19edc043056248ce896e81f414566500f320 # Parent aff706b3a21c2cdadb8dba221755fc9aecd2dbee 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. diff --git a/mercurial/repoview.py b/mercurial/repoview.py --- a/mercurial/repoview.py +++ b/mercurial/repoview.py @@ -40,10 +40,34 @@ def computemutable(repo): 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 @@ filtertable = {'hidden': computehidden, # 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""" diff --git a/tests/test-inherit-mode.t b/tests/test-inherit-mode.t --- a/tests/test-inherit-mode.t +++ b/tests/test-inherit-mode.t @@ -111,7 +111,7 @@ group can still write everything 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 diff --git a/tests/test-newbranch.t b/tests/test-newbranch.t --- a/tests/test-newbranch.t +++ b/tests/test-newbranch.t @@ -176,7 +176,7 @@ Pushing just rev 0: $ hg push -qr 0 ../target $ (cd ../target/; listbranchcaches) - === .hg/cache/branchheads-mutable === + === .hg/cache/branchheads-impactable === db01e8ea3388fd3c7c94e1436ea2bd6a53d581c5 0 db01e8ea3388fd3c7c94e1436ea2bd6a53d581c5 default @@ -185,7 +185,7 @@ Pushing everything: $ hg push -qf ../target $ (cd ../target/; listbranchcaches) - === .hg/cache/branchheads-mutable === + === .hg/cache/branchheads-impactable === adf1a74a7f7b4cd193d12992f5d0d6a004ed21d6 4 1c28f494dae69a2f8fc815059d257eccf3fcfe75 default adf1a74a7f7b4cd193d12992f5d0d6a004ed21d6 foo