diff --git a/mercurial/configitems.py b/mercurial/configitems.py --- a/mercurial/configitems.py +++ b/mercurial/configitems.py @@ -1041,6 +1041,9 @@ coreconfigitem('server', 'uncompressed', coreconfigitem('server', 'uncompressedallowsecret', default=False, ) +coreconfigitem('server', 'view', + default='served', +) coreconfigitem('server', 'validate', default=False, ) diff --git a/mercurial/help/config.txt b/mercurial/help/config.txt --- a/mercurial/help/config.txt +++ b/mercurial/help/config.txt @@ -2028,6 +2028,12 @@ Controls generic server settings. See also ``server.zliblevel``. +``view`` + Repository filter used when exchanging revisions with the peer. + + The default view (``served``) excludes secret and hidden changesets. + Another useful value is ``immutable`` (no draft, secret or hidden changesets). + ``smtp`` -------- diff --git a/mercurial/wireprotov1server.py b/mercurial/wireprotov1server.py --- a/mercurial/wireprotov1server.py +++ b/mercurial/wireprotov1server.py @@ -64,7 +64,8 @@ def getdispatchrepo(repo, proto, command extensions that need commands to operate on different repo views under specialized circumstances. """ - return repo.filtered('served') + viewconfig = repo.ui.config('server', 'view') + return repo.filtered(viewconfig) def dispatch(repo, proto, command): repo = getdispatchrepo(repo, proto, command) @@ -166,7 +167,6 @@ def wireprotocommand(name, args=None, pe @wireprotocommand('batch', 'cmds *', permission='pull') def batch(repo, proto, cmds, others): unescapearg = wireprototypes.unescapebatcharg - repo = repo.filtered("served") res = [] for pair in cmds.split(';'): op, args = pair.split(' ', 1) diff --git a/mercurial/wireprotov2server.py b/mercurial/wireprotov2server.py --- a/mercurial/wireprotov2server.py +++ b/mercurial/wireprotov2server.py @@ -342,7 +342,8 @@ def _httpv2runcommand(ui, repo, req, res action) def getdispatchrepo(repo, proto, command): - return repo.filtered('served') + viewconfig = repo.ui.config('server', 'view') + return repo.filtered(viewconfig) def dispatch(repo, proto, command, redirect): """Run a wire protocol command. diff --git a/tests/test-server-view.t b/tests/test-server-view.t new file mode 100644 --- /dev/null +++ b/tests/test-server-view.t @@ -0,0 +1,38 @@ + $ hg init test + $ cd test + $ hg debugbuilddag '+2' + $ hg phase --public 0 + + $ hg serve -p $HGPORT -d --pid-file=hg.pid -E errors.log + $ cat hg.pid >> $DAEMON_PIDS + $ cd .. + $ hg init test2 + $ cd test2 + $ hg incoming http://foo:xyzzy@localhost:$HGPORT/ + comparing with http://foo:***@localhost:$HGPORT/ + changeset: 0:1ea73414a91b + user: debugbuilddag + date: Thu Jan 01 00:00:00 1970 +0000 + summary: r0 + + changeset: 1:66f7d451a68b + tag: tip + user: debugbuilddag + date: Thu Jan 01 00:00:01 1970 +0000 + summary: r1 + + $ killdaemons.py + + $ cd ../test + $ hg --config server.view=immutable serve -p $HGPORT -d --pid-file=hg.pid -E errors.log + $ cat hg.pid >> $DAEMON_PIDS + $ cd ../test2 + $ hg incoming http://foo:xyzzy@localhost:$HGPORT/ + comparing with http://foo:***@localhost:$HGPORT/ + changeset: 0:1ea73414a91b + tag: tip + user: debugbuilddag + date: Thu Jan 01 00:00:00 1970 +0000 + summary: r0 + + $ killdaemons.py diff --git a/tests/test-wireproto.py b/tests/test-wireproto.py --- a/tests/test-wireproto.py +++ b/tests/test-wireproto.py @@ -78,6 +78,9 @@ class clientpeer(wireprotov1peer.wirepee yield unmangle(f.value) class serverrepo(object): + def __init__(self, ui): + self.ui = ui + def greet(self, name): return b"Hello, " + name @@ -94,7 +97,7 @@ def greet(repo, proto, name): wireprotov1server.commands[b'greet'] = (greet, b'name') -srv = serverrepo() +srv = serverrepo(uimod.ui()) clt = clientpeer(srv, uimod.ui()) def printb(data, end=b'\n'):