test-hook.t
937 lines
| 34.7 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 | ||
> def showargs(ui, repo, hooktype, **kwargs): | ||||
|
r33261 | > ui.write('%s Python hook: %s\n' % (hooktype, ','.join(sorted(kwargs)))) | ||
|
r25218 | > EOF | ||
|
r11793 | $ hg init a | ||
$ cd a | ||||
|
r16964 | $ cat > .hg/hgrc <<EOF | ||
> [hooks] | ||||
|
r25478 | > commit = sh -c "HG_LOCAL= HG_TAG= printenv.py commit" | ||
> commit.b = sh -c "HG_LOCAL= HG_TAG= printenv.py commit.b" | ||||
> precommit = sh -c "HG_LOCAL= HG_NODE= HG_TAG= printenv.py precommit" | ||||
> pretxncommit = sh -c "HG_LOCAL= HG_TAG= printenv.py pretxncommit" | ||||
|
r16964 | > pretxncommit.tip = hg -q tip | ||
|
r30234 | > pre-identify = sh -c "printenv.py pre-identify 1" | ||
> pre-cat = sh -c "printenv.py pre-cat" | ||||
> post-cat = sh -c "printenv.py post-cat" | ||||
|
r25478 | > pretxnopen = sh -c "HG_LOCAL= HG_TAG= printenv.py pretxnopen" | ||
> pretxnclose = sh -c "HG_LOCAL= HG_TAG= printenv.py pretxnclose" | ||||
> txnclose = sh -c "HG_LOCAL= HG_TAG= printenv.py txnclose" | ||||
|
r25218 | > txnabort.0 = python:$TESTTMP/txnabort.checkargs.py:showargs | ||
|
r25478 | > txnabort.1 = sh -c "HG_LOCAL= HG_TAG= printenv.py txnabort" | ||
|
r24827 | > txnclose.checklock = sh -c "hg debuglock > /dev/null" | ||
|
r16964 | > EOF | ||
|
r11793 | $ echo a > a | ||
$ hg add a | ||||
|
r12156 | $ hg commit -m a | ||
|
r31747 | 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 | ||
|
r31747 | 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] | ||||
|
r30234 | > prechangegroup = sh -c "printenv.py prechangegroup" | ||
> changegroup = sh -c "printenv.py changegroup" | ||||
> incoming = sh -c "printenv.py 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" | ||||
|
r31747 | 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 | ||
|
r31747 | 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' | ||||
|
r31747 | 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 | ||
|
r31747 | pretxnclose hook: HG_HOOKNAME=pretxnclose HG_HOOKTYPE=pretxnclose HG_PENDING=$TESTTMP/a HG_TXNID=TXN:$ID$ HG_TXNNAME=commit | ||
|
r27192 | created new head | ||
|
r31747 | 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' | ||||
|
r31747 | 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 | ||
|
r31747 | 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 | ||||
|
r33051 | 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 | ||
|
r32578 | 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 | ||
|
r32578 | 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 | ||||
|
r31747 | prechangegroup hook: HG_HOOKNAME=prechangegroup HG_HOOKTYPE=prechangegroup HG_SOURCE=pull HG_TXNID=TXN:$ID$ HG_URL=file:$TESTTMP/a | ||
|
r13439 | adding changesets | ||
adding manifests | ||||
adding file changes | ||||
added 3 changesets with 2 changes to 2 files | ||||
|
r31747 | changegroup hook: HG_HOOKNAME=changegroup HG_HOOKTYPE=changegroup HG_NODE=ab228980c14deea8b9555d91c9581127383e40fd HG_NODE_LAST=07f3376c1e655977439df2a814e3cc14b27abac2 HG_SOURCE=pull HG_TXNID=TXN:$ID$ HG_URL=file:$TESTTMP/a | ||
incoming hook: HG_HOOKNAME=incoming HG_HOOKTYPE=incoming HG_NODE=ab228980c14deea8b9555d91c9581127383e40fd HG_SOURCE=pull HG_TXNID=TXN:$ID$ HG_URL=file:$TESTTMP/a | ||||
incoming hook: HG_HOOKNAME=incoming HG_HOOKTYPE=incoming HG_NODE=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_SOURCE=pull HG_TXNID=TXN:$ID$ HG_URL=file:$TESTTMP/a | ||||
incoming hook: HG_HOOKNAME=incoming HG_HOOKTYPE=incoming HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_SOURCE=pull HG_TXNID=TXN:$ID$ 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 | ||
|
r30234 | > pretag = sh -c "printenv.py pretag" | ||
|
r25478 | > tag = sh -c "HG_PARENT1= HG_PARENT2= printenv.py tag" | ||
|
r16964 | > EOF | ||
|
r11793 | $ hg tag -d '3 0' a | ||
|
r31747 | 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 | ||
|
r31747 | 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 | ||
|
r31747 | 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 | ||
> pretag.forbid = sh -c "printenv.py pretag.forbid 1" | ||||
> EOF | ||||
|
r11793 | $ hg tag -d '4 0' fa | ||
|
r31747 | 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 | ||
|
r31747 | 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" | ||||
> pretxncommit.forbid1 = sh -c "printenv.py pretxncommit.forbid 1" | ||||
> EOF | ||||
|
r11793 | $ echo z > z | ||
$ hg add z | ||||
$ hg -q tip | ||||
|
r12156 | 4:539e4b31b6dc | ||
|
r11793 | $ hg commit -m 'fail' -d '4 0' | ||
|
r31747 | 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 | ||||
|
r31747 | pretxncommit.forbid hook: HG_HOOKNAME=pretxncommit.forbid1 HG_HOOKTYPE=pretxncommit HG_NODE=6f611f8018c10e827fee6bd2bc807f937e761567 HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_PENDING=$TESTTMP/a | ||
|
r11793 | transaction abort! | ||
|
r33261 | txnabort Python hook: txnid,txnname | ||
|
r31747 | 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 | ||||
fncache | ||||
journal.phaseroots | ||||
phaseroots | ||||
undo | ||||
|
r23904 | undo.backup.fncache | ||
undo.backupfiles | ||||
|
r23292 | undo.phaseroots | ||
|
r12328 | precommit hook can prevent commit | ||
|
r11793 | |||
|
r30234 | $ cat >> .hg/hgrc <<EOF | ||
> precommit.forbid = sh -c "printenv.py precommit.forbid 1" | ||||
> EOF | ||||
|
r11793 | $ hg commit -m 'fail' -d '4 0' | ||
|
r31747 | 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 | ||
> preupdate = sh -c "printenv.py preupdate" | ||||
> EOF | ||||
|
r11793 | $ hg update 1 | ||
|
r31747 | 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 | ||
> update = sh -c "printenv.py update" | ||||
> EOF | ||||
|
r11793 | $ hg update | ||
|
r31747 | 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 | ||
> pushkey = sh -c "printenv.py pushkey" | ||||
> EOF | ||||
|
r14102 | $ cd ../b | ||
$ hg bookmark -r null foo | ||||
$ hg push -B foo ../a | ||||
pushing to ../a | ||||
searching for changes | ||||
no changes found | ||||
|
r31747 | 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_HOOKNAME=pushkey HG_HOOKTYPE=pushkey HG_KEY=foo HG_NAMESPACE=bookmarks HG_NEW=0000000000000000000000000000000000000000 HG_RET=1 | ||||
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 | ||
> listkeys = sh -c "printenv.py listkeys" | ||||
> EOF | ||||
|
r14102 | $ hg bookmark -r null bar | ||
|
r31747 | 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 | ||||
|
r31747 | listkeys hook: HG_HOOKNAME=listkeys HG_HOOKTYPE=listkeys HG_NAMESPACE=bookmarks HG_VALUES={'bar': '0000000000000000000000000000000000000000', 'foo': '0000000000000000000000000000000000000000'} | ||
|
r25370 | no changes found | ||
|
r31747 | listkeys hook: HG_HOOKNAME=listkeys HG_HOOKTYPE=listkeys HG_NAMESPACE=phases HG_VALUES={'cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b': '1', 'publishing': 'True'} | ||
|
r25370 | adding remote bookmark bar | ||
|
r14102 | $ cd ../a | ||
test that prepushkey can prevent incoming keys | ||||
|
r30234 | $ cat >> .hg/hgrc <<EOF | ||
> prepushkey = sh -c "printenv.py prepushkey.forbid 1" | ||||
> EOF | ||||
|
r14102 | $ cd ../b | ||
$ hg bookmark -r null baz | ||||
$ hg push -B baz ../a | ||||
pushing to ../a | ||||
searching for changes | ||||
|
r31747 | 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 | ||
|
r31747 | 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_SOURCE=push HG_TXNID=TXN:$ID$ HG_URL=file:$TESTTMP/a | ||||
|
r25370 | pushkey-abort: prepushkey hook exited with status 1 | ||
|
r25501 | abort: exporting bookmark baz failed! | ||
[255] | ||||
|
r14102 | $ cd ../a | ||
test that prelistkeys can prevent listing keys | ||||
|
r30234 | $ cat >> .hg/hgrc <<EOF | ||
> prelistkeys = sh -c "printenv.py prelistkeys.forbid 1" | ||||
> EOF | ||||
|
r14102 | $ hg bookmark -r null quux | ||
|
r31747 | 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 | ||||
|
r31747 | 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] | ||||
|
r30234 | > prechangegroup.forbid = sh -c "printenv.py prechangegroup.forbid 1" | ||
|
r16964 | > EOF | ||
|
r11793 | $ hg pull ../a | ||
pulling from ../a | ||||
searching for changes | ||||
|
r31747 | prechangegroup.forbid hook: HG_HOOKNAME=prechangegroup.forbid HG_HOOKTYPE=prechangegroup HG_SOURCE=pull HG_TXNID=TXN:$ID$ 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 | ||||
|
r30234 | > pretxnchangegroup.forbid1 = sh -c "printenv.py pretxnchangegroup.forbid 1" | ||
|
r16964 | > EOF | ||
|
r11793 | $ hg pull ../a | ||
pulling from ../a | ||||
searching for changes | ||||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
added 1 changesets with 1 changes to 1 files | ||||
|
r13439 | 4:539e4b31b6dc | ||
|
r31747 | 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$ 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] | ||||
|
r30234 | > preoutgoing = sh -c "printenv.py preoutgoing" | ||
> outgoing = sh -c "printenv.py outgoing" | ||||
|
r16964 | > EOF | ||
|
r11793 | $ hg pull ../a | ||
pulling from ../a | ||||
searching for changes | ||||
|
r31747 | 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 | ||||
added 1 changesets with 1 changes to 1 files | ||||
|
r16697 | adding remote bookmark quux | ||
|
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 | ||
> preoutgoing.forbid = sh -c "printenv.py preoutgoing.forbid 1" | ||||
> EOF | ||||
|
r11793 | $ hg pull ../a | ||
|
r13439 | pulling from ../a | ||
searching for changes | ||||
|
r31747 | 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] | ||||
|
r30234 | > preoutgoing = sh -c "printenv.py preoutgoing" | ||
> outgoing = sh -c "printenv.py outgoing" | ||||
|
r16964 | > EOF | ||
|
r11793 | $ hg clone a c | ||
|
r31747 | 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 | ||
> preoutgoing.forbid = sh -c "printenv.py preoutgoing.forbid 1" | ||||
> EOF | ||||
|
r11793 | $ hg clone a zzz | ||
|
r31747 | 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 | ||||
|
r26587 | > from mercurial import error | ||
|
r11793 | > | ||
> uncallable = 0 | ||||
> | ||||
> def printargs(args): | ||||
> args.pop('ui', None) | ||||
> args.pop('repo', None) | ||||
> a = list(args.items()) | ||||
> a.sort() | ||||
> print 'hook args:' | ||||
> for k, v in a: | ||||
> print ' ', k, v | ||||
> | ||||
> def passhook(**args): | ||||
> printargs(args) | ||||
> | ||||
> def failhook(**args): | ||||
> printargs(args) | ||||
> return True | ||||
> | ||||
> class LocalException(Exception): | ||||
> pass | ||||
> | ||||
> def raisehook(**args): | ||||
> raise LocalException('exception from hook') | ||||
> | ||||
> def aborthook(**args): | ||||
|
r26587 | > raise error.Abort('raise abort from hook') | ||
|
r11793 | > | ||
> def brokenhook(**args): | ||||
> return 1 + {} | ||||
> | ||||
|
r14601 | > def verbosehook(ui, **args): | ||
> ui.note('verbose output from hook\n') | ||||
> | ||||
|
r15929 | > def printtags(ui, repo, **args): | ||
|
r18377 | > print sorted(repo.tags()) | ||
|
r15929 | > | ||
|
r11793 | > class container: | ||
> unreachable = 1 | ||||
> EOF | ||||
|
r28109 | $ cat > syntaxerror.py << EOF | ||
> (foo | ||||
> EOF | ||||
|
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] | ||||
|
r28444 | The second egrep is to filter out lines like ' ^', which are slightly | ||
different between Python 2.6 and Python 2.7. | ||||
$ hg pull ../a --traceback 2>&1 | egrep -v '^( +File| [_a-zA-Z*(])' | egrep -v '^( )+(\^)?$' | ||||
|
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: | ||
Traceback (most recent call last): | ||||
ImportError: No module named hgext_syntaxerror | ||||
Traceback (most recent call last): | ||||
HookLoadError: preoutgoing.syntaxerror hook is invalid: import of "syntaxerror" failed | ||||
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 | ||||
added 1 changesets with 1 changes to 1 files | ||||
|
r16697 | adding remote bookmark quux | ||
|
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 | ||||
> def autohook(**args): | ||||
> print "Automatically installed hook" | ||||
> | ||||
> def reposetup(ui, repo): | ||||
> repo.ui.setconfig("hooks", "commit.auto", autohook) | ||||
> 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 | ||||
> def testhook(**args): | ||||
> print 'hook works' | ||||
> 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: | ||||
|
r17492 | abort: No such file or directory: $TESTTMP/d/repo/nonexistent.py | ||
|
r17217 | [255] | ||
$ hg id | ||||
loading pre-identify.npmd hook failed: | ||||
abort: No module named repo! | ||||
[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 | ||||
|
r17283 | $ hg --traceback commit -ma 2>&1 | egrep -v '^( +File| [a-zA-Z(])' | ||
|
r11793 | exception from first failed import attempt: | ||
Traceback (most recent call last): | ||||
ImportError: No module named somebogusmodule | ||||
exception from second failed import attempt: | ||||
Traceback (most recent call last): | ||||
ImportError: No module named hgext_importfail | ||||
Traceback (most recent call last): | ||||
|
r28079 | HookLoadError: precommit.importfail hook is invalid: import of "importfail" failed | ||
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 | ||||
['a', 'foo', 'tip'] | ||||
|
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] | ||||
|
r30234 | > post-init = sh -c "printenv.py post-init" | ||
|
r27228 | > EOF | ||
$ HGRCPATH=hgrc-with-post-init-hook hg init to | ||||
|
r31747 | 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 | ||||
|
r16964 | pushing to $TESTTMP/to (glob) | ||
|
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 | ||||
added 1 changesets with 1 changes to 1 files | ||||
changeset: 1:9836a07b9b9d | ||||
tag: tip | ||||
user: test | ||||
date: Thu Jan 01 00:00:00 1970 +0000 | ||||
summary: b | ||||
|
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): | ||||
> if util.normpath(fp.name).endswith('untrusted/.hg/hgrc'): | ||||
> 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 | ||||