[PATCH V4] repoview: introduce a `experimental.extra-filter-revs` config

Pierre-Yves David pierre-yves.david at ens-lyon.org
Wed Apr 24 02:31:44 EDT 2019


Gentle ping on that patch. All the feedback from the previous round 
should have been applied.

On 4/17/19 4:37 PM, Pierre-Yves David wrote:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david at octobus.net>
> # Date 1554565579 -7200
> #      Sat Apr 06 17:46:19 2019 +0200
> # Node ID a6885b6d14025a68c1b65128050384f3849ff688
> # Parent  eebf78724d94649de84f921ff5bd39cbc0f48cb6
> # EXP-Topic repoview
> # Available At https://bitbucket.org/octobus/mercurial-devel/
> #              hg pull https://bitbucket.org/octobus/mercurial-devel/ -r a6885b6d1402
> repoview: introduce a `experimental.extra-filter-revs` config
> 
> The option define revisions to additionally filter out of all repository "view".
> The end goal is to provide and easy to way to serve multiple subset of the same
> repository using multiple "shares".
> 
> The simplest use case of this feature is to have one view serving the public
> changesets and one view also serving the draft. This is currently achievable
> using the new `server.view` option introduced recently by Joerg Sonnenberger.
> However, more advanced use cases need more advanced definitions. For example
> some needs a view dedicated to some release branches, or view that hides
> security fixes to be released. Joerg Sonnenberger and I discussed this topic at
> the recent mini-sprint and the both of us have seen real life use cases for
> this. (This series got written during the same mini-sprint).
> 
> The feature is fully functional, and use similar cache-fallback mechanism to
> ensure decent performance. However,there remaining room to ensure each share
> caches and hooks collaborate with each others. This will come at a later time
> once users start to actually test this feature on real usecase.
> 
> diff --git a/mercurial/configitems.py b/mercurial/configitems.py
> --- a/mercurial/configitems.py
> +++ b/mercurial/configitems.py
> @@ -529,6 +529,13 @@ coreconfigitem('experimental', 'evolutio
>   coreconfigitem('experimental', 'evolution.track-operation',
>       default=True,
>   )
> +# repo-level config to exclude a revset visibility
> +#
> +# The target use case is to use `share` to expose different subset of the same
> +# repository, especially server side. See also `server.view`.
> +coreconfigitem('experimental', 'extra-filter-revs',
> +    default=None,
> +)
>   coreconfigitem('experimental', 'maxdeltachainspan',
>       default=-1,
>   )
> diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
> --- a/mercurial/localrepo.py
> +++ b/mercurial/localrepo.py
> @@ -1050,6 +1050,8 @@ class localrepository(object):
>           # Signature to cached matcher instance.
>           self._sparsematchercache = {}
>   
> +        self._extrafilterid = repoview.extrafilter(ui)
> +
>       def _getvfsward(self, origfunc):
>           """build a ward for self.vfs"""
>           rref = weakref.ref(self)
> @@ -1197,6 +1199,9 @@ class localrepository(object):
>   
>           In other word, there is always only one level of `repoview` "filtering".
>           """
> +        if self._extrafilterid is not None and '%' not in name:
> +            name = name + '%'  + self._extrafilterid
> +
>           cls = repoview.newtype(self.unfiltered().__class__)
>           return cls(self, name, visibilityexceptions)
>   
> diff --git a/mercurial/repoview.py b/mercurial/repoview.py
> --- a/mercurial/repoview.py
> +++ b/mercurial/repoview.py
> @@ -17,6 +17,10 @@ from . import (
>       phases,
>       pycompat,
>       tags as tagsmod,
> +    util,
> +)
> +from .utils import (
> +    repoviewutil,
>   )
>   
>   def hideablerevs(repo):
> @@ -154,6 +158,35 @@ filtertable = {'visible': computehidden,
>                  'immutable':  computemutable,
>                  'base':  computeimpactable}
>   
> +_basefiltername = list(filtertable)
> +
> +def extrafilter(ui):
> +    """initialize extra filter and return its id
> +
> +    If extra filtering is configured, we make sure the associated filtered view
> +    are declared and return the associated id.
> +    """
> +    frevs = ui.config('experimental', 'extra-filter-revs')
> +    if frevs is None:
> +        return None
> +
> +    fid = pycompat.sysbytes(util.DIGESTS['sha1'](frevs).hexdigest())[:12]
> +
> +    combine = lambda fname: fname + '%' + fid
> +
> +    subsettable = repoviewutil.subsettable
> +
> +    if combine('base') not in filtertable:
> +        for name in _basefiltername:
> +            def extrafilteredrevs(repo, *args, **kwargs):
> +                baserevs = filtertable[name](repo, *args, **kwargs)
> +                extrarevs = frozenset(repo.revs(frevs))
> +                return baserevs | extrarevs
> +            filtertable[combine(name)] = extrafilteredrevs
> +            if name in subsettable:
> +                subsettable[combine(name)] = combine(subsettable[name])
> +    return fid
> +
>   def filterrevs(repo, filtername, visibilityexceptions=None):
>       """returns set of filtered revision for this filter name
>   
> diff --git a/mercurial/statichttprepo.py b/mercurial/statichttprepo.py
> --- a/mercurial/statichttprepo.py
> +++ b/mercurial/statichttprepo.py
> @@ -155,6 +155,7 @@ class statichttprepository(localrepo.loc
>   
>           self.names = namespaces.namespaces()
>           self.filtername = None
> +        self._extrafilterid = None
>   
>           try:
>               requirements = set(self.vfs.read(b'requires').splitlines())
> diff --git a/tests/test-server-view.t b/tests/test-server-view.t
> --- a/tests/test-server-view.t
> +++ b/tests/test-server-view.t
> @@ -34,5 +34,29 @@
>     date:        Thu Jan 01 00:00:00 1970 +0000
>     summary:     r0
>     
> +
> +Check same result using `experimental.extra-filter-revs`
> +
> +  $ hg -R test --config experimental.extra-filter-revs='not public()' serve -p $HGPORT1 -d --pid-file=hg2.pid -E errors.log
> +  $ cat hg2.pid >> $DAEMON_PIDS
> +  $ hg -R test2 incoming http://foo:xyzzy@localhost:$HGPORT1/
> +  comparing with http://foo:***@localhost:$HGPORT1/
> +  changeset:   0:1ea73414a91b
> +  tag:         tip
> +  user:        debugbuilddag
> +  date:        Thu Jan 01 00:00:00 1970 +0000
> +  summary:     r0
> +
> +  $ hg -R test --config experimental.extra-filter-revs='not public()' debugupdatecache
> +  $ ls -1 test/.hg/cache/
> +  branch2-base%89c45d2fa07e
> +  branch2-served
> +  rbc-names-v1
> +  rbc-revs-v1
> +  tags2
> +  tags2-served%89c45d2fa07e
> +
> +cleanup
> +
>     $ cat errors.log
>     $ killdaemons.py
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
> 

-- 
Pierre-Yves David


More information about the Mercurial-devel mailing list