server: allow customizing the default repo filter
hgweb has the (undocument) configuration option web.view that allows
restricting visible revisions to immutable. This is useful for serving
the same storage as publishing and non-publishing repo. Add the new
server.view option to serve the same purpose by changing the default
behavior of `getdispatchrepo`. Drop the hard-coded 'served' filter in the
batch handler of v1 of the wire proto, this is a left-over from the days
before `getdispatchrepo` existed.
Differential Revision: https://phab.mercurial-scm.org/D5946
--- a/mercurial/configitems.py Sat Mar 02 05:24:35 2019 +0530
+++ b/mercurial/configitems.py Tue Feb 12 19:08:17 2019 +0100
@@ -1041,6 +1041,9 @@
coreconfigitem('server', 'uncompressedallowsecret',
default=False,
)
+coreconfigitem('server', 'view',
+ default='served',
+)
coreconfigitem('server', 'validate',
default=False,
)
--- a/mercurial/help/config.txt Sat Mar 02 05:24:35 2019 +0530
+++ b/mercurial/help/config.txt Tue Feb 12 19:08:17 2019 +0100
@@ -2028,6 +2028,12 @@
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``
--------
--- a/mercurial/wireprotov1server.py Sat Mar 02 05:24:35 2019 +0530
+++ b/mercurial/wireprotov1server.py Tue Feb 12 19:08:17 2019 +0100
@@ -64,7 +64,8 @@
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 @@
@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)
--- a/mercurial/wireprotov2server.py Sat Mar 02 05:24:35 2019 +0530
+++ b/mercurial/wireprotov2server.py Tue Feb 12 19:08:17 2019 +0100
@@ -342,7 +342,8 @@
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.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-server-view.t Tue Feb 12 19:08:17 2019 +0100
@@ -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
--- a/tests/test-wireproto.py Sat Mar 02 05:24:35 2019 +0530
+++ b/tests/test-wireproto.py Tue Feb 12 19:08:17 2019 +0100
@@ -78,6 +78,9 @@
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 @@
wireprotov1server.commands[b'greet'] = (greet, b'name')
-srv = serverrepo()
+srv = serverrepo(uimod.ui())
clt = clientpeer(srv, uimod.ui())
def printb(data, end=b'\n'):