server: allow customizing the default repo filter
authorJoerg Sonnenberger <joerg@bec.de>
Tue, 12 Feb 2019 19:08:17 +0100
changeset 41840 d6569f1e9b37
parent 41839 38de3300414f
child 41841 b1d07f4614a6
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
mercurial/configitems.py
mercurial/help/config.txt
mercurial/wireprotov1server.py
mercurial/wireprotov2server.py
tests/test-server-view.t
tests/test-wireproto.py
--- 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'):