# HG changeset patch # User Augie Fackler # Date 2018-02-21 03:23:06 # Node ID 579c28576ba50824e9287ea97548a472b10c561d # Parent aefb75730ea34f545f0756bf8441fc9ae07bf8dc # Parent c19e66dacaa184feba31136c18a369ba995ddfe4 merge with stable diff --git a/tests/test-push-http-bundle1.t b/tests/test-push-http-bundle1.t deleted file mode 100644 --- a/tests/test-push-http-bundle1.t +++ /dev/null @@ -1,203 +0,0 @@ -#require killdaemons - -This test checks behavior related to bundle1 that changed or is likely -to change with bundle2. Feel free to factor out any part of the test -which does not need to exist to keep bundle1 working. - - $ cat << EOF >> $HGRCPATH - > [devel] - > # This test is dedicated to interaction through old bundle - > legacy.exchange = bundle1 - > EOF - - $ hg init test - $ cd test - $ echo a > a - $ hg ci -Ama - adding a - $ cd .. - $ hg clone test test2 - updating to branch default - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - $ cd test2 - $ echo a >> a - $ hg ci -mb - $ req() { - > hg serve -p $HGPORT -d --pid-file=hg.pid -E errors.log - > cat hg.pid >> $DAEMON_PIDS - > hg --cwd ../test2 push http://localhost:$HGPORT/ - > exitstatus=$? - > killdaemons.py - > echo % serve errors - > cat errors.log - > return $exitstatus - > } - $ cd ../test - -expect ssl error - - $ req - pushing to http://localhost:$HGPORT/ - searching for changes - abort: HTTP Error 403: ssl required - % serve errors - [255] - -expect authorization error - - $ echo '[web]' > .hg/hgrc - $ echo 'push_ssl = false' >> .hg/hgrc - $ req - pushing to http://localhost:$HGPORT/ - searching for changes - abort: authorization failed - % serve errors - [255] - -expect authorization error: must have authorized user - - $ echo 'allow_push = unperson' >> .hg/hgrc - $ req - pushing to http://localhost:$HGPORT/ - searching for changes - abort: authorization failed - % serve errors - [255] - -expect success - - $ cat >> .hg/hgrc < allow_push = * - > [hooks] - > changegroup = sh -c "printenv.py changegroup 0" - > pushkey = sh -c "printenv.py pushkey 0" - > EOF - $ req - pushing to http://localhost:$HGPORT/ - searching for changes - remote: adding changesets - remote: adding manifests - remote: adding file changes - remote: added 1 changesets with 1 changes to 1 files - remote: changegroup hook: HG_HOOKNAME=changegroup HG_HOOKTYPE=changegroup HG_NODE=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_NODE_LAST=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_SOURCE=serve HG_TXNID=TXN:$ID$ HG_URL=remote:http:$LOCALIP: (glob) - % serve errors - $ hg rollback - repository tip rolled back to revision 0 (undo serve) - -expect success, server lacks the httpheader capability - - $ CAP=httpheader - $ . "$TESTDIR/notcapable" - $ req - pushing to http://localhost:$HGPORT/ - searching for changes - remote: adding changesets - remote: adding manifests - remote: adding file changes - remote: added 1 changesets with 1 changes to 1 files - remote: changegroup hook: HG_HOOKNAME=changegroup HG_HOOKTYPE=changegroup HG_NODE=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_NODE_LAST=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_SOURCE=serve HG_TXNID=TXN:$ID$ HG_URL=remote:http:$LOCALIP: (glob) - % serve errors - $ hg rollback - repository tip rolled back to revision 0 (undo serve) - -expect success, server lacks the unbundlehash capability - - $ CAP=unbundlehash - $ . "$TESTDIR/notcapable" - $ req - pushing to http://localhost:$HGPORT/ - searching for changes - remote: adding changesets - remote: adding manifests - remote: adding file changes - remote: added 1 changesets with 1 changes to 1 files - remote: changegroup hook: HG_HOOKNAME=changegroup HG_HOOKTYPE=changegroup HG_NODE=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_NODE_LAST=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_SOURCE=serve HG_TXNID=TXN:$ID$ HG_URL=remote:http:$LOCALIP: (glob) - % serve errors - $ hg rollback - repository tip rolled back to revision 0 (undo serve) - -expect success, pre-d1b16a746db6 server supports the unbundle capability, but -has no parameter - - $ cat < notcapable-unbundleparam.py - > from mercurial import extensions, httppeer - > def capable(orig, self, name): - > if name == 'unbundle': - > return True - > return orig(self, name) - > def uisetup(ui): - > extensions.wrapfunction(httppeer.httppeer, 'capable', capable) - > EOF - $ cp $HGRCPATH $HGRCPATH.orig - $ cat <> $HGRCPATH - > [extensions] - > notcapable-unbundleparam = `pwd`/notcapable-unbundleparam.py - > EOF - $ req - pushing to http://localhost:$HGPORT/ - searching for changes - remote: adding changesets - remote: adding manifests - remote: adding file changes - remote: added 1 changesets with 1 changes to 1 files - remote: changegroup hook: * (glob) - % serve errors - $ hg rollback - repository tip rolled back to revision 0 (undo serve) - $ mv $HGRCPATH.orig $HGRCPATH - -expect push success, phase change failure - - $ cat > .hg/hgrc < [web] - > push_ssl = false - > allow_push = * - > [hooks] - > prepushkey = sh -c "printenv.py prepushkey 1" - > EOF - $ req - pushing to http://localhost:$HGPORT/ - searching for changes - remote: adding changesets - remote: adding manifests - remote: adding file changes - remote: added 1 changesets with 1 changes to 1 files - % serve errors - -expect phase change success - - $ cat >> .hg/hgrc < prepushkey = sh -c "printenv.py prepushkey 0" - > EOF - $ req - pushing to http://localhost:$HGPORT/ - searching for changes - no changes found - % serve errors - [1] - $ hg rollback - repository tip rolled back to revision 0 (undo serve) - -expect authorization error: all users denied - - $ echo '[web]' > .hg/hgrc - $ echo 'push_ssl = false' >> .hg/hgrc - $ echo 'deny_push = *' >> .hg/hgrc - $ req - pushing to http://localhost:$HGPORT/ - searching for changes - abort: authorization failed - % serve errors - [255] - -expect authorization error: some users denied, users must be authenticated - - $ echo 'deny_push = unperson' >> .hg/hgrc - $ req - pushing to http://localhost:$HGPORT/ - searching for changes - abort: authorization failed - % serve errors - [255] - - $ cd .. diff --git a/tests/test-push-http.t b/tests/test-push-http.t --- a/tests/test-push-http.t +++ b/tests/test-push-http.t @@ -1,5 +1,15 @@ #require killdaemons +#testcases bundle1 bundle2 + +#if bundle1 + $ cat << EOF >> $HGRCPATH + > [devel] + > # This test is dedicated to interaction through old bundle + > legacy.exchange = bundle1 + > EOF +#endif + $ hg init test $ cd test $ echo a > a @@ -76,7 +86,8 @@ expect success remote: added 1 changesets with 1 changes to 1 files remote: phase-move: cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b: draft -> public remote: phase-move: ba677d0156c1196c1a699fa53f390dcfc3ce3872: -> public - remote: changegroup hook: HG_BUNDLE2=1 HG_HOOKNAME=changegroup HG_HOOKTYPE=changegroup HG_NODE=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_NODE_LAST=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_SOURCE=serve HG_TXNID=TXN:$ID$ HG_URL=remote:http:$LOCALIP: (glob) + remote: changegroup hook: HG_HOOKNAME=changegroup HG_HOOKTYPE=changegroup HG_NODE=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_NODE_LAST=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_SOURCE=serve HG_TXNID=TXN:$ID$ HG_URL=remote:http:$LOCALIP: (glob) (bundle1 !) + remote: changegroup hook: HG_BUNDLE2=1 HG_HOOKNAME=changegroup HG_HOOKTYPE=changegroup HG_NODE=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_NODE_LAST=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_SOURCE=serve HG_TXNID=TXN:$ID$ HG_URL=remote:http:$LOCALIP: (glob) (bundle2 !) % serve errors $ hg rollback repository tip rolled back to revision 0 (undo serve) @@ -94,7 +105,8 @@ expect success, server lacks the httphea remote: added 1 changesets with 1 changes to 1 files remote: phase-move: cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b: draft -> public remote: phase-move: ba677d0156c1196c1a699fa53f390dcfc3ce3872: -> public - remote: changegroup hook: HG_BUNDLE2=1 HG_HOOKNAME=changegroup HG_HOOKTYPE=changegroup HG_NODE=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_NODE_LAST=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_SOURCE=serve HG_TXNID=TXN:$ID$ HG_URL=remote:http:$LOCALIP: (glob) + remote: changegroup hook: HG_HOOKNAME=changegroup HG_HOOKTYPE=changegroup HG_NODE=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_NODE_LAST=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_SOURCE=serve HG_TXNID=TXN:$ID$ HG_URL=remote:http:$LOCALIP: (glob) (bundle1 !) + remote: changegroup hook: HG_BUNDLE2=1 HG_HOOKNAME=changegroup HG_HOOKTYPE=changegroup HG_NODE=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_NODE_LAST=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_SOURCE=serve HG_TXNID=TXN:$ID$ HG_URL=remote:http:$LOCALIP: (glob) (bundle2 !) % serve errors $ hg rollback repository tip rolled back to revision 0 (undo serve) @@ -112,12 +124,45 @@ expect success, server lacks the unbundl remote: added 1 changesets with 1 changes to 1 files remote: phase-move: cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b: draft -> public remote: phase-move: ba677d0156c1196c1a699fa53f390dcfc3ce3872: -> public - remote: changegroup hook: HG_BUNDLE2=1 HG_HOOKNAME=changegroup HG_HOOKTYPE=changegroup HG_NODE=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_NODE_LAST=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_SOURCE=serve HG_TXNID=TXN:$ID$ HG_URL=remote:http:$LOCALIP: (glob) + remote: changegroup hook: HG_HOOKNAME=changegroup HG_HOOKTYPE=changegroup HG_NODE=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_NODE_LAST=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_SOURCE=serve HG_TXNID=TXN:$ID$ HG_URL=remote:http:$LOCALIP: (glob) (bundle1 !) + remote: changegroup hook: HG_BUNDLE2=1 HG_HOOKNAME=changegroup HG_HOOKTYPE=changegroup HG_NODE=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_NODE_LAST=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_SOURCE=serve HG_TXNID=TXN:$ID$ HG_URL=remote:http:$LOCALIP: (glob) (bundle2 !) % serve errors $ hg rollback repository tip rolled back to revision 0 (undo serve) -expect push success, phase change failure +expect success, pre-d1b16a746db6 server supports the unbundle capability, but +has no parameter + + $ cat < notcapable-unbundleparam.py + > from mercurial import extensions, httppeer + > def capable(orig, self, name): + > if name == 'unbundle': + > return True + > return orig(self, name) + > def uisetup(ui): + > extensions.wrapfunction(httppeer.httppeer, 'capable', capable) + > EOF + $ cp $HGRCPATH $HGRCPATH.orig + $ cat <> $HGRCPATH + > [extensions] + > notcapable-unbundleparam = `pwd`/notcapable-unbundleparam.py + > EOF + $ req + pushing to http://localhost:$HGPORT/ + searching for changes + remote: adding changesets + remote: adding manifests + remote: adding file changes + remote: added 1 changesets with 1 changes to 1 files + remote: phase-move: cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b: draft -> public + remote: phase-move: ba677d0156c1196c1a699fa53f390dcfc3ce3872: -> public + remote: changegroup hook: * (glob) + % serve errors + $ hg rollback + repository tip rolled back to revision 0 (undo serve) + $ mv $HGRCPATH.orig $HGRCPATH + +Test pushing to a publishing repository with a failing prepushkey hook $ cat > .hg/hgrc < [web] @@ -128,6 +173,27 @@ expect push success, phase change failur > [devel] > legacy.exchange=phases > EOF + +#if bundle1 +Bundle1 works because a) phases are updated as part of changegroup application +and b) client checks phases after the "unbundle" command. Since it sees no +phase changes are necessary, it doesn't send the "pushkey" command and the +prepushkey hook never has to fire. + + $ req + pushing to http://localhost:$HGPORT/ + searching for changes + remote: adding changesets + remote: adding manifests + remote: adding file changes + remote: added 1 changesets with 1 changes to 1 files + % serve errors + +#endif + +#if bundle2 +Bundle2 sends a "pushkey" bundle2 part. This runs as part of the transaction +and fails the entire push. $ req pushing to http://localhost:$HGPORT/ searching for changes @@ -143,13 +209,42 @@ expect push success, phase change failur % serve errors [255] -expect phase change success +#endif + +Now remove the failing prepushkey hook. $ cat >> .hg/hgrc < [hooks] > prepushkey = sh -c "printenv.py prepushkey 0" - > [devel] - > legacy.exchange= > EOF + +We don't need to test bundle1 because it succeeded above. + +#if bundle2 + $ req + pushing to http://localhost:$HGPORT/ + searching for changes + remote: adding changesets + remote: adding manifests + remote: adding file changes + remote: added 1 changesets with 1 changes to 1 files + remote: prepushkey hook: HG_BUNDLE2=1 HG_HOOKNAME=prepushkey HG_HOOKTYPE=prepushkey HG_KEY=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_NAMESPACE=phases HG_NEW=0 HG_NODE=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_NODE_LAST=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_OLD=1 HG_PENDING=$TESTTMP/test HG_PHASES_MOVED=1 HG_SOURCE=serve HG_TXNID=TXN:$ID$ HG_URL=remote:http:$LOCALIP: (glob) + % serve errors +#endif + + $ hg --config extensions.strip= strip -r 1: + saved backup bundle to $TESTTMP/test/.hg/strip-backup/ba677d0156c1-eea704d7-backup.hg + +Now do a variant of the above, except on a non-publishing repository + + $ cat >> .hg/hgrc < [phases] + > publish = false + > [hooks] + > prepushkey = sh -c "printenv.py prepushkey 1" + > EOF + +#if bundle1 $ req pushing to http://localhost:$HGPORT/ searching for changes @@ -157,9 +252,60 @@ expect phase change success remote: adding manifests remote: adding file changes remote: added 1 changesets with 1 changes to 1 files + remote: prepushkey hook: HG_HOOKNAME=prepushkey HG_HOOKTYPE=prepushkey HG_KEY=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_NAMESPACE=phases HG_NEW=0 HG_OLD=1 + remote: pushkey-abort: prepushkey hook exited with status 1 + updating ba677d0156c1 to public failed! % serve errors - $ hg rollback - repository tip rolled back to revision 0 (undo serve) +#endif + +#if bundle2 + $ req + pushing to http://localhost:$HGPORT/ + searching for changes + remote: adding changesets + remote: adding manifests + remote: adding file changes + remote: added 1 changesets with 1 changes to 1 files + remote: prepushkey hook: HG_BUNDLE2=1 HG_HOOKNAME=prepushkey HG_HOOKTYPE=prepushkey HG_KEY=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_NAMESPACE=phases HG_NEW=0 HG_NODE=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_NODE_LAST=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_OLD=1 HG_PENDING=$TESTTMP/test HG_PHASES_MOVED=1 HG_SOURCE=serve HG_TXNID=TXN:$ID$ HG_URL=remote:http:$LOCALIP: (glob) + remote: pushkey-abort: prepushkey hook exited with status 1 + remote: transaction abort! + remote: rollback completed + abort: updating ba677d0156c1 to public failed + % serve errors + [255] +#endif + +Make phases updates work + + $ cat >> .hg/hgrc < [hooks] + > prepushkey = sh -c "printenv.py prepushkey 0" + > EOF + +#if bundle1 + $ req + pushing to http://localhost:$HGPORT/ + searching for changes + no changes found + remote: prepushkey hook: HG_HOOKNAME=prepushkey HG_HOOKTYPE=prepushkey HG_KEY=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_NAMESPACE=phases HG_NEW=0 HG_OLD=1 + % serve errors + [1] +#endif + +#if bundle2 + $ req + pushing to http://localhost:$HGPORT/ + searching for changes + remote: adding changesets + remote: adding manifests + remote: adding file changes + remote: added 1 changesets with 1 changes to 1 files + remote: prepushkey hook: HG_BUNDLE2=1 HG_HOOKNAME=prepushkey HG_HOOKTYPE=prepushkey HG_KEY=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_NAMESPACE=phases HG_NEW=0 HG_NODE=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_NODE_LAST=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_OLD=1 HG_PENDING=$TESTTMP/test HG_PHASES_MOVED=1 HG_SOURCE=serve HG_TXNID=TXN:$ID$ HG_URL=remote:http:$LOCALIP: (glob) + % serve errors +#endif + + $ hg --config extensions.strip= strip -r 1: + saved backup bundle to $TESTTMP/test/.hg/strip-backup/ba677d0156c1-eea704d7-backup.hg expect authorization error: all users denied @@ -183,6 +329,8 @@ expect authorization error: some users d % serve errors [255] +#if bundle2 + $ cat > .hg/hgrc < [web] > push_ssl = false @@ -199,4 +347,6 @@ expect authorization error: some users d remote: added 1 changesets with 1 changes to 1 files % serve errors +#endif + $ cd ..