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