##// END OF EJS Templates
wireproto: config options to disable bundle1...
Gregory Szorc -
r27246:b288fb27 default
parent child Browse files
Show More
@@ -1319,6 +1319,23 b' Controls generic server settings.'
1319 Instruct HTTP clients not to send request headers longer than this
1319 Instruct HTTP clients not to send request headers longer than this
1320 many bytes. (default: 1024)
1320 many bytes. (default: 1024)
1321
1321
1322 ``bundle1``
1323 Whether to allow clients to push and pull using the legacy bundle1
1324 exchange format. (default: True)
1325
1326 ``bundle1.push``
1327 Whether to allow clients to push using the legacy bundle1 exchange
1328 format. (default: True)
1329
1330 ``bundle1.pull``
1331 Whether to allow clients to pull using the legacy bundle1 exchange
1332 format. (default: True)
1333
1334 Large repositories using the *generaldelta* storage format should
1335 consider setting this option because converting *generaldelta*
1336 repositories to the exchange format required by the bundle1 data
1337 format can consume a lot of CPU.
1338
1322 ``smtp``
1339 ``smtp``
1323 --------
1340 --------
1324
1341
@@ -30,6 +30,10 b' from . import ('
30 util,
30 util,
31 )
31 )
32
32
33 bundle2required = _(
34 'incompatible Mercurial client; bundle2 required\n'
35 '(see https://www.mercurial-scm.org/wiki/IncompatibleClient)\n')
36
33 class abstractserverproto(object):
37 class abstractserverproto(object):
34 """abstract class that summarizes the protocol API
38 """abstract class that summarizes the protocol API
35
39
@@ -487,6 +491,14 b' def options(cmd, keys, others):'
487 % (cmd, ",".join(others)))
491 % (cmd, ",".join(others)))
488 return opts
492 return opts
489
493
494 def bundle1allowed(ui, action):
495 """Whether a bundle1 operation is allowed from the server."""
496 v = ui.configbool('server', 'bundle1.%s' % action, None)
497 if v is not None:
498 return v
499
500 return ui.configbool('server', 'bundle1', True)
501
490 # list of commands
502 # list of commands
491 commands = {}
503 commands = {}
492
504
@@ -652,6 +664,11 b' def getbundle(repo, proto, others):'
652 elif keytype != 'plain':
664 elif keytype != 'plain':
653 raise KeyError('unknown getbundle option type %s'
665 raise KeyError('unknown getbundle option type %s'
654 % keytype)
666 % keytype)
667
668 if not bundle1allowed(repo.ui, 'pull'):
669 if not exchange.bundle2requested(opts.get('bundlecaps')):
670 return ooberror(bundle2required)
671
655 cg = exchange.getbundle(repo, 'serve', **opts)
672 cg = exchange.getbundle(repo, 'serve', **opts)
656 return streamres(proto.groupchunks(cg))
673 return streamres(proto.groupchunks(cg))
657
674
@@ -763,6 +780,10 b' def unbundle(repo, proto, heads):'
763 proto.getfile(fp)
780 proto.getfile(fp)
764 fp.seek(0)
781 fp.seek(0)
765 gen = exchange.readbundle(repo.ui, fp, None)
782 gen = exchange.readbundle(repo.ui, fp, None)
783 if (isinstance(gen, changegroupmod.cg1unpacker)
784 and not bundle1allowed(repo.ui, 'push')):
785 return ooberror(bundle2required)
786
766 r = exchange.unbundle(repo, gen, their_heads, 'serve',
787 r = exchange.unbundle(repo, gen, their_heads, 'serve',
767 proto._client())
788 proto._client())
768 if util.safehasattr(r, 'addpart'):
789 if util.safehasattr(r, 'addpart'):
@@ -951,3 +951,86 b' Test lazily acquiring the lock during un'
951 remote: adding manifests
951 remote: adding manifests
952 remote: adding file changes
952 remote: adding file changes
953 remote: added 1 changesets with 1 changes to 1 files
953 remote: added 1 changesets with 1 changes to 1 files
954
955 $ cd ..
956
957 Servers can disable bundle1 for clone/pull operations
958
959 $ killdaemons.py
960 $ hg init bundle2onlyserver
961 $ cd bundle2onlyserver
962 $ cat > .hg/hgrc << EOF
963 > [server]
964 > bundle1.pull = false
965 > EOF
966
967 $ touch foo
968 $ hg -q commit -A -m initial
969
970 $ hg serve -p $HGPORT -d --pid-file=hg.pid
971 $ cat hg.pid >> $DAEMON_PIDS
972
973 $ hg --config experimental.bundle2-exp=false clone http://localhost:$HGPORT/ not-bundle2
974 requesting all changes
975 abort: remote error:
976 incompatible Mercurial client; bundle2 required
977 (see https://www.mercurial-scm.org/wiki/IncompatibleClient)
978 [255]
979 $ killdaemons.py
980
981 Verify the global server.bundle1 option works
982
983 $ cat > .hg/hgrc << EOF
984 > [server]
985 > bundle1 = false
986 > EOF
987 $ hg serve -p $HGPORT -d --pid-file=hg.pid
988 $ cat hg.pid >> $DAEMON_PIDS
989 $ hg --config experimental.bundle2-exp=false clone http://localhost:$HGPORT not-bundle2
990 requesting all changes
991 abort: remote error:
992 incompatible Mercurial client; bundle2 required
993 (see https://www.mercurial-scm.org/wiki/IncompatibleClient)
994 [255]
995 $ killdaemons.py
996
997 Verify bundle1 pushes can be disabled
998
999 $ cat > .hg/hgrc << EOF
1000 > [server]
1001 > bundle1.push = false
1002 > [web]
1003 > allow_push = *
1004 > push_ssl = false
1005 > EOF
1006
1007 $ hg serve -p $HGPORT -d --pid-file=hg.pid -E error.log
1008 $ cat hg.pid >> $DAEMON_PIDS
1009 $ cd ..
1010
1011 $ hg clone http://localhost:$HGPORT bundle2-only
1012 requesting all changes
1013 adding changesets
1014 adding manifests
1015 adding file changes
1016 added 1 changesets with 1 changes to 1 files
1017 updating to branch default
1018 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1019 $ cd bundle2-only
1020 $ echo commit > foo
1021 $ hg commit -m commit
1022 $ hg --config experimental.bundle2-exp=false push
1023 pushing to http://localhost:$HGPORT/
1024 searching for changes
1025 abort: remote error:
1026 incompatible Mercurial client; bundle2 required
1027 (see https://www.mercurial-scm.org/wiki/IncompatibleClient)
1028 [255]
1029
1030 $ hg push
1031 pushing to http://localhost:$HGPORT/
1032 searching for changes
1033 remote: adding changesets
1034 remote: adding manifests
1035 remote: adding file changes
1036 remote: added 1 changesets with 1 changes to 1 files
General Comments 0
You need to be logged in to leave comments. Login now