test-push-http.t
330 lines
| 11.4 KiB
| text/troff
|
Tads3Lexer
/ tests / test-push-http.t
|
r22046 | #require killdaemons | ||
|
r12483 | |||
|
r36319 | #testcases bundle1 bundle2 | ||
#if bundle1 | ||||
$ cat << EOF >> $HGRCPATH | ||||
> [devel] | ||||
> # This test is dedicated to interaction through old bundle | ||||
> legacy.exchange = bundle1 | ||||
> EOF | ||||
#endif | ||||
|
r12483 | $ 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() { | ||||
|
r12743 | > hg serve -p $HGPORT -d --pid-file=hg.pid -E errors.log | ||
> cat hg.pid >> $DAEMON_PIDS | ||||
> hg --cwd ../test2 push http://localhost:$HGPORT/ | ||||
|
r17455 | > exitstatus=$? | ||
|
r25474 | > killdaemons.py | ||
|
r12743 | > echo % serve errors | ||
> cat errors.log | ||||
|
r17455 | > return $exitstatus | ||
|
r12483 | > } | ||
$ cd ../test | ||||
expect ssl error | ||||
$ req | ||||
|
r12643 | pushing to http://localhost:$HGPORT/ | ||
|
r12483 | searching for changes | ||
|
r17456 | abort: HTTP Error 403: ssl required | ||
|
r12483 | % serve errors | ||
|
r17456 | [255] | ||
|
r12483 | |||
expect authorization error | ||||
$ echo '[web]' > .hg/hgrc | ||||
$ echo 'push_ssl = false' >> .hg/hgrc | ||||
$ req | ||||
|
r12643 | pushing to http://localhost:$HGPORT/ | ||
|
r12483 | searching for changes | ||
abort: authorization failed | ||||
% serve errors | ||||
|
r17455 | [255] | ||
|
r12483 | |||
expect authorization error: must have authorized user | ||||
$ echo 'allow_push = unperson' >> .hg/hgrc | ||||
$ req | ||||
|
r12643 | pushing to http://localhost:$HGPORT/ | ||
|
r12483 | searching for changes | ||
abort: authorization failed | ||||
% serve errors | ||||
|
r17455 | [255] | ||
|
r12483 | |||
expect success | ||||
|
r34939 | $ cat > $TESTTMP/hook.sh <<'EOF' | ||
> echo "phase-move: $HG_NODE: $HG_OLDPHASE -> $HG_PHASE" | ||||
> EOF | ||||
|
r30234 | $ cat >> .hg/hgrc <<EOF | ||
> allow_push = * | ||||
> [hooks] | ||||
> changegroup = sh -c "printenv.py changegroup 0" | ||||
> pushkey = sh -c "printenv.py pushkey 0" | ||||
|
r34939 | > txnclose-phase.test = sh $TESTTMP/hook.sh | ||
|
r30234 | > EOF | ||
|
r12483 | $ req | ||
|
r12643 | pushing to http://localhost:$HGPORT/ | ||
|
r12483 | searching for changes | ||
remote: adding changesets | ||||
remote: adding manifests | ||||
remote: adding file changes | ||||
remote: added 1 changesets with 1 changes to 1 files | ||||
|
r34877 | remote: phase-move: cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b: draft -> public | ||
remote: phase-move: ba677d0156c1196c1a699fa53f390dcfc3ce3872: -> public | ||||
|
r36319 | 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 !) | ||||
|
r12483 | % serve errors | ||
$ hg rollback | ||||
|
r13446 | repository tip rolled back to revision 0 (undo serve) | ||
|
r12483 | |||
|
r14093 | 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 | ||||
|
r34877 | remote: phase-move: cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b: draft -> public | ||
remote: phase-move: ba677d0156c1196c1a699fa53f390dcfc3ce3872: -> public | ||||
|
r36319 | 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 !) | ||||
|
r14093 | % serve errors | ||
$ hg rollback | ||||
repository tip rolled back to revision 0 (undo serve) | ||||
|
r13946 | expect success, server lacks the unbundlehash capability | ||
|
r14011 | $ CAP=unbundlehash | ||
$ . "$TESTDIR/notcapable" | ||||
|
r13946 | $ 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 | ||||
|
r34877 | remote: phase-move: cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b: draft -> public | ||
remote: phase-move: ba677d0156c1196c1a699fa53f390dcfc3ce3872: -> public | ||||
|
r36319 | 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 !) | ||||
|
r13946 | % serve errors | ||
$ hg rollback | ||||
repository tip rolled back to revision 0 (undo serve) | ||||
|
r36318 | expect success, pre-d1b16a746db6 server supports the unbundle capability, but | ||
has no parameter | ||||
$ cat <<EOF > 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 <<EOF >> $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 | ||||
|
r36320 | Test pushing to a publishing repository with a failing prepushkey hook | ||
|
r17793 | |||
|
r17842 | $ cat > .hg/hgrc <<EOF | ||
> [web] | ||||
> push_ssl = false | ||||
> allow_push = * | ||||
> [hooks] | ||||
|
r30234 | > prepushkey = sh -c "printenv.py prepushkey 1" | ||
|
r34837 | > [devel] | ||
> legacy.exchange=phases | ||||
|
r17842 | > EOF | ||
|
r36319 | |||
#if bundle1 | ||||
|
r36320 | 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. | ||||
|
r36319 | |||
$ 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 | ||||
|
r36320 | Bundle2 sends a "pushkey" bundle2 part. This runs as part of the transaction | ||
and fails the entire push. | ||||
|
r17793 | $ 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 | ||||
|
r31815 | 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) | ||
|
r25390 | remote: pushkey-abort: prepushkey hook exited with status 1 | ||
|
r25502 | remote: transaction abort! | ||
remote: rollback completed | ||||
abort: updating ba677d0156c1 to public failed | ||||
|
r17793 | % serve errors | ||
|
r25502 | [255] | ||
|
r17793 | |||
|
r36319 | #endif | ||
|
r36320 | Now remove the failing prepushkey hook. | ||
|
r17793 | |||
|
r30234 | $ cat >> .hg/hgrc <<EOF | ||
|
r36319 | > [hooks] | ||
|
r30234 | > prepushkey = sh -c "printenv.py prepushkey 0" | ||
> EOF | ||||
|
r36319 | |||
|
r36320 | We don't need to test bundle1 because it succeeded above. | ||
|
r36319 | |||
|
r36320 | #if bundle2 | ||
|
r36319 | $ req | ||
pushing to http://localhost:$HGPORT/ | ||||
searching for changes | ||||
|
r36320 | 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) | ||||
|
r36319 | % serve errors | ||
#endif | ||||
|
r36320 | $ 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 | ||||
|
r36319 | |||
|
r36320 | $ cat >> .hg/hgrc <<EOF | ||
> [phases] | ||||
> publish = false | ||||
> [hooks] | ||||
> prepushkey = sh -c "printenv.py prepushkey 1" | ||||
> EOF | ||||
#if bundle1 | ||||
|
r17793 | $ req | ||
pushing to http://localhost:$HGPORT/ | ||||
searching for changes | ||||
|
r25502 | remote: adding changesets | ||
remote: adding manifests | ||||
remote: adding file changes | ||||
remote: added 1 changesets with 1 changes to 1 files | ||||
|
r36320 | 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! | ||||
|
r17793 | % serve errors | ||
|
r36320 | #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 | ||||
|
r17793 | |||
|
r36320 | $ cat >> .hg/hgrc <<EOF | ||
> [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] | ||||
|
r36319 | #endif | ||
|
r36320 | #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 | ||||
|
r36319 | #if bundle2 | ||
|
r33664 | $ cat > .hg/hgrc <<EOF | ||
> [web] | ||||
> push_ssl = false | ||||
> allow_push = * | ||||
> [experimental] | ||||
> httppostargs=true | ||||
> 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 | ||||
|
r36319 | #endif | ||
|
r16913 | $ cd .. | ||