test-hook.t
1392 lines
| 38.0 KiB
| text/troff
|
Tads3Lexer
/ tests / test-hook.t
|
r12328 | commit hooks can see env vars | ||
|
r24821 | (and post-transaction one are run unlocked) | ||
|
r11793 | |||
|
r25370 | |||
|
r25218 | $ cat > $TESTTMP/txnabort.checkargs.py <<EOF | ||
|
r37772 | > from mercurial import pycompat | ||
|
r25218 | > def showargs(ui, repo, hooktype, **kwargs): | ||
|
r37772 | > kwargs = pycompat.byteskwargs(kwargs) | ||
> ui.write(b'%s Python hook: %s\n' % (hooktype, | ||||
> b','.join(sorted(kwargs)))) | ||||
|
r25218 | > EOF | ||
|
r11793 | $ hg init a | ||
$ cd a | ||||
|
r16964 | $ cat > .hg/hgrc <<EOF | ||
> [hooks] | ||||
|
r41788 | > commit = sh -c "HG_LOCAL= HG_TAG= printenv.py --line commit" | ||
> commit.b = sh -c "HG_LOCAL= HG_TAG= printenv.py --line commit.b" | ||||
> precommit = sh -c "HG_LOCAL= HG_NODE= HG_TAG= printenv.py --line precommit" | ||||
> pretxncommit = sh -c "HG_LOCAL= HG_TAG= printenv.py --line pretxncommit" | ||||
|
r16964 | > pretxncommit.tip = hg -q tip | ||
|
r41788 | > pre-identify = sh -c "printenv.py --line pre-identify 1" | ||
> pre-cat = sh -c "printenv.py --line pre-cat" | ||||
> post-cat = sh -c "printenv.py --line post-cat" | ||||
> pretxnopen = sh -c "HG_LOCAL= HG_TAG= printenv.py --line pretxnopen" | ||||
> pretxnclose = sh -c "HG_LOCAL= HG_TAG= printenv.py --line pretxnclose" | ||||
> txnclose = sh -c "HG_LOCAL= HG_TAG= printenv.py --line txnclose" | ||||
|
r25218 | > txnabort.0 = python:$TESTTMP/txnabort.checkargs.py:showargs | ||
|
r41788 | > txnabort.1 = sh -c "HG_LOCAL= HG_TAG= printenv.py --line txnabort" | ||
|
r24827 | > txnclose.checklock = sh -c "hg debuglock > /dev/null" | ||
|
r16964 | > EOF | ||
|
r11793 | $ echo a > a | ||
$ hg add a | ||||
|
r12156 | $ hg commit -m a | ||
|
r41788 | precommit hook: HG_HOOKNAME=precommit | ||
HG_HOOKTYPE=precommit | ||||
HG_PARENT1=0000000000000000000000000000000000000000 | ||||
pretxnopen hook: HG_HOOKNAME=pretxnopen | ||||
HG_HOOKTYPE=pretxnopen | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=commit | ||||
pretxncommit hook: HG_HOOKNAME=pretxncommit | ||||
HG_HOOKTYPE=pretxncommit | ||||
HG_NODE=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b | ||||
HG_PARENT1=0000000000000000000000000000000000000000 | ||||
HG_PENDING=$TESTTMP/a | ||||
|
r12156 | 0:cb9a9f314b8b | ||
|
r41788 | pretxnclose hook: HG_HOOKNAME=pretxnclose | ||
HG_HOOKTYPE=pretxnclose | ||||
HG_PENDING=$TESTTMP/a | ||||
HG_PHASES_MOVED=1 | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=commit | ||||
txnclose hook: HG_HOOKNAME=txnclose | ||||
HG_HOOKTYPE=txnclose | ||||
HG_PHASES_MOVED=1 | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=commit | ||||
commit hook: HG_HOOKNAME=commit | ||||
HG_HOOKTYPE=commit | ||||
HG_NODE=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b | ||||
HG_PARENT1=0000000000000000000000000000000000000000 | ||||
commit.b hook: HG_HOOKNAME=commit.b | ||||
HG_HOOKTYPE=commit | ||||
HG_NODE=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b | ||||
HG_PARENT1=0000000000000000000000000000000000000000 | ||||
|
r11793 | |||
$ hg clone . ../b | ||||
updating to branch default | ||||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
$ cd ../b | ||||
|
r12328 | changegroup hooks can see env vars | ||
|
r11793 | |||
|
r16964 | $ cat > .hg/hgrc <<EOF | ||
> [hooks] | ||||
|
r41788 | > prechangegroup = sh -c "printenv.py --line prechangegroup" | ||
> changegroup = sh -c "printenv.py --line changegroup" | ||||
> incoming = sh -c "printenv.py --line incoming" | ||||
|
r16964 | > EOF | ||
|
r11793 | |||
|
r12328 | pretxncommit and commit hooks can see both parents of merge | ||
|
r11793 | |||
$ cd ../a | ||||
$ echo b >> a | ||||
$ hg commit -m a1 -d "1 0" | ||||
|
r41788 | precommit hook: HG_HOOKNAME=precommit | ||
HG_HOOKTYPE=precommit | ||||
HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b | ||||
pretxnopen hook: HG_HOOKNAME=pretxnopen | ||||
HG_HOOKTYPE=pretxnopen | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=commit | ||||
pretxncommit hook: HG_HOOKNAME=pretxncommit | ||||
HG_HOOKTYPE=pretxncommit | ||||
HG_NODE=ab228980c14deea8b9555d91c9581127383e40fd | ||||
HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b | ||||
HG_PENDING=$TESTTMP/a | ||||
|
r12156 | 1:ab228980c14d | ||
|
r41788 | pretxnclose hook: HG_HOOKNAME=pretxnclose | ||
HG_HOOKTYPE=pretxnclose | ||||
HG_PENDING=$TESTTMP/a | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=commit | ||||
txnclose hook: HG_HOOKNAME=txnclose | ||||
HG_HOOKTYPE=txnclose | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=commit | ||||
commit hook: HG_HOOKNAME=commit | ||||
HG_HOOKTYPE=commit | ||||
HG_NODE=ab228980c14deea8b9555d91c9581127383e40fd | ||||
HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b | ||||
commit.b hook: HG_HOOKNAME=commit.b | ||||
HG_HOOKTYPE=commit | ||||
HG_NODE=ab228980c14deea8b9555d91c9581127383e40fd | ||||
HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b | ||||
|
r11793 | $ hg update -C 0 | ||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
$ echo b > b | ||||
$ hg add b | ||||
$ hg commit -m b -d '1 0' | ||||
|
r41788 | precommit hook: HG_HOOKNAME=precommit | ||
HG_HOOKTYPE=precommit | ||||
HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b | ||||
pretxnopen hook: HG_HOOKNAME=pretxnopen | ||||
HG_HOOKTYPE=pretxnopen | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=commit | ||||
pretxncommit hook: HG_HOOKNAME=pretxncommit | ||||
HG_HOOKTYPE=pretxncommit | ||||
HG_NODE=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 | ||||
HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b | ||||
HG_PENDING=$TESTTMP/a | ||||
|
r12156 | 2:ee9deb46ab31 | ||
|
r41788 | pretxnclose hook: HG_HOOKNAME=pretxnclose | ||
HG_HOOKTYPE=pretxnclose | ||||
HG_PENDING=$TESTTMP/a | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=commit | ||||
|
r27192 | created new head | ||
|
r41788 | txnclose hook: HG_HOOKNAME=txnclose | ||
HG_HOOKTYPE=txnclose | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=commit | ||||
commit hook: HG_HOOKNAME=commit | ||||
HG_HOOKTYPE=commit | ||||
HG_NODE=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 | ||||
HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b | ||||
commit.b hook: HG_HOOKNAME=commit.b | ||||
HG_HOOKTYPE=commit | ||||
HG_NODE=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 | ||||
HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b | ||||
|
r11793 | $ hg merge 1 | ||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
(branch merge, don't forget to commit) | ||||
$ hg commit -m merge -d '2 0' | ||||
|
r41788 | precommit hook: HG_HOOKNAME=precommit | ||
HG_HOOKTYPE=precommit | ||||
HG_PARENT1=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 | ||||
HG_PARENT2=ab228980c14deea8b9555d91c9581127383e40fd | ||||
pretxnopen hook: HG_HOOKNAME=pretxnopen | ||||
HG_HOOKTYPE=pretxnopen | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=commit | ||||
pretxncommit hook: HG_HOOKNAME=pretxncommit | ||||
HG_HOOKTYPE=pretxncommit | ||||
HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 | ||||
HG_PARENT1=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 | ||||
HG_PARENT2=ab228980c14deea8b9555d91c9581127383e40fd | ||||
HG_PENDING=$TESTTMP/a | ||||
|
r12156 | 3:07f3376c1e65 | ||
|
r41788 | pretxnclose hook: HG_HOOKNAME=pretxnclose | ||
HG_HOOKTYPE=pretxnclose | ||||
HG_PENDING=$TESTTMP/a | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=commit | ||||
txnclose hook: HG_HOOKNAME=txnclose | ||||
HG_HOOKTYPE=txnclose | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=commit | ||||
commit hook: HG_HOOKNAME=commit | ||||
HG_HOOKTYPE=commit | ||||
HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 | ||||
HG_PARENT1=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 | ||||
HG_PARENT2=ab228980c14deea8b9555d91c9581127383e40fd | ||||
commit.b hook: HG_HOOKNAME=commit.b | ||||
HG_HOOKTYPE=commit | ||||
HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 | ||||
HG_PARENT1=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 | ||||
HG_PARENT2=ab228980c14deea8b9555d91c9581127383e40fd | ||||
|
r11793 | |||
|
r12328 | test generic hooks | ||
|
r11793 | |||
$ hg id | ||||
|
r41788 | pre-identify hook: HG_ARGS=id | ||
HG_HOOKNAME=pre-identify | ||||
HG_HOOKTYPE=pre-identify | ||||
HG_OPTS={'bookmarks': None, 'branch': None, 'id': None, 'insecure': None, 'num': None, 'remotecmd': '', 'rev': '', 'ssh': '', 'tags': None, 'template': ''} | ||||
HG_PATS=[] | ||||
|
r19011 | abort: pre-identify hook exited with status 1 | ||
[255] | ||||
|
r11793 | $ hg cat b | ||
|
r41788 | pre-cat hook: HG_ARGS=cat b | ||
HG_HOOKNAME=pre-cat | ||||
HG_HOOKTYPE=pre-cat | ||||
HG_OPTS={'decode': None, 'exclude': [], 'include': [], 'output': '', 'rev': '', 'template': ''} | ||||
HG_PATS=['b'] | ||||
|
r13121 | b | ||
|
r41788 | post-cat hook: HG_ARGS=cat b | ||
HG_HOOKNAME=post-cat | ||||
HG_HOOKTYPE=post-cat | ||||
HG_OPTS={'decode': None, 'exclude': [], 'include': [], 'output': '', 'rev': '', 'template': ''} | ||||
HG_PATS=['b'] | ||||
HG_RESULT=0 | ||||
|
r11793 | |||
$ cd ../b | ||||
$ hg pull ../a | ||||
|
r13439 | pulling from ../a | ||
searching for changes | ||||
|
r41788 | prechangegroup hook: HG_HOOKNAME=prechangegroup | ||
HG_HOOKTYPE=prechangegroup | ||||
HG_SOURCE=pull | ||||
HG_TXNID=TXN:$ID$ | ||||
r42062 | HG_TXNNAME=pull | |||
file:/*/$TESTTMP/a (glob) | ||||
|
r41788 | HG_URL=file:$TESTTMP/a | ||
|
r13439 | adding changesets | ||
adding manifests | ||||
adding file changes | ||||
added 3 changesets with 2 changes to 2 files | ||||
|
r34662 | new changesets ab228980c14d:07f3376c1e65 | ||
|
r41788 | changegroup hook: HG_HOOKNAME=changegroup | ||
HG_HOOKTYPE=changegroup | ||||
HG_NODE=ab228980c14deea8b9555d91c9581127383e40fd | ||||
HG_NODE_LAST=07f3376c1e655977439df2a814e3cc14b27abac2 | ||||
HG_SOURCE=pull | ||||
HG_TXNID=TXN:$ID$ | ||||
r42062 | HG_TXNNAME=pull | |||
file:/*/$TESTTMP/a (glob) | ||||
|
r41788 | HG_URL=file:$TESTTMP/a | ||
incoming hook: HG_HOOKNAME=incoming | ||||
HG_HOOKTYPE=incoming | ||||
HG_NODE=ab228980c14deea8b9555d91c9581127383e40fd | ||||
HG_SOURCE=pull | ||||
HG_TXNID=TXN:$ID$ | ||||
r42062 | HG_TXNNAME=pull | |||
file:/*/$TESTTMP/a (glob) | ||||
|
r41788 | HG_URL=file:$TESTTMP/a | ||
incoming hook: HG_HOOKNAME=incoming | ||||
HG_HOOKTYPE=incoming | ||||
HG_NODE=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 | ||||
HG_SOURCE=pull | ||||
HG_TXNID=TXN:$ID$ | ||||
r42062 | HG_TXNNAME=pull | |||
file:/*/$TESTTMP/a (glob) | ||||
|
r41788 | HG_URL=file:$TESTTMP/a | ||
incoming hook: HG_HOOKNAME=incoming | ||||
HG_HOOKTYPE=incoming | ||||
HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 | ||||
HG_SOURCE=pull | ||||
HG_TXNID=TXN:$ID$ | ||||
r42062 | HG_TXNNAME=pull | |||
file:/*/$TESTTMP/a (glob) | ||||
|
r41788 | HG_URL=file:$TESTTMP/a | ||
|
r11793 | (run 'hg update' to get a working copy) | ||
|
r12328 | tag hooks can see env vars | ||
|
r11793 | |||
$ cd ../a | ||||
|
r16964 | $ cat >> .hg/hgrc <<EOF | ||
|
r41788 | > pretag = sh -c "printenv.py --line pretag" | ||
> tag = sh -c "HG_PARENT1= HG_PARENT2= printenv.py --line tag" | ||||
|
r16964 | > EOF | ||
|
r11793 | $ hg tag -d '3 0' a | ||
|
r41788 | pretag hook: HG_HOOKNAME=pretag | ||
HG_HOOKTYPE=pretag | ||||
HG_LOCAL=0 | ||||
HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 | ||||
HG_TAG=a | ||||
precommit hook: HG_HOOKNAME=precommit | ||||
HG_HOOKTYPE=precommit | ||||
HG_PARENT1=07f3376c1e655977439df2a814e3cc14b27abac2 | ||||
pretxnopen hook: HG_HOOKNAME=pretxnopen | ||||
HG_HOOKTYPE=pretxnopen | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=commit | ||||
pretxncommit hook: HG_HOOKNAME=pretxncommit | ||||
HG_HOOKTYPE=pretxncommit | ||||
HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 | ||||
HG_PARENT1=07f3376c1e655977439df2a814e3cc14b27abac2 | ||||
HG_PENDING=$TESTTMP/a | ||||
|
r12156 | 4:539e4b31b6dc | ||
|
r41788 | pretxnclose hook: HG_HOOKNAME=pretxnclose | ||
HG_HOOKTYPE=pretxnclose | ||||
HG_PENDING=$TESTTMP/a | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=commit | ||||
tag hook: HG_HOOKNAME=tag | ||||
HG_HOOKTYPE=tag | ||||
HG_LOCAL=0 | ||||
HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 | ||||
HG_TAG=a | ||||
txnclose hook: HG_HOOKNAME=txnclose | ||||
HG_HOOKTYPE=txnclose | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=commit | ||||
commit hook: HG_HOOKNAME=commit | ||||
HG_HOOKTYPE=commit | ||||
HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 | ||||
HG_PARENT1=07f3376c1e655977439df2a814e3cc14b27abac2 | ||||
commit.b hook: HG_HOOKNAME=commit.b | ||||
HG_HOOKTYPE=commit | ||||
HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 | ||||
HG_PARENT1=07f3376c1e655977439df2a814e3cc14b27abac2 | ||||
|
r11793 | $ hg tag -l la | ||
|
r41788 | pretag hook: HG_HOOKNAME=pretag | ||
HG_HOOKTYPE=pretag | ||||
HG_LOCAL=1 | ||||
HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 | ||||
HG_TAG=la | ||||
tag hook: HG_HOOKNAME=tag | ||||
HG_HOOKTYPE=tag | ||||
HG_LOCAL=1 | ||||
HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 | ||||
HG_TAG=la | ||||
|
r11793 | |||
|
r12328 | pretag hook can forbid tagging | ||
|
r11793 | |||
|
r30234 | $ cat >> .hg/hgrc <<EOF | ||
|
r41788 | > pretag.forbid = sh -c "printenv.py --line pretag.forbid 1" | ||
|
r30234 | > EOF | ||
|
r11793 | $ hg tag -d '4 0' fa | ||
|
r41788 | pretag hook: HG_HOOKNAME=pretag | ||
HG_HOOKTYPE=pretag | ||||
HG_LOCAL=0 | ||||
HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 | ||||
HG_TAG=fa | ||||
pretag.forbid hook: HG_HOOKNAME=pretag.forbid | ||||
HG_HOOKTYPE=pretag | ||||
HG_LOCAL=0 | ||||
HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 | ||||
HG_TAG=fa | ||||
|
r11793 | abort: pretag.forbid hook exited with status 1 | ||
|
r12316 | [255] | ||
|
r11793 | $ hg tag -l fla | ||
|
r41788 | pretag hook: HG_HOOKNAME=pretag | ||
HG_HOOKTYPE=pretag | ||||
HG_LOCAL=1 | ||||
HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 | ||||
HG_TAG=fla | ||||
pretag.forbid hook: HG_HOOKNAME=pretag.forbid | ||||
HG_HOOKTYPE=pretag | ||||
HG_LOCAL=1 | ||||
HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 | ||||
HG_TAG=fla | ||||
|
r11793 | abort: pretag.forbid hook exited with status 1 | ||
|
r12316 | [255] | ||
|
r11793 | |||
|
r12328 | pretxncommit hook can see changeset, can roll back txn, changeset no | ||
more there after | ||||
|
r11793 | |||
|
r30234 | $ cat >> .hg/hgrc <<EOF | ||
> pretxncommit.forbid0 = sh -c "hg tip -q" | ||||
|
r41788 | > pretxncommit.forbid1 = sh -c "printenv.py --line pretxncommit.forbid 1" | ||
|
r30234 | > EOF | ||
|
r11793 | $ echo z > z | ||
$ hg add z | ||||
$ hg -q tip | ||||
|
r12156 | 4:539e4b31b6dc | ||
|
r11793 | $ hg commit -m 'fail' -d '4 0' | ||
|
r41788 | precommit hook: HG_HOOKNAME=precommit | ||
HG_HOOKTYPE=precommit | ||||
HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 | ||||
pretxnopen hook: HG_HOOKNAME=pretxnopen | ||||
HG_HOOKTYPE=pretxnopen | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=commit | ||||
pretxncommit hook: HG_HOOKNAME=pretxncommit | ||||
HG_HOOKTYPE=pretxncommit | ||||
HG_NODE=6f611f8018c10e827fee6bd2bc807f937e761567 | ||||
HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 | ||||
HG_PENDING=$TESTTMP/a | ||||
|
r12156 | 5:6f611f8018c1 | ||
5:6f611f8018c1 | ||||
|
r41788 | pretxncommit.forbid hook: HG_HOOKNAME=pretxncommit.forbid1 | ||
HG_HOOKTYPE=pretxncommit | ||||
HG_NODE=6f611f8018c10e827fee6bd2bc807f937e761567 | ||||
HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 | ||||
HG_PENDING=$TESTTMP/a | ||||
|
r11793 | transaction abort! | ||
|
r45350 | txnabort Python hook: changes,txnid,txnname | ||
|
r41788 | txnabort hook: HG_HOOKNAME=txnabort.1 | ||
HG_HOOKTYPE=txnabort | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=commit | ||||
|
r11793 | rollback completed | ||
abort: pretxncommit.forbid1 hook exited with status 1 | ||||
|
r12316 | [255] | ||
|
r11793 | $ hg -q tip | ||
|
r12156 | 4:539e4b31b6dc | ||
|
r11793 | |||
|
r23292 | (Check that no 'changelog.i.a' file were left behind) | ||
$ ls -1 .hg/store/ | ||||
00changelog.i | ||||
00manifest.i | ||||
data | ||||
|
r37433 | fncache (repofncache !) | ||
|
r23292 | journal.phaseroots | ||
phaseroots | ||||
undo | ||||
|
r37433 | undo.backup.fncache (repofncache !) | ||
|
r23904 | undo.backupfiles | ||
|
r23292 | undo.phaseroots | ||
|
r12328 | precommit hook can prevent commit | ||
|
r11793 | |||
|
r30234 | $ cat >> .hg/hgrc <<EOF | ||
|
r41788 | > precommit.forbid = sh -c "printenv.py --line precommit.forbid 1" | ||
|
r30234 | > EOF | ||
|
r11793 | $ hg commit -m 'fail' -d '4 0' | ||
|
r41788 | precommit hook: HG_HOOKNAME=precommit | ||
HG_HOOKTYPE=precommit | ||||
HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 | ||||
precommit.forbid hook: HG_HOOKNAME=precommit.forbid | ||||
HG_HOOKTYPE=precommit | ||||
HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 | ||||
|
r11793 | abort: precommit.forbid hook exited with status 1 | ||
|
r12316 | [255] | ||
|
r11793 | $ hg -q tip | ||
|
r12156 | 4:539e4b31b6dc | ||
|
r11793 | |||
|
r12328 | preupdate hook can prevent update | ||
|
r11793 | |||
|
r30234 | $ cat >> .hg/hgrc <<EOF | ||
|
r41788 | > preupdate = sh -c "printenv.py --line preupdate" | ||
|
r30234 | > EOF | ||
|
r11793 | $ hg update 1 | ||
|
r41788 | preupdate hook: HG_HOOKNAME=preupdate | ||
HG_HOOKTYPE=preupdate | ||||
HG_PARENT1=ab228980c14d | ||||
|
r11793 | 0 files updated, 0 files merged, 2 files removed, 0 files unresolved | ||
|
r12328 | update hook | ||
|
r11793 | |||
|
r30234 | $ cat >> .hg/hgrc <<EOF | ||
|
r41788 | > update = sh -c "printenv.py --line update" | ||
|
r30234 | > EOF | ||
|
r11793 | $ hg update | ||
|
r41788 | preupdate hook: HG_HOOKNAME=preupdate | ||
HG_HOOKTYPE=preupdate | ||||
HG_PARENT1=539e4b31b6dc | ||||
update hook: HG_ERROR=0 | ||||
HG_HOOKNAME=update | ||||
HG_HOOKTYPE=update | ||||
HG_PARENT1=539e4b31b6dc | ||||
|
r26028 | 2 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
|
r11793 | |||
|
r14102 | pushkey hook | ||
|
r30234 | $ cat >> .hg/hgrc <<EOF | ||
|
r41788 | > pushkey = sh -c "printenv.py --line pushkey" | ||
|
r30234 | > EOF | ||
|
r14102 | $ cd ../b | ||
$ hg bookmark -r null foo | ||||
$ hg push -B foo ../a | ||||
pushing to ../a | ||||
searching for changes | ||||
no changes found | ||||
|
r41788 | pretxnopen hook: HG_HOOKNAME=pretxnopen | ||
HG_HOOKTYPE=pretxnopen | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=push | ||||
pretxnclose hook: HG_BOOKMARK_MOVED=1 | ||||
HG_BUNDLE2=1 | ||||
HG_HOOKNAME=pretxnclose | ||||
HG_HOOKTYPE=pretxnclose | ||||
HG_PENDING=$TESTTMP/a | ||||
HG_SOURCE=push | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=push | ||||
HG_URL=file:$TESTTMP/a | ||||
pushkey hook: HG_BUNDLE2=1 | ||||
HG_HOOKNAME=pushkey | ||||
HG_HOOKTYPE=pushkey | ||||
HG_KEY=foo | ||||
HG_NAMESPACE=bookmarks | ||||
HG_NEW=0000000000000000000000000000000000000000 | ||||
HG_PUSHKEYCOMPAT=1 | ||||
HG_SOURCE=push | ||||
HG_TXNID=TXN:$ID$ | ||||
r42062 | HG_TXNNAME=push | |||
|
r41788 | HG_URL=file:$TESTTMP/a | ||
txnclose hook: HG_BOOKMARK_MOVED=1 | ||||
HG_BUNDLE2=1 | ||||
HG_HOOKNAME=txnclose | ||||
HG_HOOKTYPE=txnclose | ||||
HG_SOURCE=push | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=push | ||||
HG_URL=file:$TESTTMP/a | ||||
|
r14102 | exporting bookmark foo | ||
|
r16038 | [1] | ||
|
r14102 | $ cd ../a | ||
listkeys hook | ||||
|
r30234 | $ cat >> .hg/hgrc <<EOF | ||
|
r41788 | > listkeys = sh -c "printenv.py --line listkeys" | ||
|
r30234 | > EOF | ||
|
r14102 | $ hg bookmark -r null bar | ||
|
r41788 | pretxnopen hook: HG_HOOKNAME=pretxnopen | ||
HG_HOOKTYPE=pretxnopen | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=bookmark | ||||
pretxnclose hook: HG_BOOKMARK_MOVED=1 | ||||
HG_HOOKNAME=pretxnclose | ||||
HG_HOOKTYPE=pretxnclose | ||||
HG_PENDING=$TESTTMP/a | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=bookmark | ||||
txnclose hook: HG_BOOKMARK_MOVED=1 | ||||
HG_HOOKNAME=txnclose | ||||
HG_HOOKTYPE=txnclose | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=bookmark | ||||
|
r14102 | $ cd ../b | ||
$ hg pull -B bar ../a | ||||
pulling from ../a | ||||
|
r41788 | listkeys hook: HG_HOOKNAME=listkeys | ||
HG_HOOKTYPE=listkeys | ||||
HG_NAMESPACE=bookmarks | ||||
HG_VALUES={'bar': '0000000000000000000000000000000000000000', 'foo': '0000000000000000000000000000000000000000'} | ||||
|
r25370 | no changes found | ||
adding remote bookmark bar | ||||
|
r14102 | $ cd ../a | ||
test that prepushkey can prevent incoming keys | ||||
|
r30234 | $ cat >> .hg/hgrc <<EOF | ||
|
r41788 | > prepushkey = sh -c "printenv.py --line prepushkey.forbid 1" | ||
|
r30234 | > EOF | ||
|
r14102 | $ cd ../b | ||
$ hg bookmark -r null baz | ||||
$ hg push -B baz ../a | ||||
pushing to ../a | ||||
searching for changes | ||||
|
r41788 | listkeys hook: HG_HOOKNAME=listkeys | ||
HG_HOOKTYPE=listkeys | ||||
HG_NAMESPACE=phases | ||||
HG_VALUES={'cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b': '1', 'publishing': 'True'} | ||||
listkeys hook: HG_HOOKNAME=listkeys | ||||
HG_HOOKTYPE=listkeys | ||||
HG_NAMESPACE=bookmarks | ||||
HG_VALUES={'bar': '0000000000000000000000000000000000000000', 'foo': '0000000000000000000000000000000000000000'} | ||||
|
r14102 | no changes found | ||
|
r41788 | pretxnopen hook: HG_HOOKNAME=pretxnopen | ||
HG_HOOKTYPE=pretxnopen | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=push | ||||
prepushkey.forbid hook: HG_BUNDLE2=1 | ||||
HG_HOOKNAME=prepushkey | ||||
HG_HOOKTYPE=prepushkey | ||||
HG_KEY=baz | ||||
HG_NAMESPACE=bookmarks | ||||
HG_NEW=0000000000000000000000000000000000000000 | ||||
HG_PUSHKEYCOMPAT=1 | ||||
HG_SOURCE=push | ||||
HG_TXNID=TXN:$ID$ | ||||
r42062 | HG_TXNNAME=push | |||
|
r41788 | HG_URL=file:$TESTTMP/a | ||
|
r35265 | abort: prepushkey hook exited with status 1 | ||
|
r25501 | [255] | ||
|
r14102 | $ cd ../a | ||
test that prelistkeys can prevent listing keys | ||||
|
r30234 | $ cat >> .hg/hgrc <<EOF | ||
|
r41788 | > prelistkeys = sh -c "printenv.py --line prelistkeys.forbid 1" | ||
|
r30234 | > EOF | ||
|
r14102 | $ hg bookmark -r null quux | ||
|
r41788 | pretxnopen hook: HG_HOOKNAME=pretxnopen | ||
HG_HOOKTYPE=pretxnopen | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=bookmark | ||||
pretxnclose hook: HG_BOOKMARK_MOVED=1 | ||||
HG_HOOKNAME=pretxnclose | ||||
HG_HOOKTYPE=pretxnclose | ||||
HG_PENDING=$TESTTMP/a | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=bookmark | ||||
txnclose hook: HG_BOOKMARK_MOVED=1 | ||||
HG_HOOKNAME=txnclose | ||||
HG_HOOKTYPE=txnclose | ||||
HG_TXNID=TXN:$ID$ | ||||
HG_TXNNAME=bookmark | ||||
|
r14102 | $ cd ../b | ||
$ hg pull -B quux ../a | ||||
pulling from ../a | ||||
|
r41788 | prelistkeys.forbid hook: HG_HOOKNAME=prelistkeys | ||
HG_HOOKTYPE=prelistkeys | ||||
HG_NAMESPACE=bookmarks | ||||
|
r14102 | abort: prelistkeys hook exited with status 1 | ||
[255] | ||||
$ cd ../a | ||||
|
r18850 | $ rm .hg/hgrc | ||
|
r14102 | |||
|
r12328 | prechangegroup hook can prevent incoming changes | ||
|
r11793 | |||
$ cd ../b | ||||
$ hg -q tip | ||||
|
r12156 | 3:07f3376c1e65 | ||
|
r16964 | $ cat > .hg/hgrc <<EOF | ||
> [hooks] | ||||
|
r41788 | > prechangegroup.forbid = sh -c "printenv.py --line prechangegroup.forbid 1" | ||
|
r16964 | > EOF | ||
|
r11793 | $ hg pull ../a | ||
pulling from ../a | ||||
searching for changes | ||||
|
r41788 | prechangegroup.forbid hook: HG_HOOKNAME=prechangegroup.forbid | ||
HG_HOOKTYPE=prechangegroup | ||||
HG_SOURCE=pull | ||||
HG_TXNID=TXN:$ID$ | ||||
r42062 | HG_TXNNAME=pull | |||
file:/*/$TESTTMP/a (glob) | ||||
|
r41788 | HG_URL=file:$TESTTMP/a | ||
|
r11793 | abort: prechangegroup.forbid hook exited with status 1 | ||
|
r12316 | [255] | ||
|
r11793 | |||
|
r12328 | pretxnchangegroup hook can see incoming changes, can roll back txn, | ||
incoming changes no longer there after | ||||
|
r11793 | |||
|
r16964 | $ cat > .hg/hgrc <<EOF | ||
> [hooks] | ||||
> pretxnchangegroup.forbid0 = hg tip -q | ||||
|
r41788 | > pretxnchangegroup.forbid1 = sh -c "printenv.py --line pretxnchangegroup.forbid 1" | ||
|
r16964 | > EOF | ||
|
r11793 | $ hg pull ../a | ||
pulling from ../a | ||||
searching for changes | ||||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
|
r13439 | 4:539e4b31b6dc | ||
|
r41788 | pretxnchangegroup.forbid hook: HG_HOOKNAME=pretxnchangegroup.forbid1 | ||
HG_HOOKTYPE=pretxnchangegroup | ||||
HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 | ||||
HG_NODE_LAST=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 | ||||
HG_PENDING=$TESTTMP/b | ||||
HG_SOURCE=pull | ||||
HG_TXNID=TXN:$ID$ | ||||
r42062 | HG_TXNNAME=pull | |||
file:/*/$TESTTMP/a (glob) | ||||
|
r41788 | HG_URL=file:$TESTTMP/a | ||
|
r11793 | transaction abort! | ||
rollback completed | ||||
abort: pretxnchangegroup.forbid1 hook exited with status 1 | ||||
|
r12316 | [255] | ||
|
r11793 | $ hg -q tip | ||
|
r12156 | 3:07f3376c1e65 | ||
|
r11793 | |||
|
r12328 | outgoing hooks can see env vars | ||
|
r11793 | |||
$ rm .hg/hgrc | ||||
|
r16964 | $ cat > ../a/.hg/hgrc <<EOF | ||
> [hooks] | ||||
|
r41788 | > preoutgoing = sh -c "printenv.py --line preoutgoing" | ||
> outgoing = sh -c "printenv.py --line outgoing" | ||||
|
r16964 | > EOF | ||
|
r11793 | $ hg pull ../a | ||
pulling from ../a | ||||
searching for changes | ||||
|
r41788 | preoutgoing hook: HG_HOOKNAME=preoutgoing | ||
HG_HOOKTYPE=preoutgoing | ||||
HG_SOURCE=pull | ||||
outgoing hook: HG_HOOKNAME=outgoing | ||||
HG_HOOKTYPE=outgoing | ||||
HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 | ||||
HG_SOURCE=pull | ||||
|
r11793 | adding changesets | ||
adding manifests | ||||
adding file changes | ||||
r43167 | adding remote bookmark quux | |||
|
r11793 | added 1 changesets with 1 changes to 1 files | ||
|
r34662 | new changesets 539e4b31b6dc | ||
|
r11793 | (run 'hg update' to get a working copy) | ||
$ hg rollback | ||||
|
r13446 | repository tip rolled back to revision 3 (undo pull) | ||
|
r11793 | |||
|
r12328 | preoutgoing hook can prevent outgoing changes | ||
|
r11793 | |||
|
r30234 | $ cat >> ../a/.hg/hgrc <<EOF | ||
|
r41788 | > preoutgoing.forbid = sh -c "printenv.py --line preoutgoing.forbid 1" | ||
|
r30234 | > EOF | ||
|
r11793 | $ hg pull ../a | ||
|
r13439 | pulling from ../a | ||
searching for changes | ||||
|
r41788 | preoutgoing hook: HG_HOOKNAME=preoutgoing | ||
HG_HOOKTYPE=preoutgoing | ||||
HG_SOURCE=pull | ||||
preoutgoing.forbid hook: HG_HOOKNAME=preoutgoing.forbid | ||||
HG_HOOKTYPE=preoutgoing | ||||
HG_SOURCE=pull | ||||
|
r11793 | abort: preoutgoing.forbid hook exited with status 1 | ||
|
r12316 | [255] | ||
|
r11793 | |||
|
r12328 | outgoing hooks work for local clones | ||
|
r11793 | |||
$ cd .. | ||||
|
r16964 | $ cat > a/.hg/hgrc <<EOF | ||
> [hooks] | ||||
|
r41788 | > preoutgoing = sh -c "printenv.py --line preoutgoing" | ||
> outgoing = sh -c "printenv.py --line outgoing" | ||||
|
r16964 | > EOF | ||
|
r11793 | $ hg clone a c | ||
|
r41788 | preoutgoing hook: HG_HOOKNAME=preoutgoing | ||
HG_HOOKTYPE=preoutgoing | ||||
HG_SOURCE=clone | ||||
outgoing hook: HG_HOOKNAME=outgoing | ||||
HG_HOOKTYPE=outgoing | ||||
HG_NODE=0000000000000000000000000000000000000000 | ||||
HG_SOURCE=clone | ||||
|
r11793 | updating to branch default | ||
3 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
$ rm -rf c | ||||
|
r12328 | preoutgoing hook can prevent outgoing changes for local clones | ||
|
r11793 | |||
|
r30234 | $ cat >> a/.hg/hgrc <<EOF | ||
|
r41788 | > preoutgoing.forbid = sh -c "printenv.py --line preoutgoing.forbid 1" | ||
|
r30234 | > EOF | ||
|
r11793 | $ hg clone a zzz | ||
|
r41788 | preoutgoing hook: HG_HOOKNAME=preoutgoing | ||
HG_HOOKTYPE=preoutgoing | ||||
HG_SOURCE=clone | ||||
preoutgoing.forbid hook: HG_HOOKNAME=preoutgoing.forbid | ||||
HG_HOOKTYPE=preoutgoing | ||||
HG_SOURCE=clone | ||||
|
r11793 | abort: preoutgoing.forbid hook exited with status 1 | ||
|
r12316 | [255] | ||
|
r16964 | |||
$ cd "$TESTTMP/b" | ||||
|
r11793 | |||
$ cat > hooktests.py <<EOF | ||||
|
r33687 | > from __future__ import print_function | ||
|
r37772 | > from mercurial import ( | ||
> error, | ||||
> pycompat, | ||||
> ) | ||||
|
r11793 | > | ||
> uncallable = 0 | ||||
> | ||||
|
r34453 | > def printargs(ui, args): | ||
|
r37772 | > a = list(pycompat.byteskwargs(args).items()) | ||
|
r11793 | > a.sort() | ||
|
r36126 | > ui.write(b'hook args:\n') | ||
|
r11793 | > for k, v in a: | ||
|
r36126 | > ui.write(b' %s %s\n' % (k, v)) | ||
|
r11793 | > | ||
|
r34453 | > def passhook(ui, repo, **args): | ||
> printargs(ui, args) | ||||
|
r11793 | > | ||
|
r34453 | > def failhook(ui, repo, **args): | ||
> printargs(ui, args) | ||||
|
r11793 | > return True | ||
> | ||||
> class LocalException(Exception): | ||||
> pass | ||||
> | ||||
> def raisehook(**args): | ||||
|
r37772 | > raise LocalException('exception from hook') | ||
|
r11793 | > | ||
> def aborthook(**args): | ||||
|
r36126 | > raise error.Abort(b'raise abort from hook') | ||
|
r11793 | > | ||
> def brokenhook(**args): | ||||
> return 1 + {} | ||||
> | ||||
|
r14601 | > def verbosehook(ui, **args): | ||
|
r36126 | > ui.note(b'verbose output from hook\n') | ||
|
r14601 | > | ||
|
r15929 | > def printtags(ui, repo, **args): | ||
|
r37771 | > ui.write(b'[%s]\n' % b', '.join(sorted(repo.tags()))) | ||
|
r15929 | > | ||
|
r41880 | > class container(object): | ||
|
r11793 | > unreachable = 1 | ||
> EOF | ||||
|
r40241 | $ cat > syntaxerror.py << NO_CHECK_EOF | ||
|
r28109 | > (foo | ||
|
r40241 | > NO_CHECK_EOF | ||
|
r28109 | |||
|
r12328 | test python hooks | ||
|
r11793 | |||
|
r16964 | #if windows | ||
$ PYTHONPATH="$TESTTMP/b;$PYTHONPATH" | ||||
#else | ||||
$ PYTHONPATH="$TESTTMP/b:$PYTHONPATH" | ||||
#endif | ||||
|
r11793 | $ export PYTHONPATH | ||
$ echo '[hooks]' > ../a/.hg/hgrc | ||||
$ echo 'preoutgoing.broken = python:hooktests.brokenhook' >> ../a/.hg/hgrc | ||||
$ hg pull ../a 2>&1 | grep 'raised an exception' | ||||
error: preoutgoing.broken hook raised an exception: unsupported operand type(s) for +: 'int' and 'dict' | ||||
$ echo '[hooks]' > ../a/.hg/hgrc | ||||
$ echo 'preoutgoing.raise = python:hooktests.raisehook' >> ../a/.hg/hgrc | ||||
$ hg pull ../a 2>&1 | grep 'raised an exception' | ||||
error: preoutgoing.raise hook raised an exception: exception from hook | ||||
$ echo '[hooks]' > ../a/.hg/hgrc | ||||
$ echo 'preoutgoing.abort = python:hooktests.aborthook' >> ../a/.hg/hgrc | ||||
$ hg pull ../a | ||||
pulling from ../a | ||||
searching for changes | ||||
error: preoutgoing.abort hook failed: raise abort from hook | ||||
abort: raise abort from hook | ||||
|
r12316 | [255] | ||
|
r11793 | |||
$ echo '[hooks]' > ../a/.hg/hgrc | ||||
$ echo 'preoutgoing.fail = python:hooktests.failhook' >> ../a/.hg/hgrc | ||||
$ hg pull ../a | ||||
pulling from ../a | ||||
searching for changes | ||||
hook args: | ||||
hooktype preoutgoing | ||||
source pull | ||||
abort: preoutgoing.fail hook failed | ||||
|
r12316 | [255] | ||
|
r11793 | |||
$ echo '[hooks]' > ../a/.hg/hgrc | ||||
$ echo 'preoutgoing.uncallable = python:hooktests.uncallable' >> ../a/.hg/hgrc | ||||
$ hg pull ../a | ||||
pulling from ../a | ||||
searching for changes | ||||
|
r28079 | abort: preoutgoing.uncallable hook is invalid: "hooktests.uncallable" is not callable | ||
|
r12316 | [255] | ||
|
r11793 | |||
$ echo '[hooks]' > ../a/.hg/hgrc | ||||
$ echo 'preoutgoing.nohook = python:hooktests.nohook' >> ../a/.hg/hgrc | ||||
$ hg pull ../a | ||||
pulling from ../a | ||||
searching for changes | ||||
|
r28079 | abort: preoutgoing.nohook hook is invalid: "hooktests.nohook" is not defined | ||
|
r12316 | [255] | ||
|
r11793 | |||
$ echo '[hooks]' > ../a/.hg/hgrc | ||||
$ echo 'preoutgoing.nomodule = python:nomodule' >> ../a/.hg/hgrc | ||||
$ hg pull ../a | ||||
pulling from ../a | ||||
searching for changes | ||||
|
r28106 | abort: preoutgoing.nomodule hook is invalid: "nomodule" not in a module | ||
|
r12316 | [255] | ||
|
r11793 | |||
$ echo '[hooks]' > ../a/.hg/hgrc | ||||
$ echo 'preoutgoing.badmodule = python:nomodule.nowhere' >> ../a/.hg/hgrc | ||||
$ hg pull ../a | ||||
pulling from ../a | ||||
searching for changes | ||||
|
r28079 | abort: preoutgoing.badmodule hook is invalid: import of "nomodule" failed | ||
|
r28080 | (run with --traceback for stack trace) | ||
|
r12316 | [255] | ||
|
r11793 | |||
$ echo '[hooks]' > ../a/.hg/hgrc | ||||
$ echo 'preoutgoing.unreachable = python:hooktests.container.unreachable' >> ../a/.hg/hgrc | ||||
$ hg pull ../a | ||||
pulling from ../a | ||||
searching for changes | ||||
|
r28079 | abort: preoutgoing.unreachable hook is invalid: import of "hooktests.container" failed | ||
|
r28080 | (run with --traceback for stack trace) | ||
|
r12316 | [255] | ||
|
r11793 | |||
$ echo '[hooks]' > ../a/.hg/hgrc | ||||
|
r28109 | $ echo 'preoutgoing.syntaxerror = python:syntaxerror.syntaxerror' >> ../a/.hg/hgrc | ||
$ hg pull ../a | ||||
pulling from ../a | ||||
searching for changes | ||||
abort: preoutgoing.syntaxerror hook is invalid: import of "syntaxerror" failed | ||||
(run with --traceback for stack trace) | ||||
[255] | ||||
|
r43586 | $ hg pull ../a --traceback 2>&1 | egrep 'pulling|searching|^exception|Traceback|SyntaxError|ImportError|ModuleNotFoundError|HookLoadError|abort' | ||
|
r28109 | pulling from ../a | ||
searching for changes | ||||
exception from first failed import attempt: | ||||
Traceback (most recent call last): | ||||
|
r28737 | SyntaxError: * (glob) | ||
|
r28109 | exception from second failed import attempt: | ||
|
r43587 | Traceback (most recent call last): (py3 !) | ||
SyntaxError: * (glob) (py3 !) | ||||
|
r28109 | Traceback (most recent call last): | ||
|
r43587 | ImportError: No module named hgext_syntaxerror (no-py3 !) | ||
ImportError: No module named 'hgext_syntaxerror' (py3 no-py36 !) | ||||
ModuleNotFoundError: No module named 'hgext_syntaxerror' (py36 !) | ||||
|
r28109 | Traceback (most recent call last): | ||
|
r43587 | SyntaxError: * (glob) (py3 !) | ||
Traceback (most recent call last): (py3 !) | ||||
ImportError: No module named 'hgext_syntaxerror' (py3 no-py36 !) | ||||
ModuleNotFoundError: No module named 'hgext_syntaxerror' (py36 !) | ||||
Traceback (most recent call last): (py3 !) | ||||
|
r43585 | HookLoadError: preoutgoing.syntaxerror hook is invalid: import of "syntaxerror" failed (no-py3 !) | ||
|
r44580 | raise error.HookLoadError( (py38 !) | ||
|
r43720 | mercurial.error.HookLoadError: preoutgoing.syntaxerror hook is invalid: import of "syntaxerror" failed (py3 !) | ||
|
r28109 | abort: preoutgoing.syntaxerror hook is invalid: import of "syntaxerror" failed | ||
$ echo '[hooks]' > ../a/.hg/hgrc | ||||
|
r11793 | $ echo 'preoutgoing.pass = python:hooktests.passhook' >> ../a/.hg/hgrc | ||
$ hg pull ../a | ||||
pulling from ../a | ||||
searching for changes | ||||
hook args: | ||||
hooktype preoutgoing | ||||
source pull | ||||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
r43167 | adding remote bookmark quux | |||
|
r11793 | added 1 changesets with 1 changes to 1 files | ||
|
r34662 | new changesets 539e4b31b6dc | ||
|
r11793 | (run 'hg update' to get a working copy) | ||
|
r28107 | post- python hooks that fail to *run* don't cause an abort | ||
$ rm ../a/.hg/hgrc | ||||
$ echo '[hooks]' > .hg/hgrc | ||||
$ echo 'post-pull.broken = python:hooktests.brokenhook' >> .hg/hgrc | ||||
$ hg pull ../a | ||||
pulling from ../a | ||||
searching for changes | ||||
no changes found | ||||
error: post-pull.broken hook raised an exception: unsupported operand type(s) for +: 'int' and 'dict' | ||||
|
r28108 | (run with --traceback for stack trace) | ||
|
r28107 | |||
but post- python hooks that fail to *load* do | ||||
$ echo '[hooks]' > .hg/hgrc | ||||
$ echo 'post-pull.nomodule = python:nomodule' >> .hg/hgrc | ||||
$ hg pull ../a | ||||
pulling from ../a | ||||
searching for changes | ||||
no changes found | ||||
abort: post-pull.nomodule hook is invalid: "nomodule" not in a module | ||||
[255] | ||||
$ echo '[hooks]' > .hg/hgrc | ||||
$ echo 'post-pull.badmodule = python:nomodule.nowhere' >> .hg/hgrc | ||||
$ hg pull ../a | ||||
pulling from ../a | ||||
searching for changes | ||||
no changes found | ||||
abort: post-pull.badmodule hook is invalid: import of "nomodule" failed | ||||
(run with --traceback for stack trace) | ||||
[255] | ||||
$ echo '[hooks]' > .hg/hgrc | ||||
$ echo 'post-pull.nohook = python:hooktests.nohook' >> .hg/hgrc | ||||
$ hg pull ../a | ||||
pulling from ../a | ||||
searching for changes | ||||
no changes found | ||||
abort: post-pull.nohook hook is invalid: "hooktests.nohook" is not defined | ||||
[255] | ||||
|
r12328 | make sure --traceback works | ||
|
r11793 | |||
$ echo '[hooks]' > .hg/hgrc | ||||
$ echo 'commit.abort = python:hooktests.aborthook' >> .hg/hgrc | ||||
$ echo aa > a | ||||
$ hg --traceback commit -d '0 0' -ma 2>&1 | grep '^Traceback' | ||||
Traceback (most recent call last): | ||||
$ cd .. | ||||
$ hg init c | ||||
$ cd c | ||||
$ cat > hookext.py <<EOF | ||||
|
r34453 | > def autohook(ui, **args): | ||
|
r37772 | > ui.write(b'Automatically installed hook\n') | ||
|
r11793 | > | ||
> def reposetup(ui, repo): | ||||
|
r37772 | > repo.ui.setconfig(b"hooks", b"commit.auto", autohook) | ||
|
r11793 | > EOF | ||
$ echo '[extensions]' >> .hg/hgrc | ||||
$ echo 'hookext = hookext.py' >> .hg/hgrc | ||||
$ touch foo | ||||
$ hg add foo | ||||
$ hg ci -d '0 0' -m 'add foo' | ||||
Automatically installed hook | ||||
$ echo >> foo | ||||
|
r11794 | $ hg ci --debug -d '0 0' -m 'change foo' | ||
|
r23749 | committing files: | ||
|
r11793 | foo | ||
|
r23749 | committing manifest | ||
committing changelog | ||||
|
r32267 | updating the branch cache | ||
|
r27192 | committed changeset 1:52998019f6252a2b893452765fcb0a47351a5708 | ||
|
r20548 | calling hook commit.auto: hgext_hookext.autohook | ||
|
r11793 | Automatically installed hook | ||
|
r11794 | $ hg showconfig hooks | ||
|
r12376 | hooks.commit.auto=<function autohook at *> (glob) | ||
|
r11793 | |||
|
r12328 | test python hook configured with python:[file]:[hook] syntax | ||
|
r11793 | |||
$ cd .. | ||||
$ mkdir d | ||||
$ cd d | ||||
$ hg init repo | ||||
$ mkdir hooks | ||||
$ cd hooks | ||||
$ cat > testhooks.py <<EOF | ||||
|
r34453 | > def testhook(ui, **args): | ||
|
r36126 | > ui.write(b'hook works\n') | ||
|
r11793 | > EOF | ||
$ echo '[hooks]' > ../repo/.hg/hgrc | ||||
$ echo "pre-commit.test = python:`pwd`/testhooks.py:testhook" >> ../repo/.hg/hgrc | ||||
$ cd ../repo | ||||
$ hg commit -d '0 0' | ||||
hook works | ||||
nothing changed | ||||
|
r12316 | [1] | ||
|
r11793 | |||
|
r17217 | $ echo '[hooks]' > .hg/hgrc | ||
|
r17492 | $ echo "update.ne = python:`pwd`/nonexistent.py:testhook" >> .hg/hgrc | ||
|
r17217 | $ echo "pre-identify.npmd = python:`pwd`/:no_python_module_dir" >> .hg/hgrc | ||
$ hg up null | ||||
loading update.ne hook failed: | ||||
|
r41465 | abort: $ENOENT$: '$TESTTMP/d/repo/nonexistent.py' | ||
|
r17217 | [255] | ||
$ hg id | ||||
loading pre-identify.npmd hook failed: | ||||
|
r46518 | abort: No module named repo (no-py3 !) | ||
abort: No module named 'repo' (py3 !) | ||||
|
r17217 | [255] | ||
|
r11793 | $ cd ../../b | ||
|
r12328 | make sure --traceback works on hook import failure | ||
|
r11793 | |||
$ cat > importfail.py <<EOF | ||||
> import somebogusmodule | ||||
> # dereference something in the module to force demandimport to load it | ||||
> somebogusmodule.whatever | ||||
> EOF | ||||
$ echo '[hooks]' > .hg/hgrc | ||||
$ echo 'precommit.importfail = python:importfail.whatever' >> .hg/hgrc | ||||
$ echo a >> a | ||||
|
r43586 | $ hg --traceback commit -ma 2>&1 | egrep '^exception|ImportError|ModuleNotFoundError|Traceback|HookLoadError|abort' | ||
|
r11793 | exception from first failed import attempt: | ||
Traceback (most recent call last): | ||||
|
r43587 | ImportError: No module named somebogusmodule (no-py3 !) | ||
ImportError: No module named 'somebogusmodule' (py3 no-py36 !) | ||||
ModuleNotFoundError: No module named 'somebogusmodule' (py36 !) | ||||
|
r11793 | exception from second failed import attempt: | ||
|
r43587 | Traceback (most recent call last): (py3 !) | ||
ImportError: No module named 'somebogusmodule' (py3 no-py36 !) | ||||
ModuleNotFoundError: No module named 'somebogusmodule' (py36 !) | ||||
Traceback (most recent call last): (py3 !) | ||||
ImportError: No module named 'hgext_importfail' (py3 no-py36 !) | ||||
ModuleNotFoundError: No module named 'hgext_importfail' (py36 !) | ||||
Traceback (most recent call last): (py3 !) | ||||
ImportError: No module named 'somebogusmodule' (py3 no-py36 !) | ||||
ModuleNotFoundError: No module named 'somebogusmodule' (py36 !) | ||||
|
r11793 | Traceback (most recent call last): | ||
|
r43587 | ImportError: No module named hgext_importfail (no-py3 !) | ||
ImportError: No module named 'hgext_importfail' (py3 no-py36 !) | ||||
ModuleNotFoundError: No module named 'hgext_importfail' (py36 !) | ||||
|
r11793 | Traceback (most recent call last): | ||
|
r43585 | HookLoadError: precommit.importfail hook is invalid: import of "importfail" failed (no-py3 !) | ||
|
r44580 | raise error.HookLoadError( (py38 !) | ||
|
r43720 | mercurial.error.HookLoadError: precommit.importfail hook is invalid: import of "importfail" failed (py3 !) | ||
|
r28079 | abort: precommit.importfail hook is invalid: import of "importfail" failed | ||
|
r11793 | |||
|
r12399 | Issue1827: Hooks Update & Commit not completely post operation | ||
|
r24881 | commit and update hooks should run after command completion. The largefiles | ||
use demonstrates a recursive wlock, showing the hook doesn't run until the | ||||
final release (and dirstate flush). | ||||
|
r11793 | |||
$ echo '[hooks]' > .hg/hgrc | ||||
$ echo 'commit = hg id' >> .hg/hgrc | ||||
$ echo 'update = hg id' >> .hg/hgrc | ||||
$ echo bb > a | ||||
|
r12156 | $ hg ci -ma | ||
223eafe2750c tip | ||||
|
r24881 | $ hg up 0 --config extensions.largefiles= | ||
|
r33209 | The fsmonitor extension is incompatible with the largefiles extension and has been disabled. (fsmonitor !) | ||
|
r26752 | cb9a9f314b8b | ||
|
r26028 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
|
r11793 | |||
|
r17508 | make sure --verbose (and --quiet/--debug etc.) are propagated to the local ui | ||
|
r14601 | that is passed to pre/post hooks | ||
$ echo '[hooks]' > .hg/hgrc | ||||
$ echo 'pre-identify = python:hooktests.verbosehook' >> .hg/hgrc | ||||
$ hg id | ||||
cb9a9f314b8b | ||||
$ hg id --verbose | ||||
calling hook pre-identify: hooktests.verbosehook | ||||
verbose output from hook | ||||
cb9a9f314b8b | ||||
|
r15896 | |||
Ensure hooks can be prioritized | ||||
$ echo '[hooks]' > .hg/hgrc | ||||
$ echo 'pre-identify.a = python:hooktests.verbosehook' >> .hg/hgrc | ||||
$ echo 'pre-identify.b = python:hooktests.verbosehook' >> .hg/hgrc | ||||
$ echo 'priority.pre-identify.b = 1' >> .hg/hgrc | ||||
$ echo 'pre-identify.c = python:hooktests.verbosehook' >> .hg/hgrc | ||||
$ hg id --verbose | ||||
calling hook pre-identify.b: hooktests.verbosehook | ||||
verbose output from hook | ||||
calling hook pre-identify.a: hooktests.verbosehook | ||||
verbose output from hook | ||||
calling hook pre-identify.c: hooktests.verbosehook | ||||
verbose output from hook | ||||
cb9a9f314b8b | ||||
|
r15929 | |||
new tags must be visible in pretxncommit (issue3210) | ||||
$ echo 'pretxncommit.printtags = python:hooktests.printtags' >> .hg/hgrc | ||||
$ hg tag -f foo | ||||
|
r37771 | [a, foo, tip] | ||
|
r15929 | |||
|
r27228 | post-init hooks must not crash (issue4983) | ||
This also creates the `to` repo for the next test block. | ||||
$ cd .. | ||||
$ cat << EOF >> hgrc-with-post-init-hook | ||||
> [hooks] | ||||
|
r41788 | > post-init = sh -c "printenv.py --line post-init" | ||
|
r27228 | > EOF | ||
$ HGRCPATH=hgrc-with-post-init-hook hg init to | ||||
|
r41788 | post-init hook: HG_ARGS=init to | ||
HG_HOOKNAME=post-init | ||||
HG_HOOKTYPE=post-init | ||||
HG_OPTS={'insecure': None, 'remotecmd': '', 'ssh': ''} | ||||
HG_PATS=['to'] | ||||
HG_RESULT=0 | ||||
|
r27228 | |||
|
r16619 | new commits must be visible in pretxnchangegroup (issue3428) | ||
$ echo '[hooks]' >> to/.hg/hgrc | ||||
|
r26859 | $ echo 'prechangegroup = hg --traceback tip' >> to/.hg/hgrc | ||
|
r16619 | $ echo 'pretxnchangegroup = hg --traceback tip' >> to/.hg/hgrc | ||
$ echo a >> to/a | ||||
$ hg --cwd to ci -Ama | ||||
adding a | ||||
$ hg clone to from | ||||
updating to branch default | ||||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
$ echo aa >> from/a | ||||
$ hg --cwd from ci -mb | ||||
$ hg --cwd from push | ||||
|
r35394 | pushing to $TESTTMP/to | ||
|
r16619 | searching for changes | ||
|
r26859 | changeset: 0:cb9a9f314b8b | ||
tag: tip | ||||
user: test | ||||
date: Thu Jan 01 00:00:00 1970 +0000 | ||||
summary: a | ||||
|
r16619 | adding changesets | ||
adding manifests | ||||
adding file changes | ||||
changeset: 1:9836a07b9b9d | ||||
tag: tip | ||||
user: test | ||||
date: Thu Jan 01 00:00:00 1970 +0000 | ||||
summary: b | ||||
r43167 | added 1 changesets with 1 changes to 1 files | |||
|
r27924 | |||
pretxnclose hook failure should abort the transaction | ||||
$ hg init txnfailure | ||||
$ cd txnfailure | ||||
$ touch a && hg commit -Aqm a | ||||
$ cat >> .hg/hgrc <<EOF | ||||
> [hooks] | ||||
> pretxnclose.error = exit 1 | ||||
> EOF | ||||
$ hg strip -r 0 --config extensions.strip= | ||||
0 files updated, 0 files merged, 1 files removed, 0 files unresolved | ||||
saved backup bundle to * (glob) | ||||
transaction abort! | ||||
rollback completed | ||||
|
r29954 | strip failed, backup bundle stored in * (glob) | ||
|
r27924 | abort: pretxnclose.error hook exited with status 1 | ||
[255] | ||||
$ hg recover | ||||
no interrupted transaction available | ||||
[1] | ||||
|
r28938 | $ cd .. | ||
|
r31054 | check whether HG_PENDING makes pending changes only in related | ||
repositories visible to an external hook. | ||||
(emulate a transaction running concurrently by copied | ||||
.hg/store/00changelog.i.a in subsequent test) | ||||
$ cat > $TESTTMP/savepending.sh <<EOF | ||||
> cp .hg/store/00changelog.i.a .hg/store/00changelog.i.a.saved | ||||
> exit 1 # to avoid adding new revision for subsequent tests | ||||
> EOF | ||||
$ cd a | ||||
$ hg tip -q | ||||
4:539e4b31b6dc | ||||
$ hg --config hooks.pretxnclose="sh $TESTTMP/savepending.sh" commit -m "invisible" | ||||
transaction abort! | ||||
rollback completed | ||||
abort: pretxnclose hook exited with status 1 | ||||
[255] | ||||
$ cp .hg/store/00changelog.i.a.saved .hg/store/00changelog.i.a | ||||
(check (in)visibility of new changeset while transaction running in | ||||
repo) | ||||
$ cat > $TESTTMP/checkpending.sh <<EOF | ||||
> echo '@a' | ||||
|
r31767 | > hg -R "$TESTTMP/a" tip -q | ||
|
r31054 | > echo '@a/nested' | ||
|
r31767 | > hg -R "$TESTTMP/a/nested" tip -q | ||
|
r31054 | > exit 1 # to avoid adding new revision for subsequent tests | ||
> EOF | ||||
$ hg init nested | ||||
$ cd nested | ||||
$ echo a > a | ||||
$ hg add a | ||||
$ hg --config hooks.pretxnclose="sh $TESTTMP/checkpending.sh" commit -m '#0' | ||||
@a | ||||
4:539e4b31b6dc | ||||
@a/nested | ||||
0:bf5e395ced2c | ||||
transaction abort! | ||||
rollback completed | ||||
abort: pretxnclose hook exited with status 1 | ||||
[255] | ||||
|
r28938 | Hook from untrusted hgrc are reported as failure | ||
================================================ | ||||
$ cat << EOF > $TESTTMP/untrusted.py | ||||
> from mercurial import scmutil, util | ||||
> def uisetup(ui): | ||||
> class untrustedui(ui.__class__): | ||||
> def _trusted(self, fp, f): | ||||
|
r36126 | > if util.normpath(fp.name).endswith(b'untrusted/.hg/hgrc'): | ||
|
r28938 | > return False | ||
> return super(untrustedui, self)._trusted(fp, f) | ||||
> ui.__class__ = untrustedui | ||||
> EOF | ||||
$ cat << EOF >> $HGRCPATH | ||||
> [extensions] | ||||
> untrusted=$TESTTMP/untrusted.py | ||||
> EOF | ||||
$ hg init untrusted | ||||
$ cd untrusted | ||||
Non-blocking hook | ||||
----------------- | ||||
$ cat << EOF >> .hg/hgrc | ||||
> [hooks] | ||||
> txnclose.testing=echo txnclose hook called | ||||
> EOF | ||||
$ touch a && hg commit -Aqm a | ||||
|
r31743 | warning: untrusted hook txnclose.testing not executed | ||
|
r28938 | $ hg log | ||
changeset: 0:3903775176ed | ||||
tag: tip | ||||
user: test | ||||
date: Thu Jan 01 00:00:00 1970 +0000 | ||||
summary: a | ||||
Non-blocking hook | ||||
----------------- | ||||
$ cat << EOF >> .hg/hgrc | ||||
> [hooks] | ||||
> pretxnclose.testing=echo pre-txnclose hook called | ||||
> EOF | ||||
$ touch b && hg commit -Aqm a | ||||
transaction abort! | ||||
rollback completed | ||||
|
r31743 | abort: untrusted hook pretxnclose.testing not executed | ||
|
r28938 | (see 'hg help config.trusted') | ||
[255] | ||||
$ hg log | ||||
changeset: 0:3903775176ed | ||||
tag: tip | ||||
user: test | ||||
date: Thu Jan 01 00:00:00 1970 +0000 | ||||
summary: a | ||||