##// END OF EJS Templates
test-hook: make test compatible with chg...
Saurabh Singh -
r34453:26c879bb default
parent child Browse files
Show More
@@ -1,937 +1,935 b''
1 commit hooks can see env vars
1 commit hooks can see env vars
2 (and post-transaction one are run unlocked)
2 (and post-transaction one are run unlocked)
3
3
4
4
5 $ cat > $TESTTMP/txnabort.checkargs.py <<EOF
5 $ cat > $TESTTMP/txnabort.checkargs.py <<EOF
6 > def showargs(ui, repo, hooktype, **kwargs):
6 > def showargs(ui, repo, hooktype, **kwargs):
7 > ui.write('%s Python hook: %s\n' % (hooktype, ','.join(sorted(kwargs))))
7 > ui.write('%s Python hook: %s\n' % (hooktype, ','.join(sorted(kwargs))))
8 > EOF
8 > EOF
9
9
10 $ hg init a
10 $ hg init a
11 $ cd a
11 $ cd a
12 $ cat > .hg/hgrc <<EOF
12 $ cat > .hg/hgrc <<EOF
13 > [hooks]
13 > [hooks]
14 > commit = sh -c "HG_LOCAL= HG_TAG= printenv.py commit"
14 > commit = sh -c "HG_LOCAL= HG_TAG= printenv.py commit"
15 > commit.b = sh -c "HG_LOCAL= HG_TAG= printenv.py commit.b"
15 > commit.b = sh -c "HG_LOCAL= HG_TAG= printenv.py commit.b"
16 > precommit = sh -c "HG_LOCAL= HG_NODE= HG_TAG= printenv.py precommit"
16 > precommit = sh -c "HG_LOCAL= HG_NODE= HG_TAG= printenv.py precommit"
17 > pretxncommit = sh -c "HG_LOCAL= HG_TAG= printenv.py pretxncommit"
17 > pretxncommit = sh -c "HG_LOCAL= HG_TAG= printenv.py pretxncommit"
18 > pretxncommit.tip = hg -q tip
18 > pretxncommit.tip = hg -q tip
19 > pre-identify = sh -c "printenv.py pre-identify 1"
19 > pre-identify = sh -c "printenv.py pre-identify 1"
20 > pre-cat = sh -c "printenv.py pre-cat"
20 > pre-cat = sh -c "printenv.py pre-cat"
21 > post-cat = sh -c "printenv.py post-cat"
21 > post-cat = sh -c "printenv.py post-cat"
22 > pretxnopen = sh -c "HG_LOCAL= HG_TAG= printenv.py pretxnopen"
22 > pretxnopen = sh -c "HG_LOCAL= HG_TAG= printenv.py pretxnopen"
23 > pretxnclose = sh -c "HG_LOCAL= HG_TAG= printenv.py pretxnclose"
23 > pretxnclose = sh -c "HG_LOCAL= HG_TAG= printenv.py pretxnclose"
24 > txnclose = sh -c "HG_LOCAL= HG_TAG= printenv.py txnclose"
24 > txnclose = sh -c "HG_LOCAL= HG_TAG= printenv.py txnclose"
25 > txnabort.0 = python:$TESTTMP/txnabort.checkargs.py:showargs
25 > txnabort.0 = python:$TESTTMP/txnabort.checkargs.py:showargs
26 > txnabort.1 = sh -c "HG_LOCAL= HG_TAG= printenv.py txnabort"
26 > txnabort.1 = sh -c "HG_LOCAL= HG_TAG= printenv.py txnabort"
27 > txnclose.checklock = sh -c "hg debuglock > /dev/null"
27 > txnclose.checklock = sh -c "hg debuglock > /dev/null"
28 > EOF
28 > EOF
29 $ echo a > a
29 $ echo a > a
30 $ hg add a
30 $ hg add a
31 $ hg commit -m a
31 $ hg commit -m a
32 precommit hook: HG_HOOKNAME=precommit HG_HOOKTYPE=precommit HG_PARENT1=0000000000000000000000000000000000000000
32 precommit hook: HG_HOOKNAME=precommit HG_HOOKTYPE=precommit HG_PARENT1=0000000000000000000000000000000000000000
33 pretxnopen hook: HG_HOOKNAME=pretxnopen HG_HOOKTYPE=pretxnopen HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
33 pretxnopen hook: HG_HOOKNAME=pretxnopen HG_HOOKTYPE=pretxnopen HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
34 pretxncommit hook: HG_HOOKNAME=pretxncommit HG_HOOKTYPE=pretxncommit HG_NODE=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b HG_PARENT1=0000000000000000000000000000000000000000 HG_PENDING=$TESTTMP/a
34 pretxncommit hook: HG_HOOKNAME=pretxncommit HG_HOOKTYPE=pretxncommit HG_NODE=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b HG_PARENT1=0000000000000000000000000000000000000000 HG_PENDING=$TESTTMP/a
35 0:cb9a9f314b8b
35 0:cb9a9f314b8b
36 pretxnclose hook: HG_HOOKNAME=pretxnclose HG_HOOKTYPE=pretxnclose HG_PENDING=$TESTTMP/a HG_PHASES_MOVED=1 HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
36 pretxnclose hook: HG_HOOKNAME=pretxnclose HG_HOOKTYPE=pretxnclose HG_PENDING=$TESTTMP/a HG_PHASES_MOVED=1 HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
37 txnclose hook: HG_HOOKNAME=txnclose HG_HOOKTYPE=txnclose HG_PHASES_MOVED=1 HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
37 txnclose hook: HG_HOOKNAME=txnclose HG_HOOKTYPE=txnclose HG_PHASES_MOVED=1 HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
38 commit hook: HG_HOOKNAME=commit HG_HOOKTYPE=commit HG_NODE=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b HG_PARENT1=0000000000000000000000000000000000000000
38 commit hook: HG_HOOKNAME=commit HG_HOOKTYPE=commit HG_NODE=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b HG_PARENT1=0000000000000000000000000000000000000000
39 commit.b hook: HG_HOOKNAME=commit.b HG_HOOKTYPE=commit HG_NODE=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b HG_PARENT1=0000000000000000000000000000000000000000
39 commit.b hook: HG_HOOKNAME=commit.b HG_HOOKTYPE=commit HG_NODE=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b HG_PARENT1=0000000000000000000000000000000000000000
40
40
41 $ hg clone . ../b
41 $ hg clone . ../b
42 updating to branch default
42 updating to branch default
43 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
43 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
44 $ cd ../b
44 $ cd ../b
45
45
46 changegroup hooks can see env vars
46 changegroup hooks can see env vars
47
47
48 $ cat > .hg/hgrc <<EOF
48 $ cat > .hg/hgrc <<EOF
49 > [hooks]
49 > [hooks]
50 > prechangegroup = sh -c "printenv.py prechangegroup"
50 > prechangegroup = sh -c "printenv.py prechangegroup"
51 > changegroup = sh -c "printenv.py changegroup"
51 > changegroup = sh -c "printenv.py changegroup"
52 > incoming = sh -c "printenv.py incoming"
52 > incoming = sh -c "printenv.py incoming"
53 > EOF
53 > EOF
54
54
55 pretxncommit and commit hooks can see both parents of merge
55 pretxncommit and commit hooks can see both parents of merge
56
56
57 $ cd ../a
57 $ cd ../a
58 $ echo b >> a
58 $ echo b >> a
59 $ hg commit -m a1 -d "1 0"
59 $ hg commit -m a1 -d "1 0"
60 precommit hook: HG_HOOKNAME=precommit HG_HOOKTYPE=precommit HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
60 precommit hook: HG_HOOKNAME=precommit HG_HOOKTYPE=precommit HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
61 pretxnopen hook: HG_HOOKNAME=pretxnopen HG_HOOKTYPE=pretxnopen HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
61 pretxnopen hook: HG_HOOKNAME=pretxnopen HG_HOOKTYPE=pretxnopen HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
62 pretxncommit hook: HG_HOOKNAME=pretxncommit HG_HOOKTYPE=pretxncommit HG_NODE=ab228980c14deea8b9555d91c9581127383e40fd HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b HG_PENDING=$TESTTMP/a
62 pretxncommit hook: HG_HOOKNAME=pretxncommit HG_HOOKTYPE=pretxncommit HG_NODE=ab228980c14deea8b9555d91c9581127383e40fd HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b HG_PENDING=$TESTTMP/a
63 1:ab228980c14d
63 1:ab228980c14d
64 pretxnclose hook: HG_HOOKNAME=pretxnclose HG_HOOKTYPE=pretxnclose HG_PENDING=$TESTTMP/a HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
64 pretxnclose hook: HG_HOOKNAME=pretxnclose HG_HOOKTYPE=pretxnclose HG_PENDING=$TESTTMP/a HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
65 txnclose hook: HG_HOOKNAME=txnclose HG_HOOKTYPE=txnclose HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
65 txnclose hook: HG_HOOKNAME=txnclose HG_HOOKTYPE=txnclose HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
66 commit hook: HG_HOOKNAME=commit HG_HOOKTYPE=commit HG_NODE=ab228980c14deea8b9555d91c9581127383e40fd HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
66 commit hook: HG_HOOKNAME=commit HG_HOOKTYPE=commit HG_NODE=ab228980c14deea8b9555d91c9581127383e40fd HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
67 commit.b hook: HG_HOOKNAME=commit.b HG_HOOKTYPE=commit HG_NODE=ab228980c14deea8b9555d91c9581127383e40fd HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
67 commit.b hook: HG_HOOKNAME=commit.b HG_HOOKTYPE=commit HG_NODE=ab228980c14deea8b9555d91c9581127383e40fd HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
68 $ hg update -C 0
68 $ hg update -C 0
69 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
69 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
70 $ echo b > b
70 $ echo b > b
71 $ hg add b
71 $ hg add b
72 $ hg commit -m b -d '1 0'
72 $ hg commit -m b -d '1 0'
73 precommit hook: HG_HOOKNAME=precommit HG_HOOKTYPE=precommit HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
73 precommit hook: HG_HOOKNAME=precommit HG_HOOKTYPE=precommit HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
74 pretxnopen hook: HG_HOOKNAME=pretxnopen HG_HOOKTYPE=pretxnopen HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
74 pretxnopen hook: HG_HOOKNAME=pretxnopen HG_HOOKTYPE=pretxnopen HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
75 pretxncommit hook: HG_HOOKNAME=pretxncommit HG_HOOKTYPE=pretxncommit HG_NODE=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b HG_PENDING=$TESTTMP/a
75 pretxncommit hook: HG_HOOKNAME=pretxncommit HG_HOOKTYPE=pretxncommit HG_NODE=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b HG_PENDING=$TESTTMP/a
76 2:ee9deb46ab31
76 2:ee9deb46ab31
77 pretxnclose hook: HG_HOOKNAME=pretxnclose HG_HOOKTYPE=pretxnclose HG_PENDING=$TESTTMP/a HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
77 pretxnclose hook: HG_HOOKNAME=pretxnclose HG_HOOKTYPE=pretxnclose HG_PENDING=$TESTTMP/a HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
78 created new head
78 created new head
79 txnclose hook: HG_HOOKNAME=txnclose HG_HOOKTYPE=txnclose HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
79 txnclose hook: HG_HOOKNAME=txnclose HG_HOOKTYPE=txnclose HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
80 commit hook: HG_HOOKNAME=commit HG_HOOKTYPE=commit HG_NODE=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
80 commit hook: HG_HOOKNAME=commit HG_HOOKTYPE=commit HG_NODE=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
81 commit.b hook: HG_HOOKNAME=commit.b HG_HOOKTYPE=commit HG_NODE=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
81 commit.b hook: HG_HOOKNAME=commit.b HG_HOOKTYPE=commit HG_NODE=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
82 $ hg merge 1
82 $ hg merge 1
83 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
83 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
84 (branch merge, don't forget to commit)
84 (branch merge, don't forget to commit)
85 $ hg commit -m merge -d '2 0'
85 $ hg commit -m merge -d '2 0'
86 precommit hook: HG_HOOKNAME=precommit HG_HOOKTYPE=precommit HG_PARENT1=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT2=ab228980c14deea8b9555d91c9581127383e40fd
86 precommit hook: HG_HOOKNAME=precommit HG_HOOKTYPE=precommit HG_PARENT1=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT2=ab228980c14deea8b9555d91c9581127383e40fd
87 pretxnopen hook: HG_HOOKNAME=pretxnopen HG_HOOKTYPE=pretxnopen HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
87 pretxnopen hook: HG_HOOKNAME=pretxnopen HG_HOOKTYPE=pretxnopen HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
88 pretxncommit hook: HG_HOOKNAME=pretxncommit HG_HOOKTYPE=pretxncommit HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_PARENT1=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT2=ab228980c14deea8b9555d91c9581127383e40fd HG_PENDING=$TESTTMP/a
88 pretxncommit hook: HG_HOOKNAME=pretxncommit HG_HOOKTYPE=pretxncommit HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_PARENT1=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT2=ab228980c14deea8b9555d91c9581127383e40fd HG_PENDING=$TESTTMP/a
89 3:07f3376c1e65
89 3:07f3376c1e65
90 pretxnclose hook: HG_HOOKNAME=pretxnclose HG_HOOKTYPE=pretxnclose HG_PENDING=$TESTTMP/a HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
90 pretxnclose hook: HG_HOOKNAME=pretxnclose HG_HOOKTYPE=pretxnclose HG_PENDING=$TESTTMP/a HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
91 txnclose hook: HG_HOOKNAME=txnclose HG_HOOKTYPE=txnclose HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
91 txnclose hook: HG_HOOKNAME=txnclose HG_HOOKTYPE=txnclose HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
92 commit hook: HG_HOOKNAME=commit HG_HOOKTYPE=commit HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_PARENT1=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT2=ab228980c14deea8b9555d91c9581127383e40fd
92 commit hook: HG_HOOKNAME=commit HG_HOOKTYPE=commit HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_PARENT1=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT2=ab228980c14deea8b9555d91c9581127383e40fd
93 commit.b hook: HG_HOOKNAME=commit.b HG_HOOKTYPE=commit HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_PARENT1=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT2=ab228980c14deea8b9555d91c9581127383e40fd
93 commit.b hook: HG_HOOKNAME=commit.b HG_HOOKTYPE=commit HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_PARENT1=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT2=ab228980c14deea8b9555d91c9581127383e40fd
94
94
95 test generic hooks
95 test generic hooks
96
96
97 $ hg id
97 $ hg id
98 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=[]
98 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=[]
99 abort: pre-identify hook exited with status 1
99 abort: pre-identify hook exited with status 1
100 [255]
100 [255]
101 $ hg cat b
101 $ hg cat b
102 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']
102 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']
103 b
103 b
104 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
104 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
105
105
106 $ cd ../b
106 $ cd ../b
107 $ hg pull ../a
107 $ hg pull ../a
108 pulling from ../a
108 pulling from ../a
109 searching for changes
109 searching for changes
110 prechangegroup hook: HG_HOOKNAME=prechangegroup HG_HOOKTYPE=prechangegroup HG_SOURCE=pull HG_TXNID=TXN:$ID$ HG_URL=file:$TESTTMP/a
110 prechangegroup hook: HG_HOOKNAME=prechangegroup HG_HOOKTYPE=prechangegroup HG_SOURCE=pull HG_TXNID=TXN:$ID$ HG_URL=file:$TESTTMP/a
111 adding changesets
111 adding changesets
112 adding manifests
112 adding manifests
113 adding file changes
113 adding file changes
114 added 3 changesets with 2 changes to 2 files
114 added 3 changesets with 2 changes to 2 files
115 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
115 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
116 incoming hook: HG_HOOKNAME=incoming HG_HOOKTYPE=incoming HG_NODE=ab228980c14deea8b9555d91c9581127383e40fd HG_SOURCE=pull HG_TXNID=TXN:$ID$ HG_URL=file:$TESTTMP/a
116 incoming hook: HG_HOOKNAME=incoming HG_HOOKTYPE=incoming HG_NODE=ab228980c14deea8b9555d91c9581127383e40fd HG_SOURCE=pull HG_TXNID=TXN:$ID$ HG_URL=file:$TESTTMP/a
117 incoming hook: HG_HOOKNAME=incoming HG_HOOKTYPE=incoming HG_NODE=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_SOURCE=pull HG_TXNID=TXN:$ID$ HG_URL=file:$TESTTMP/a
117 incoming hook: HG_HOOKNAME=incoming HG_HOOKTYPE=incoming HG_NODE=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_SOURCE=pull HG_TXNID=TXN:$ID$ HG_URL=file:$TESTTMP/a
118 incoming hook: HG_HOOKNAME=incoming HG_HOOKTYPE=incoming HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_SOURCE=pull HG_TXNID=TXN:$ID$ HG_URL=file:$TESTTMP/a
118 incoming hook: HG_HOOKNAME=incoming HG_HOOKTYPE=incoming HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_SOURCE=pull HG_TXNID=TXN:$ID$ HG_URL=file:$TESTTMP/a
119 (run 'hg update' to get a working copy)
119 (run 'hg update' to get a working copy)
120
120
121 tag hooks can see env vars
121 tag hooks can see env vars
122
122
123 $ cd ../a
123 $ cd ../a
124 $ cat >> .hg/hgrc <<EOF
124 $ cat >> .hg/hgrc <<EOF
125 > pretag = sh -c "printenv.py pretag"
125 > pretag = sh -c "printenv.py pretag"
126 > tag = sh -c "HG_PARENT1= HG_PARENT2= printenv.py tag"
126 > tag = sh -c "HG_PARENT1= HG_PARENT2= printenv.py tag"
127 > EOF
127 > EOF
128 $ hg tag -d '3 0' a
128 $ hg tag -d '3 0' a
129 pretag hook: HG_HOOKNAME=pretag HG_HOOKTYPE=pretag HG_LOCAL=0 HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_TAG=a
129 pretag hook: HG_HOOKNAME=pretag HG_HOOKTYPE=pretag HG_LOCAL=0 HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_TAG=a
130 precommit hook: HG_HOOKNAME=precommit HG_HOOKTYPE=precommit HG_PARENT1=07f3376c1e655977439df2a814e3cc14b27abac2
130 precommit hook: HG_HOOKNAME=precommit HG_HOOKTYPE=precommit HG_PARENT1=07f3376c1e655977439df2a814e3cc14b27abac2
131 pretxnopen hook: HG_HOOKNAME=pretxnopen HG_HOOKTYPE=pretxnopen HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
131 pretxnopen hook: HG_HOOKNAME=pretxnopen HG_HOOKTYPE=pretxnopen HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
132 pretxncommit hook: HG_HOOKNAME=pretxncommit HG_HOOKTYPE=pretxncommit HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_PARENT1=07f3376c1e655977439df2a814e3cc14b27abac2 HG_PENDING=$TESTTMP/a
132 pretxncommit hook: HG_HOOKNAME=pretxncommit HG_HOOKTYPE=pretxncommit HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_PARENT1=07f3376c1e655977439df2a814e3cc14b27abac2 HG_PENDING=$TESTTMP/a
133 4:539e4b31b6dc
133 4:539e4b31b6dc
134 pretxnclose hook: HG_HOOKNAME=pretxnclose HG_HOOKTYPE=pretxnclose HG_PENDING=$TESTTMP/a HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
134 pretxnclose hook: HG_HOOKNAME=pretxnclose HG_HOOKTYPE=pretxnclose HG_PENDING=$TESTTMP/a HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
135 tag hook: HG_HOOKNAME=tag HG_HOOKTYPE=tag HG_LOCAL=0 HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_TAG=a
135 tag hook: HG_HOOKNAME=tag HG_HOOKTYPE=tag HG_LOCAL=0 HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_TAG=a
136 txnclose hook: HG_HOOKNAME=txnclose HG_HOOKTYPE=txnclose HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
136 txnclose hook: HG_HOOKNAME=txnclose HG_HOOKTYPE=txnclose HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
137 commit hook: HG_HOOKNAME=commit HG_HOOKTYPE=commit HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_PARENT1=07f3376c1e655977439df2a814e3cc14b27abac2
137 commit hook: HG_HOOKNAME=commit HG_HOOKTYPE=commit HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_PARENT1=07f3376c1e655977439df2a814e3cc14b27abac2
138 commit.b hook: HG_HOOKNAME=commit.b HG_HOOKTYPE=commit HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_PARENT1=07f3376c1e655977439df2a814e3cc14b27abac2
138 commit.b hook: HG_HOOKNAME=commit.b HG_HOOKTYPE=commit HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_PARENT1=07f3376c1e655977439df2a814e3cc14b27abac2
139 $ hg tag -l la
139 $ hg tag -l la
140 pretag hook: HG_HOOKNAME=pretag HG_HOOKTYPE=pretag HG_LOCAL=1 HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_TAG=la
140 pretag hook: HG_HOOKNAME=pretag HG_HOOKTYPE=pretag HG_LOCAL=1 HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_TAG=la
141 tag hook: HG_HOOKNAME=tag HG_HOOKTYPE=tag HG_LOCAL=1 HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_TAG=la
141 tag hook: HG_HOOKNAME=tag HG_HOOKTYPE=tag HG_LOCAL=1 HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_TAG=la
142
142
143 pretag hook can forbid tagging
143 pretag hook can forbid tagging
144
144
145 $ cat >> .hg/hgrc <<EOF
145 $ cat >> .hg/hgrc <<EOF
146 > pretag.forbid = sh -c "printenv.py pretag.forbid 1"
146 > pretag.forbid = sh -c "printenv.py pretag.forbid 1"
147 > EOF
147 > EOF
148 $ hg tag -d '4 0' fa
148 $ hg tag -d '4 0' fa
149 pretag hook: HG_HOOKNAME=pretag HG_HOOKTYPE=pretag HG_LOCAL=0 HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_TAG=fa
149 pretag hook: HG_HOOKNAME=pretag HG_HOOKTYPE=pretag HG_LOCAL=0 HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_TAG=fa
150 pretag.forbid hook: HG_HOOKNAME=pretag.forbid HG_HOOKTYPE=pretag HG_LOCAL=0 HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_TAG=fa
150 pretag.forbid hook: HG_HOOKNAME=pretag.forbid HG_HOOKTYPE=pretag HG_LOCAL=0 HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_TAG=fa
151 abort: pretag.forbid hook exited with status 1
151 abort: pretag.forbid hook exited with status 1
152 [255]
152 [255]
153 $ hg tag -l fla
153 $ hg tag -l fla
154 pretag hook: HG_HOOKNAME=pretag HG_HOOKTYPE=pretag HG_LOCAL=1 HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_TAG=fla
154 pretag hook: HG_HOOKNAME=pretag HG_HOOKTYPE=pretag HG_LOCAL=1 HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_TAG=fla
155 pretag.forbid hook: HG_HOOKNAME=pretag.forbid HG_HOOKTYPE=pretag HG_LOCAL=1 HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_TAG=fla
155 pretag.forbid hook: HG_HOOKNAME=pretag.forbid HG_HOOKTYPE=pretag HG_LOCAL=1 HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_TAG=fla
156 abort: pretag.forbid hook exited with status 1
156 abort: pretag.forbid hook exited with status 1
157 [255]
157 [255]
158
158
159 pretxncommit hook can see changeset, can roll back txn, changeset no
159 pretxncommit hook can see changeset, can roll back txn, changeset no
160 more there after
160 more there after
161
161
162 $ cat >> .hg/hgrc <<EOF
162 $ cat >> .hg/hgrc <<EOF
163 > pretxncommit.forbid0 = sh -c "hg tip -q"
163 > pretxncommit.forbid0 = sh -c "hg tip -q"
164 > pretxncommit.forbid1 = sh -c "printenv.py pretxncommit.forbid 1"
164 > pretxncommit.forbid1 = sh -c "printenv.py pretxncommit.forbid 1"
165 > EOF
165 > EOF
166 $ echo z > z
166 $ echo z > z
167 $ hg add z
167 $ hg add z
168 $ hg -q tip
168 $ hg -q tip
169 4:539e4b31b6dc
169 4:539e4b31b6dc
170 $ hg commit -m 'fail' -d '4 0'
170 $ hg commit -m 'fail' -d '4 0'
171 precommit hook: HG_HOOKNAME=precommit HG_HOOKTYPE=precommit HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10
171 precommit hook: HG_HOOKNAME=precommit HG_HOOKTYPE=precommit HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10
172 pretxnopen hook: HG_HOOKNAME=pretxnopen HG_HOOKTYPE=pretxnopen HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
172 pretxnopen hook: HG_HOOKNAME=pretxnopen HG_HOOKTYPE=pretxnopen HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
173 pretxncommit hook: HG_HOOKNAME=pretxncommit HG_HOOKTYPE=pretxncommit HG_NODE=6f611f8018c10e827fee6bd2bc807f937e761567 HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_PENDING=$TESTTMP/a
173 pretxncommit hook: HG_HOOKNAME=pretxncommit HG_HOOKTYPE=pretxncommit HG_NODE=6f611f8018c10e827fee6bd2bc807f937e761567 HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_PENDING=$TESTTMP/a
174 5:6f611f8018c1
174 5:6f611f8018c1
175 5:6f611f8018c1
175 5:6f611f8018c1
176 pretxncommit.forbid hook: HG_HOOKNAME=pretxncommit.forbid1 HG_HOOKTYPE=pretxncommit HG_NODE=6f611f8018c10e827fee6bd2bc807f937e761567 HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_PENDING=$TESTTMP/a
176 pretxncommit.forbid hook: HG_HOOKNAME=pretxncommit.forbid1 HG_HOOKTYPE=pretxncommit HG_NODE=6f611f8018c10e827fee6bd2bc807f937e761567 HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_PENDING=$TESTTMP/a
177 transaction abort!
177 transaction abort!
178 txnabort Python hook: txnid,txnname
178 txnabort Python hook: txnid,txnname
179 txnabort hook: HG_HOOKNAME=txnabort.1 HG_HOOKTYPE=txnabort HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
179 txnabort hook: HG_HOOKNAME=txnabort.1 HG_HOOKTYPE=txnabort HG_TXNID=TXN:$ID$ HG_TXNNAME=commit
180 rollback completed
180 rollback completed
181 abort: pretxncommit.forbid1 hook exited with status 1
181 abort: pretxncommit.forbid1 hook exited with status 1
182 [255]
182 [255]
183 $ hg -q tip
183 $ hg -q tip
184 4:539e4b31b6dc
184 4:539e4b31b6dc
185
185
186 (Check that no 'changelog.i.a' file were left behind)
186 (Check that no 'changelog.i.a' file were left behind)
187
187
188 $ ls -1 .hg/store/
188 $ ls -1 .hg/store/
189 00changelog.i
189 00changelog.i
190 00manifest.i
190 00manifest.i
191 data
191 data
192 fncache
192 fncache
193 journal.phaseroots
193 journal.phaseroots
194 phaseroots
194 phaseroots
195 undo
195 undo
196 undo.backup.fncache
196 undo.backup.fncache
197 undo.backupfiles
197 undo.backupfiles
198 undo.phaseroots
198 undo.phaseroots
199
199
200
200
201 precommit hook can prevent commit
201 precommit hook can prevent commit
202
202
203 $ cat >> .hg/hgrc <<EOF
203 $ cat >> .hg/hgrc <<EOF
204 > precommit.forbid = sh -c "printenv.py precommit.forbid 1"
204 > precommit.forbid = sh -c "printenv.py precommit.forbid 1"
205 > EOF
205 > EOF
206 $ hg commit -m 'fail' -d '4 0'
206 $ hg commit -m 'fail' -d '4 0'
207 precommit hook: HG_HOOKNAME=precommit HG_HOOKTYPE=precommit HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10
207 precommit hook: HG_HOOKNAME=precommit HG_HOOKTYPE=precommit HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10
208 precommit.forbid hook: HG_HOOKNAME=precommit.forbid HG_HOOKTYPE=precommit HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10
208 precommit.forbid hook: HG_HOOKNAME=precommit.forbid HG_HOOKTYPE=precommit HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10
209 abort: precommit.forbid hook exited with status 1
209 abort: precommit.forbid hook exited with status 1
210 [255]
210 [255]
211 $ hg -q tip
211 $ hg -q tip
212 4:539e4b31b6dc
212 4:539e4b31b6dc
213
213
214 preupdate hook can prevent update
214 preupdate hook can prevent update
215
215
216 $ cat >> .hg/hgrc <<EOF
216 $ cat >> .hg/hgrc <<EOF
217 > preupdate = sh -c "printenv.py preupdate"
217 > preupdate = sh -c "printenv.py preupdate"
218 > EOF
218 > EOF
219 $ hg update 1
219 $ hg update 1
220 preupdate hook: HG_HOOKNAME=preupdate HG_HOOKTYPE=preupdate HG_PARENT1=ab228980c14d
220 preupdate hook: HG_HOOKNAME=preupdate HG_HOOKTYPE=preupdate HG_PARENT1=ab228980c14d
221 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
221 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
222
222
223 update hook
223 update hook
224
224
225 $ cat >> .hg/hgrc <<EOF
225 $ cat >> .hg/hgrc <<EOF
226 > update = sh -c "printenv.py update"
226 > update = sh -c "printenv.py update"
227 > EOF
227 > EOF
228 $ hg update
228 $ hg update
229 preupdate hook: HG_HOOKNAME=preupdate HG_HOOKTYPE=preupdate HG_PARENT1=539e4b31b6dc
229 preupdate hook: HG_HOOKNAME=preupdate HG_HOOKTYPE=preupdate HG_PARENT1=539e4b31b6dc
230 update hook: HG_ERROR=0 HG_HOOKNAME=update HG_HOOKTYPE=update HG_PARENT1=539e4b31b6dc
230 update hook: HG_ERROR=0 HG_HOOKNAME=update HG_HOOKTYPE=update HG_PARENT1=539e4b31b6dc
231 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
231 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
232
232
233 pushkey hook
233 pushkey hook
234
234
235 $ cat >> .hg/hgrc <<EOF
235 $ cat >> .hg/hgrc <<EOF
236 > pushkey = sh -c "printenv.py pushkey"
236 > pushkey = sh -c "printenv.py pushkey"
237 > EOF
237 > EOF
238 $ cd ../b
238 $ cd ../b
239 $ hg bookmark -r null foo
239 $ hg bookmark -r null foo
240 $ hg push -B foo ../a
240 $ hg push -B foo ../a
241 pushing to ../a
241 pushing to ../a
242 searching for changes
242 searching for changes
243 no changes found
243 no changes found
244 pretxnopen hook: HG_HOOKNAME=pretxnopen HG_HOOKTYPE=pretxnopen HG_TXNID=TXN:$ID$ HG_TXNNAME=push
244 pretxnopen hook: HG_HOOKNAME=pretxnopen HG_HOOKTYPE=pretxnopen HG_TXNID=TXN:$ID$ HG_TXNNAME=push
245 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
245 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
246 pushkey hook: HG_HOOKNAME=pushkey HG_HOOKTYPE=pushkey HG_KEY=foo HG_NAMESPACE=bookmarks HG_NEW=0000000000000000000000000000000000000000 HG_RET=1
246 pushkey hook: HG_HOOKNAME=pushkey HG_HOOKTYPE=pushkey HG_KEY=foo HG_NAMESPACE=bookmarks HG_NEW=0000000000000000000000000000000000000000 HG_RET=1
247 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
247 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
248 exporting bookmark foo
248 exporting bookmark foo
249 [1]
249 [1]
250 $ cd ../a
250 $ cd ../a
251
251
252 listkeys hook
252 listkeys hook
253
253
254 $ cat >> .hg/hgrc <<EOF
254 $ cat >> .hg/hgrc <<EOF
255 > listkeys = sh -c "printenv.py listkeys"
255 > listkeys = sh -c "printenv.py listkeys"
256 > EOF
256 > EOF
257 $ hg bookmark -r null bar
257 $ hg bookmark -r null bar
258 pretxnopen hook: HG_HOOKNAME=pretxnopen HG_HOOKTYPE=pretxnopen HG_TXNID=TXN:$ID$ HG_TXNNAME=bookmark
258 pretxnopen hook: HG_HOOKNAME=pretxnopen HG_HOOKTYPE=pretxnopen HG_TXNID=TXN:$ID$ HG_TXNNAME=bookmark
259 pretxnclose hook: HG_BOOKMARK_MOVED=1 HG_HOOKNAME=pretxnclose HG_HOOKTYPE=pretxnclose HG_PENDING=$TESTTMP/a HG_TXNID=TXN:$ID$ HG_TXNNAME=bookmark
259 pretxnclose hook: HG_BOOKMARK_MOVED=1 HG_HOOKNAME=pretxnclose HG_HOOKTYPE=pretxnclose HG_PENDING=$TESTTMP/a HG_TXNID=TXN:$ID$ HG_TXNNAME=bookmark
260 txnclose hook: HG_BOOKMARK_MOVED=1 HG_HOOKNAME=txnclose HG_HOOKTYPE=txnclose HG_TXNID=TXN:$ID$ HG_TXNNAME=bookmark
260 txnclose hook: HG_BOOKMARK_MOVED=1 HG_HOOKNAME=txnclose HG_HOOKTYPE=txnclose HG_TXNID=TXN:$ID$ HG_TXNNAME=bookmark
261 $ cd ../b
261 $ cd ../b
262 $ hg pull -B bar ../a
262 $ hg pull -B bar ../a
263 pulling from ../a
263 pulling from ../a
264 listkeys hook: HG_HOOKNAME=listkeys HG_HOOKTYPE=listkeys HG_NAMESPACE=bookmarks HG_VALUES={'bar': '0000000000000000000000000000000000000000', 'foo': '0000000000000000000000000000000000000000'}
264 listkeys hook: HG_HOOKNAME=listkeys HG_HOOKTYPE=listkeys HG_NAMESPACE=bookmarks HG_VALUES={'bar': '0000000000000000000000000000000000000000', 'foo': '0000000000000000000000000000000000000000'}
265 no changes found
265 no changes found
266 adding remote bookmark bar
266 adding remote bookmark bar
267 $ cd ../a
267 $ cd ../a
268
268
269 test that prepushkey can prevent incoming keys
269 test that prepushkey can prevent incoming keys
270
270
271 $ cat >> .hg/hgrc <<EOF
271 $ cat >> .hg/hgrc <<EOF
272 > prepushkey = sh -c "printenv.py prepushkey.forbid 1"
272 > prepushkey = sh -c "printenv.py prepushkey.forbid 1"
273 > EOF
273 > EOF
274 $ cd ../b
274 $ cd ../b
275 $ hg bookmark -r null baz
275 $ hg bookmark -r null baz
276 $ hg push -B baz ../a
276 $ hg push -B baz ../a
277 pushing to ../a
277 pushing to ../a
278 searching for changes
278 searching for changes
279 listkeys hook: HG_HOOKNAME=listkeys HG_HOOKTYPE=listkeys HG_NAMESPACE=phases HG_VALUES={'cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b': '1', 'publishing': 'True'}
279 listkeys hook: HG_HOOKNAME=listkeys HG_HOOKTYPE=listkeys HG_NAMESPACE=phases HG_VALUES={'cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b': '1', 'publishing': 'True'}
280 listkeys hook: HG_HOOKNAME=listkeys HG_HOOKTYPE=listkeys HG_NAMESPACE=bookmarks HG_VALUES={'bar': '0000000000000000000000000000000000000000', 'foo': '0000000000000000000000000000000000000000'}
280 listkeys hook: HG_HOOKNAME=listkeys HG_HOOKTYPE=listkeys HG_NAMESPACE=bookmarks HG_VALUES={'bar': '0000000000000000000000000000000000000000', 'foo': '0000000000000000000000000000000000000000'}
281 no changes found
281 no changes found
282 pretxnopen hook: HG_HOOKNAME=pretxnopen HG_HOOKTYPE=pretxnopen HG_TXNID=TXN:$ID$ HG_TXNNAME=push
282 pretxnopen hook: HG_HOOKNAME=pretxnopen HG_HOOKTYPE=pretxnopen HG_TXNID=TXN:$ID$ HG_TXNNAME=push
283 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
283 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
284 pushkey-abort: prepushkey hook exited with status 1
284 pushkey-abort: prepushkey hook exited with status 1
285 abort: exporting bookmark baz failed!
285 abort: exporting bookmark baz failed!
286 [255]
286 [255]
287 $ cd ../a
287 $ cd ../a
288
288
289 test that prelistkeys can prevent listing keys
289 test that prelistkeys can prevent listing keys
290
290
291 $ cat >> .hg/hgrc <<EOF
291 $ cat >> .hg/hgrc <<EOF
292 > prelistkeys = sh -c "printenv.py prelistkeys.forbid 1"
292 > prelistkeys = sh -c "printenv.py prelistkeys.forbid 1"
293 > EOF
293 > EOF
294 $ hg bookmark -r null quux
294 $ hg bookmark -r null quux
295 pretxnopen hook: HG_HOOKNAME=pretxnopen HG_HOOKTYPE=pretxnopen HG_TXNID=TXN:$ID$ HG_TXNNAME=bookmark
295 pretxnopen hook: HG_HOOKNAME=pretxnopen HG_HOOKTYPE=pretxnopen HG_TXNID=TXN:$ID$ HG_TXNNAME=bookmark
296 pretxnclose hook: HG_BOOKMARK_MOVED=1 HG_HOOKNAME=pretxnclose HG_HOOKTYPE=pretxnclose HG_PENDING=$TESTTMP/a HG_TXNID=TXN:$ID$ HG_TXNNAME=bookmark
296 pretxnclose hook: HG_BOOKMARK_MOVED=1 HG_HOOKNAME=pretxnclose HG_HOOKTYPE=pretxnclose HG_PENDING=$TESTTMP/a HG_TXNID=TXN:$ID$ HG_TXNNAME=bookmark
297 txnclose hook: HG_BOOKMARK_MOVED=1 HG_HOOKNAME=txnclose HG_HOOKTYPE=txnclose HG_TXNID=TXN:$ID$ HG_TXNNAME=bookmark
297 txnclose hook: HG_BOOKMARK_MOVED=1 HG_HOOKNAME=txnclose HG_HOOKTYPE=txnclose HG_TXNID=TXN:$ID$ HG_TXNNAME=bookmark
298 $ cd ../b
298 $ cd ../b
299 $ hg pull -B quux ../a
299 $ hg pull -B quux ../a
300 pulling from ../a
300 pulling from ../a
301 prelistkeys.forbid hook: HG_HOOKNAME=prelistkeys HG_HOOKTYPE=prelistkeys HG_NAMESPACE=bookmarks
301 prelistkeys.forbid hook: HG_HOOKNAME=prelistkeys HG_HOOKTYPE=prelistkeys HG_NAMESPACE=bookmarks
302 abort: prelistkeys hook exited with status 1
302 abort: prelistkeys hook exited with status 1
303 [255]
303 [255]
304 $ cd ../a
304 $ cd ../a
305 $ rm .hg/hgrc
305 $ rm .hg/hgrc
306
306
307 prechangegroup hook can prevent incoming changes
307 prechangegroup hook can prevent incoming changes
308
308
309 $ cd ../b
309 $ cd ../b
310 $ hg -q tip
310 $ hg -q tip
311 3:07f3376c1e65
311 3:07f3376c1e65
312 $ cat > .hg/hgrc <<EOF
312 $ cat > .hg/hgrc <<EOF
313 > [hooks]
313 > [hooks]
314 > prechangegroup.forbid = sh -c "printenv.py prechangegroup.forbid 1"
314 > prechangegroup.forbid = sh -c "printenv.py prechangegroup.forbid 1"
315 > EOF
315 > EOF
316 $ hg pull ../a
316 $ hg pull ../a
317 pulling from ../a
317 pulling from ../a
318 searching for changes
318 searching for changes
319 prechangegroup.forbid hook: HG_HOOKNAME=prechangegroup.forbid HG_HOOKTYPE=prechangegroup HG_SOURCE=pull HG_TXNID=TXN:$ID$ HG_URL=file:$TESTTMP/a
319 prechangegroup.forbid hook: HG_HOOKNAME=prechangegroup.forbid HG_HOOKTYPE=prechangegroup HG_SOURCE=pull HG_TXNID=TXN:$ID$ HG_URL=file:$TESTTMP/a
320 abort: prechangegroup.forbid hook exited with status 1
320 abort: prechangegroup.forbid hook exited with status 1
321 [255]
321 [255]
322
322
323 pretxnchangegroup hook can see incoming changes, can roll back txn,
323 pretxnchangegroup hook can see incoming changes, can roll back txn,
324 incoming changes no longer there after
324 incoming changes no longer there after
325
325
326 $ cat > .hg/hgrc <<EOF
326 $ cat > .hg/hgrc <<EOF
327 > [hooks]
327 > [hooks]
328 > pretxnchangegroup.forbid0 = hg tip -q
328 > pretxnchangegroup.forbid0 = hg tip -q
329 > pretxnchangegroup.forbid1 = sh -c "printenv.py pretxnchangegroup.forbid 1"
329 > pretxnchangegroup.forbid1 = sh -c "printenv.py pretxnchangegroup.forbid 1"
330 > EOF
330 > EOF
331 $ hg pull ../a
331 $ hg pull ../a
332 pulling from ../a
332 pulling from ../a
333 searching for changes
333 searching for changes
334 adding changesets
334 adding changesets
335 adding manifests
335 adding manifests
336 adding file changes
336 adding file changes
337 added 1 changesets with 1 changes to 1 files
337 added 1 changesets with 1 changes to 1 files
338 4:539e4b31b6dc
338 4:539e4b31b6dc
339 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
339 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
340 transaction abort!
340 transaction abort!
341 rollback completed
341 rollback completed
342 abort: pretxnchangegroup.forbid1 hook exited with status 1
342 abort: pretxnchangegroup.forbid1 hook exited with status 1
343 [255]
343 [255]
344 $ hg -q tip
344 $ hg -q tip
345 3:07f3376c1e65
345 3:07f3376c1e65
346
346
347 outgoing hooks can see env vars
347 outgoing hooks can see env vars
348
348
349 $ rm .hg/hgrc
349 $ rm .hg/hgrc
350 $ cat > ../a/.hg/hgrc <<EOF
350 $ cat > ../a/.hg/hgrc <<EOF
351 > [hooks]
351 > [hooks]
352 > preoutgoing = sh -c "printenv.py preoutgoing"
352 > preoutgoing = sh -c "printenv.py preoutgoing"
353 > outgoing = sh -c "printenv.py outgoing"
353 > outgoing = sh -c "printenv.py outgoing"
354 > EOF
354 > EOF
355 $ hg pull ../a
355 $ hg pull ../a
356 pulling from ../a
356 pulling from ../a
357 searching for changes
357 searching for changes
358 preoutgoing hook: HG_HOOKNAME=preoutgoing HG_HOOKTYPE=preoutgoing HG_SOURCE=pull
358 preoutgoing hook: HG_HOOKNAME=preoutgoing HG_HOOKTYPE=preoutgoing HG_SOURCE=pull
359 outgoing hook: HG_HOOKNAME=outgoing HG_HOOKTYPE=outgoing HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_SOURCE=pull
359 outgoing hook: HG_HOOKNAME=outgoing HG_HOOKTYPE=outgoing HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_SOURCE=pull
360 adding changesets
360 adding changesets
361 adding manifests
361 adding manifests
362 adding file changes
362 adding file changes
363 added 1 changesets with 1 changes to 1 files
363 added 1 changesets with 1 changes to 1 files
364 adding remote bookmark quux
364 adding remote bookmark quux
365 (run 'hg update' to get a working copy)
365 (run 'hg update' to get a working copy)
366 $ hg rollback
366 $ hg rollback
367 repository tip rolled back to revision 3 (undo pull)
367 repository tip rolled back to revision 3 (undo pull)
368
368
369 preoutgoing hook can prevent outgoing changes
369 preoutgoing hook can prevent outgoing changes
370
370
371 $ cat >> ../a/.hg/hgrc <<EOF
371 $ cat >> ../a/.hg/hgrc <<EOF
372 > preoutgoing.forbid = sh -c "printenv.py preoutgoing.forbid 1"
372 > preoutgoing.forbid = sh -c "printenv.py preoutgoing.forbid 1"
373 > EOF
373 > EOF
374 $ hg pull ../a
374 $ hg pull ../a
375 pulling from ../a
375 pulling from ../a
376 searching for changes
376 searching for changes
377 preoutgoing hook: HG_HOOKNAME=preoutgoing HG_HOOKTYPE=preoutgoing HG_SOURCE=pull
377 preoutgoing hook: HG_HOOKNAME=preoutgoing HG_HOOKTYPE=preoutgoing HG_SOURCE=pull
378 preoutgoing.forbid hook: HG_HOOKNAME=preoutgoing.forbid HG_HOOKTYPE=preoutgoing HG_SOURCE=pull
378 preoutgoing.forbid hook: HG_HOOKNAME=preoutgoing.forbid HG_HOOKTYPE=preoutgoing HG_SOURCE=pull
379 abort: preoutgoing.forbid hook exited with status 1
379 abort: preoutgoing.forbid hook exited with status 1
380 [255]
380 [255]
381
381
382 outgoing hooks work for local clones
382 outgoing hooks work for local clones
383
383
384 $ cd ..
384 $ cd ..
385 $ cat > a/.hg/hgrc <<EOF
385 $ cat > a/.hg/hgrc <<EOF
386 > [hooks]
386 > [hooks]
387 > preoutgoing = sh -c "printenv.py preoutgoing"
387 > preoutgoing = sh -c "printenv.py preoutgoing"
388 > outgoing = sh -c "printenv.py outgoing"
388 > outgoing = sh -c "printenv.py outgoing"
389 > EOF
389 > EOF
390 $ hg clone a c
390 $ hg clone a c
391 preoutgoing hook: HG_HOOKNAME=preoutgoing HG_HOOKTYPE=preoutgoing HG_SOURCE=clone
391 preoutgoing hook: HG_HOOKNAME=preoutgoing HG_HOOKTYPE=preoutgoing HG_SOURCE=clone
392 outgoing hook: HG_HOOKNAME=outgoing HG_HOOKTYPE=outgoing HG_NODE=0000000000000000000000000000000000000000 HG_SOURCE=clone
392 outgoing hook: HG_HOOKNAME=outgoing HG_HOOKTYPE=outgoing HG_NODE=0000000000000000000000000000000000000000 HG_SOURCE=clone
393 updating to branch default
393 updating to branch default
394 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
394 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
395 $ rm -rf c
395 $ rm -rf c
396
396
397 preoutgoing hook can prevent outgoing changes for local clones
397 preoutgoing hook can prevent outgoing changes for local clones
398
398
399 $ cat >> a/.hg/hgrc <<EOF
399 $ cat >> a/.hg/hgrc <<EOF
400 > preoutgoing.forbid = sh -c "printenv.py preoutgoing.forbid 1"
400 > preoutgoing.forbid = sh -c "printenv.py preoutgoing.forbid 1"
401 > EOF
401 > EOF
402 $ hg clone a zzz
402 $ hg clone a zzz
403 preoutgoing hook: HG_HOOKNAME=preoutgoing HG_HOOKTYPE=preoutgoing HG_SOURCE=clone
403 preoutgoing hook: HG_HOOKNAME=preoutgoing HG_HOOKTYPE=preoutgoing HG_SOURCE=clone
404 preoutgoing.forbid hook: HG_HOOKNAME=preoutgoing.forbid HG_HOOKTYPE=preoutgoing HG_SOURCE=clone
404 preoutgoing.forbid hook: HG_HOOKNAME=preoutgoing.forbid HG_HOOKTYPE=preoutgoing HG_SOURCE=clone
405 abort: preoutgoing.forbid hook exited with status 1
405 abort: preoutgoing.forbid hook exited with status 1
406 [255]
406 [255]
407
407
408 $ cd "$TESTTMP/b"
408 $ cd "$TESTTMP/b"
409
409
410 $ cat > hooktests.py <<EOF
410 $ cat > hooktests.py <<EOF
411 > from __future__ import print_function
411 > from __future__ import print_function
412 > from mercurial import error
412 > from mercurial import error
413 >
413 >
414 > uncallable = 0
414 > uncallable = 0
415 >
415 >
416 > def printargs(args):
416 > def printargs(ui, args):
417 > args.pop('ui', None)
418 > args.pop('repo', None)
419 > a = list(args.items())
417 > a = list(args.items())
420 > a.sort()
418 > a.sort()
421 > print('hook args:')
419 > ui.write('hook args:\n')
422 > for k, v in a:
420 > for k, v in a:
423 > print(' ', k, v)
421 > ui.write(' %s %s\n' % (k, v))
424 >
422 >
425 > def passhook(**args):
423 > def passhook(ui, repo, **args):
426 > printargs(args)
424 > printargs(ui, args)
427 >
425 >
428 > def failhook(**args):
426 > def failhook(ui, repo, **args):
429 > printargs(args)
427 > printargs(ui, args)
430 > return True
428 > return True
431 >
429 >
432 > class LocalException(Exception):
430 > class LocalException(Exception):
433 > pass
431 > pass
434 >
432 >
435 > def raisehook(**args):
433 > def raisehook(**args):
436 > raise LocalException('exception from hook')
434 > raise LocalException('exception from hook')
437 >
435 >
438 > def aborthook(**args):
436 > def aborthook(**args):
439 > raise error.Abort('raise abort from hook')
437 > raise error.Abort('raise abort from hook')
440 >
438 >
441 > def brokenhook(**args):
439 > def brokenhook(**args):
442 > return 1 + {}
440 > return 1 + {}
443 >
441 >
444 > def verbosehook(ui, **args):
442 > def verbosehook(ui, **args):
445 > ui.note('verbose output from hook\n')
443 > ui.note('verbose output from hook\n')
446 >
444 >
447 > def printtags(ui, repo, **args):
445 > def printtags(ui, repo, **args):
448 > print(sorted(repo.tags()))
446 > ui.write('%s\n' % sorted(repo.tags()))
449 >
447 >
450 > class container:
448 > class container:
451 > unreachable = 1
449 > unreachable = 1
452 > EOF
450 > EOF
453
451
454 $ cat > syntaxerror.py << EOF
452 $ cat > syntaxerror.py << EOF
455 > (foo
453 > (foo
456 > EOF
454 > EOF
457
455
458 test python hooks
456 test python hooks
459
457
460 #if windows
458 #if windows
461 $ PYTHONPATH="$TESTTMP/b;$PYTHONPATH"
459 $ PYTHONPATH="$TESTTMP/b;$PYTHONPATH"
462 #else
460 #else
463 $ PYTHONPATH="$TESTTMP/b:$PYTHONPATH"
461 $ PYTHONPATH="$TESTTMP/b:$PYTHONPATH"
464 #endif
462 #endif
465 $ export PYTHONPATH
463 $ export PYTHONPATH
466
464
467 $ echo '[hooks]' > ../a/.hg/hgrc
465 $ echo '[hooks]' > ../a/.hg/hgrc
468 $ echo 'preoutgoing.broken = python:hooktests.brokenhook' >> ../a/.hg/hgrc
466 $ echo 'preoutgoing.broken = python:hooktests.brokenhook' >> ../a/.hg/hgrc
469 $ hg pull ../a 2>&1 | grep 'raised an exception'
467 $ hg pull ../a 2>&1 | grep 'raised an exception'
470 error: preoutgoing.broken hook raised an exception: unsupported operand type(s) for +: 'int' and 'dict'
468 error: preoutgoing.broken hook raised an exception: unsupported operand type(s) for +: 'int' and 'dict'
471
469
472 $ echo '[hooks]' > ../a/.hg/hgrc
470 $ echo '[hooks]' > ../a/.hg/hgrc
473 $ echo 'preoutgoing.raise = python:hooktests.raisehook' >> ../a/.hg/hgrc
471 $ echo 'preoutgoing.raise = python:hooktests.raisehook' >> ../a/.hg/hgrc
474 $ hg pull ../a 2>&1 | grep 'raised an exception'
472 $ hg pull ../a 2>&1 | grep 'raised an exception'
475 error: preoutgoing.raise hook raised an exception: exception from hook
473 error: preoutgoing.raise hook raised an exception: exception from hook
476
474
477 $ echo '[hooks]' > ../a/.hg/hgrc
475 $ echo '[hooks]' > ../a/.hg/hgrc
478 $ echo 'preoutgoing.abort = python:hooktests.aborthook' >> ../a/.hg/hgrc
476 $ echo 'preoutgoing.abort = python:hooktests.aborthook' >> ../a/.hg/hgrc
479 $ hg pull ../a
477 $ hg pull ../a
480 pulling from ../a
478 pulling from ../a
481 searching for changes
479 searching for changes
482 error: preoutgoing.abort hook failed: raise abort from hook
480 error: preoutgoing.abort hook failed: raise abort from hook
483 abort: raise abort from hook
481 abort: raise abort from hook
484 [255]
482 [255]
485
483
486 $ echo '[hooks]' > ../a/.hg/hgrc
484 $ echo '[hooks]' > ../a/.hg/hgrc
487 $ echo 'preoutgoing.fail = python:hooktests.failhook' >> ../a/.hg/hgrc
485 $ echo 'preoutgoing.fail = python:hooktests.failhook' >> ../a/.hg/hgrc
488 $ hg pull ../a
486 $ hg pull ../a
489 pulling from ../a
487 pulling from ../a
490 searching for changes
488 searching for changes
491 hook args:
489 hook args:
492 hooktype preoutgoing
490 hooktype preoutgoing
493 source pull
491 source pull
494 abort: preoutgoing.fail hook failed
492 abort: preoutgoing.fail hook failed
495 [255]
493 [255]
496
494
497 $ echo '[hooks]' > ../a/.hg/hgrc
495 $ echo '[hooks]' > ../a/.hg/hgrc
498 $ echo 'preoutgoing.uncallable = python:hooktests.uncallable' >> ../a/.hg/hgrc
496 $ echo 'preoutgoing.uncallable = python:hooktests.uncallable' >> ../a/.hg/hgrc
499 $ hg pull ../a
497 $ hg pull ../a
500 pulling from ../a
498 pulling from ../a
501 searching for changes
499 searching for changes
502 abort: preoutgoing.uncallable hook is invalid: "hooktests.uncallable" is not callable
500 abort: preoutgoing.uncallable hook is invalid: "hooktests.uncallable" is not callable
503 [255]
501 [255]
504
502
505 $ echo '[hooks]' > ../a/.hg/hgrc
503 $ echo '[hooks]' > ../a/.hg/hgrc
506 $ echo 'preoutgoing.nohook = python:hooktests.nohook' >> ../a/.hg/hgrc
504 $ echo 'preoutgoing.nohook = python:hooktests.nohook' >> ../a/.hg/hgrc
507 $ hg pull ../a
505 $ hg pull ../a
508 pulling from ../a
506 pulling from ../a
509 searching for changes
507 searching for changes
510 abort: preoutgoing.nohook hook is invalid: "hooktests.nohook" is not defined
508 abort: preoutgoing.nohook hook is invalid: "hooktests.nohook" is not defined
511 [255]
509 [255]
512
510
513 $ echo '[hooks]' > ../a/.hg/hgrc
511 $ echo '[hooks]' > ../a/.hg/hgrc
514 $ echo 'preoutgoing.nomodule = python:nomodule' >> ../a/.hg/hgrc
512 $ echo 'preoutgoing.nomodule = python:nomodule' >> ../a/.hg/hgrc
515 $ hg pull ../a
513 $ hg pull ../a
516 pulling from ../a
514 pulling from ../a
517 searching for changes
515 searching for changes
518 abort: preoutgoing.nomodule hook is invalid: "nomodule" not in a module
516 abort: preoutgoing.nomodule hook is invalid: "nomodule" not in a module
519 [255]
517 [255]
520
518
521 $ echo '[hooks]' > ../a/.hg/hgrc
519 $ echo '[hooks]' > ../a/.hg/hgrc
522 $ echo 'preoutgoing.badmodule = python:nomodule.nowhere' >> ../a/.hg/hgrc
520 $ echo 'preoutgoing.badmodule = python:nomodule.nowhere' >> ../a/.hg/hgrc
523 $ hg pull ../a
521 $ hg pull ../a
524 pulling from ../a
522 pulling from ../a
525 searching for changes
523 searching for changes
526 abort: preoutgoing.badmodule hook is invalid: import of "nomodule" failed
524 abort: preoutgoing.badmodule hook is invalid: import of "nomodule" failed
527 (run with --traceback for stack trace)
525 (run with --traceback for stack trace)
528 [255]
526 [255]
529
527
530 $ echo '[hooks]' > ../a/.hg/hgrc
528 $ echo '[hooks]' > ../a/.hg/hgrc
531 $ echo 'preoutgoing.unreachable = python:hooktests.container.unreachable' >> ../a/.hg/hgrc
529 $ echo 'preoutgoing.unreachable = python:hooktests.container.unreachable' >> ../a/.hg/hgrc
532 $ hg pull ../a
530 $ hg pull ../a
533 pulling from ../a
531 pulling from ../a
534 searching for changes
532 searching for changes
535 abort: preoutgoing.unreachable hook is invalid: import of "hooktests.container" failed
533 abort: preoutgoing.unreachable hook is invalid: import of "hooktests.container" failed
536 (run with --traceback for stack trace)
534 (run with --traceback for stack trace)
537 [255]
535 [255]
538
536
539 $ echo '[hooks]' > ../a/.hg/hgrc
537 $ echo '[hooks]' > ../a/.hg/hgrc
540 $ echo 'preoutgoing.syntaxerror = python:syntaxerror.syntaxerror' >> ../a/.hg/hgrc
538 $ echo 'preoutgoing.syntaxerror = python:syntaxerror.syntaxerror' >> ../a/.hg/hgrc
541 $ hg pull ../a
539 $ hg pull ../a
542 pulling from ../a
540 pulling from ../a
543 searching for changes
541 searching for changes
544 abort: preoutgoing.syntaxerror hook is invalid: import of "syntaxerror" failed
542 abort: preoutgoing.syntaxerror hook is invalid: import of "syntaxerror" failed
545 (run with --traceback for stack trace)
543 (run with --traceback for stack trace)
546 [255]
544 [255]
547
545
548 The second egrep is to filter out lines like ' ^', which are slightly
546 The second egrep is to filter out lines like ' ^', which are slightly
549 different between Python 2.6 and Python 2.7.
547 different between Python 2.6 and Python 2.7.
550 $ hg pull ../a --traceback 2>&1 | egrep -v '^( +File| [_a-zA-Z*(])' | egrep -v '^( )+(\^)?$'
548 $ hg pull ../a --traceback 2>&1 | egrep -v '^( +File| [_a-zA-Z*(])' | egrep -v '^( )+(\^)?$'
551 pulling from ../a
549 pulling from ../a
552 searching for changes
550 searching for changes
553 exception from first failed import attempt:
551 exception from first failed import attempt:
554 Traceback (most recent call last):
552 Traceback (most recent call last):
555 SyntaxError: * (glob)
553 SyntaxError: * (glob)
556 exception from second failed import attempt:
554 exception from second failed import attempt:
557 Traceback (most recent call last):
555 Traceback (most recent call last):
558 ImportError: No module named hgext_syntaxerror
556 ImportError: No module named hgext_syntaxerror
559 Traceback (most recent call last):
557 Traceback (most recent call last):
560 HookLoadError: preoutgoing.syntaxerror hook is invalid: import of "syntaxerror" failed
558 HookLoadError: preoutgoing.syntaxerror hook is invalid: import of "syntaxerror" failed
561 abort: preoutgoing.syntaxerror hook is invalid: import of "syntaxerror" failed
559 abort: preoutgoing.syntaxerror hook is invalid: import of "syntaxerror" failed
562
560
563 $ echo '[hooks]' > ../a/.hg/hgrc
561 $ echo '[hooks]' > ../a/.hg/hgrc
564 $ echo 'preoutgoing.pass = python:hooktests.passhook' >> ../a/.hg/hgrc
562 $ echo 'preoutgoing.pass = python:hooktests.passhook' >> ../a/.hg/hgrc
565 $ hg pull ../a
563 $ hg pull ../a
566 pulling from ../a
564 pulling from ../a
567 searching for changes
565 searching for changes
568 hook args:
566 hook args:
569 hooktype preoutgoing
567 hooktype preoutgoing
570 source pull
568 source pull
571 adding changesets
569 adding changesets
572 adding manifests
570 adding manifests
573 adding file changes
571 adding file changes
574 added 1 changesets with 1 changes to 1 files
572 added 1 changesets with 1 changes to 1 files
575 adding remote bookmark quux
573 adding remote bookmark quux
576 (run 'hg update' to get a working copy)
574 (run 'hg update' to get a working copy)
577
575
578 post- python hooks that fail to *run* don't cause an abort
576 post- python hooks that fail to *run* don't cause an abort
579 $ rm ../a/.hg/hgrc
577 $ rm ../a/.hg/hgrc
580 $ echo '[hooks]' > .hg/hgrc
578 $ echo '[hooks]' > .hg/hgrc
581 $ echo 'post-pull.broken = python:hooktests.brokenhook' >> .hg/hgrc
579 $ echo 'post-pull.broken = python:hooktests.brokenhook' >> .hg/hgrc
582 $ hg pull ../a
580 $ hg pull ../a
583 pulling from ../a
581 pulling from ../a
584 searching for changes
582 searching for changes
585 no changes found
583 no changes found
586 error: post-pull.broken hook raised an exception: unsupported operand type(s) for +: 'int' and 'dict'
584 error: post-pull.broken hook raised an exception: unsupported operand type(s) for +: 'int' and 'dict'
587 (run with --traceback for stack trace)
585 (run with --traceback for stack trace)
588
586
589 but post- python hooks that fail to *load* do
587 but post- python hooks that fail to *load* do
590 $ echo '[hooks]' > .hg/hgrc
588 $ echo '[hooks]' > .hg/hgrc
591 $ echo 'post-pull.nomodule = python:nomodule' >> .hg/hgrc
589 $ echo 'post-pull.nomodule = python:nomodule' >> .hg/hgrc
592 $ hg pull ../a
590 $ hg pull ../a
593 pulling from ../a
591 pulling from ../a
594 searching for changes
592 searching for changes
595 no changes found
593 no changes found
596 abort: post-pull.nomodule hook is invalid: "nomodule" not in a module
594 abort: post-pull.nomodule hook is invalid: "nomodule" not in a module
597 [255]
595 [255]
598
596
599 $ echo '[hooks]' > .hg/hgrc
597 $ echo '[hooks]' > .hg/hgrc
600 $ echo 'post-pull.badmodule = python:nomodule.nowhere' >> .hg/hgrc
598 $ echo 'post-pull.badmodule = python:nomodule.nowhere' >> .hg/hgrc
601 $ hg pull ../a
599 $ hg pull ../a
602 pulling from ../a
600 pulling from ../a
603 searching for changes
601 searching for changes
604 no changes found
602 no changes found
605 abort: post-pull.badmodule hook is invalid: import of "nomodule" failed
603 abort: post-pull.badmodule hook is invalid: import of "nomodule" failed
606 (run with --traceback for stack trace)
604 (run with --traceback for stack trace)
607 [255]
605 [255]
608
606
609 $ echo '[hooks]' > .hg/hgrc
607 $ echo '[hooks]' > .hg/hgrc
610 $ echo 'post-pull.nohook = python:hooktests.nohook' >> .hg/hgrc
608 $ echo 'post-pull.nohook = python:hooktests.nohook' >> .hg/hgrc
611 $ hg pull ../a
609 $ hg pull ../a
612 pulling from ../a
610 pulling from ../a
613 searching for changes
611 searching for changes
614 no changes found
612 no changes found
615 abort: post-pull.nohook hook is invalid: "hooktests.nohook" is not defined
613 abort: post-pull.nohook hook is invalid: "hooktests.nohook" is not defined
616 [255]
614 [255]
617
615
618 make sure --traceback works
616 make sure --traceback works
619
617
620 $ echo '[hooks]' > .hg/hgrc
618 $ echo '[hooks]' > .hg/hgrc
621 $ echo 'commit.abort = python:hooktests.aborthook' >> .hg/hgrc
619 $ echo 'commit.abort = python:hooktests.aborthook' >> .hg/hgrc
622
620
623 $ echo aa > a
621 $ echo aa > a
624 $ hg --traceback commit -d '0 0' -ma 2>&1 | grep '^Traceback'
622 $ hg --traceback commit -d '0 0' -ma 2>&1 | grep '^Traceback'
625 Traceback (most recent call last):
623 Traceback (most recent call last):
626
624
627 $ cd ..
625 $ cd ..
628 $ hg init c
626 $ hg init c
629 $ cd c
627 $ cd c
630
628
631 $ cat > hookext.py <<EOF
629 $ cat > hookext.py <<EOF
632 > def autohook(**args):
630 > def autohook(ui, **args):
633 > print("Automatically installed hook")
631 > ui.write('Automatically installed hook\n')
634 >
632 >
635 > def reposetup(ui, repo):
633 > def reposetup(ui, repo):
636 > repo.ui.setconfig("hooks", "commit.auto", autohook)
634 > repo.ui.setconfig("hooks", "commit.auto", autohook)
637 > EOF
635 > EOF
638 $ echo '[extensions]' >> .hg/hgrc
636 $ echo '[extensions]' >> .hg/hgrc
639 $ echo 'hookext = hookext.py' >> .hg/hgrc
637 $ echo 'hookext = hookext.py' >> .hg/hgrc
640
638
641 $ touch foo
639 $ touch foo
642 $ hg add foo
640 $ hg add foo
643 $ hg ci -d '0 0' -m 'add foo'
641 $ hg ci -d '0 0' -m 'add foo'
644 Automatically installed hook
642 Automatically installed hook
645 $ echo >> foo
643 $ echo >> foo
646 $ hg ci --debug -d '0 0' -m 'change foo'
644 $ hg ci --debug -d '0 0' -m 'change foo'
647 committing files:
645 committing files:
648 foo
646 foo
649 committing manifest
647 committing manifest
650 committing changelog
648 committing changelog
651 updating the branch cache
649 updating the branch cache
652 committed changeset 1:52998019f6252a2b893452765fcb0a47351a5708
650 committed changeset 1:52998019f6252a2b893452765fcb0a47351a5708
653 calling hook commit.auto: hgext_hookext.autohook
651 calling hook commit.auto: hgext_hookext.autohook
654 Automatically installed hook
652 Automatically installed hook
655
653
656 $ hg showconfig hooks
654 $ hg showconfig hooks
657 hooks.commit.auto=<function autohook at *> (glob)
655 hooks.commit.auto=<function autohook at *> (glob)
658
656
659 test python hook configured with python:[file]:[hook] syntax
657 test python hook configured with python:[file]:[hook] syntax
660
658
661 $ cd ..
659 $ cd ..
662 $ mkdir d
660 $ mkdir d
663 $ cd d
661 $ cd d
664 $ hg init repo
662 $ hg init repo
665 $ mkdir hooks
663 $ mkdir hooks
666
664
667 $ cd hooks
665 $ cd hooks
668 $ cat > testhooks.py <<EOF
666 $ cat > testhooks.py <<EOF
669 > def testhook(**args):
667 > def testhook(ui, **args):
670 > print('hook works')
668 > ui.write('hook works\n')
671 > EOF
669 > EOF
672 $ echo '[hooks]' > ../repo/.hg/hgrc
670 $ echo '[hooks]' > ../repo/.hg/hgrc
673 $ echo "pre-commit.test = python:`pwd`/testhooks.py:testhook" >> ../repo/.hg/hgrc
671 $ echo "pre-commit.test = python:`pwd`/testhooks.py:testhook" >> ../repo/.hg/hgrc
674
672
675 $ cd ../repo
673 $ cd ../repo
676 $ hg commit -d '0 0'
674 $ hg commit -d '0 0'
677 hook works
675 hook works
678 nothing changed
676 nothing changed
679 [1]
677 [1]
680
678
681 $ echo '[hooks]' > .hg/hgrc
679 $ echo '[hooks]' > .hg/hgrc
682 $ echo "update.ne = python:`pwd`/nonexistent.py:testhook" >> .hg/hgrc
680 $ echo "update.ne = python:`pwd`/nonexistent.py:testhook" >> .hg/hgrc
683 $ echo "pre-identify.npmd = python:`pwd`/:no_python_module_dir" >> .hg/hgrc
681 $ echo "pre-identify.npmd = python:`pwd`/:no_python_module_dir" >> .hg/hgrc
684
682
685 $ hg up null
683 $ hg up null
686 loading update.ne hook failed:
684 loading update.ne hook failed:
687 abort: No such file or directory: $TESTTMP/d/repo/nonexistent.py
685 abort: No such file or directory: $TESTTMP/d/repo/nonexistent.py
688 [255]
686 [255]
689
687
690 $ hg id
688 $ hg id
691 loading pre-identify.npmd hook failed:
689 loading pre-identify.npmd hook failed:
692 abort: No module named repo!
690 abort: No module named repo!
693 [255]
691 [255]
694
692
695 $ cd ../../b
693 $ cd ../../b
696
694
697 make sure --traceback works on hook import failure
695 make sure --traceback works on hook import failure
698
696
699 $ cat > importfail.py <<EOF
697 $ cat > importfail.py <<EOF
700 > import somebogusmodule
698 > import somebogusmodule
701 > # dereference something in the module to force demandimport to load it
699 > # dereference something in the module to force demandimport to load it
702 > somebogusmodule.whatever
700 > somebogusmodule.whatever
703 > EOF
701 > EOF
704
702
705 $ echo '[hooks]' > .hg/hgrc
703 $ echo '[hooks]' > .hg/hgrc
706 $ echo 'precommit.importfail = python:importfail.whatever' >> .hg/hgrc
704 $ echo 'precommit.importfail = python:importfail.whatever' >> .hg/hgrc
707
705
708 $ echo a >> a
706 $ echo a >> a
709 $ hg --traceback commit -ma 2>&1 | egrep -v '^( +File| [a-zA-Z(])'
707 $ hg --traceback commit -ma 2>&1 | egrep -v '^( +File| [a-zA-Z(])'
710 exception from first failed import attempt:
708 exception from first failed import attempt:
711 Traceback (most recent call last):
709 Traceback (most recent call last):
712 ImportError: No module named somebogusmodule
710 ImportError: No module named somebogusmodule
713 exception from second failed import attempt:
711 exception from second failed import attempt:
714 Traceback (most recent call last):
712 Traceback (most recent call last):
715 ImportError: No module named hgext_importfail
713 ImportError: No module named hgext_importfail
716 Traceback (most recent call last):
714 Traceback (most recent call last):
717 HookLoadError: precommit.importfail hook is invalid: import of "importfail" failed
715 HookLoadError: precommit.importfail hook is invalid: import of "importfail" failed
718 abort: precommit.importfail hook is invalid: import of "importfail" failed
716 abort: precommit.importfail hook is invalid: import of "importfail" failed
719
717
720 Issue1827: Hooks Update & Commit not completely post operation
718 Issue1827: Hooks Update & Commit not completely post operation
721
719
722 commit and update hooks should run after command completion. The largefiles
720 commit and update hooks should run after command completion. The largefiles
723 use demonstrates a recursive wlock, showing the hook doesn't run until the
721 use demonstrates a recursive wlock, showing the hook doesn't run until the
724 final release (and dirstate flush).
722 final release (and dirstate flush).
725
723
726 $ echo '[hooks]' > .hg/hgrc
724 $ echo '[hooks]' > .hg/hgrc
727 $ echo 'commit = hg id' >> .hg/hgrc
725 $ echo 'commit = hg id' >> .hg/hgrc
728 $ echo 'update = hg id' >> .hg/hgrc
726 $ echo 'update = hg id' >> .hg/hgrc
729 $ echo bb > a
727 $ echo bb > a
730 $ hg ci -ma
728 $ hg ci -ma
731 223eafe2750c tip
729 223eafe2750c tip
732 $ hg up 0 --config extensions.largefiles=
730 $ hg up 0 --config extensions.largefiles=
733 The fsmonitor extension is incompatible with the largefiles extension and has been disabled. (fsmonitor !)
731 The fsmonitor extension is incompatible with the largefiles extension and has been disabled. (fsmonitor !)
734 cb9a9f314b8b
732 cb9a9f314b8b
735 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
733 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
736
734
737 make sure --verbose (and --quiet/--debug etc.) are propagated to the local ui
735 make sure --verbose (and --quiet/--debug etc.) are propagated to the local ui
738 that is passed to pre/post hooks
736 that is passed to pre/post hooks
739
737
740 $ echo '[hooks]' > .hg/hgrc
738 $ echo '[hooks]' > .hg/hgrc
741 $ echo 'pre-identify = python:hooktests.verbosehook' >> .hg/hgrc
739 $ echo 'pre-identify = python:hooktests.verbosehook' >> .hg/hgrc
742 $ hg id
740 $ hg id
743 cb9a9f314b8b
741 cb9a9f314b8b
744 $ hg id --verbose
742 $ hg id --verbose
745 calling hook pre-identify: hooktests.verbosehook
743 calling hook pre-identify: hooktests.verbosehook
746 verbose output from hook
744 verbose output from hook
747 cb9a9f314b8b
745 cb9a9f314b8b
748
746
749 Ensure hooks can be prioritized
747 Ensure hooks can be prioritized
750
748
751 $ echo '[hooks]' > .hg/hgrc
749 $ echo '[hooks]' > .hg/hgrc
752 $ echo 'pre-identify.a = python:hooktests.verbosehook' >> .hg/hgrc
750 $ echo 'pre-identify.a = python:hooktests.verbosehook' >> .hg/hgrc
753 $ echo 'pre-identify.b = python:hooktests.verbosehook' >> .hg/hgrc
751 $ echo 'pre-identify.b = python:hooktests.verbosehook' >> .hg/hgrc
754 $ echo 'priority.pre-identify.b = 1' >> .hg/hgrc
752 $ echo 'priority.pre-identify.b = 1' >> .hg/hgrc
755 $ echo 'pre-identify.c = python:hooktests.verbosehook' >> .hg/hgrc
753 $ echo 'pre-identify.c = python:hooktests.verbosehook' >> .hg/hgrc
756 $ hg id --verbose
754 $ hg id --verbose
757 calling hook pre-identify.b: hooktests.verbosehook
755 calling hook pre-identify.b: hooktests.verbosehook
758 verbose output from hook
756 verbose output from hook
759 calling hook pre-identify.a: hooktests.verbosehook
757 calling hook pre-identify.a: hooktests.verbosehook
760 verbose output from hook
758 verbose output from hook
761 calling hook pre-identify.c: hooktests.verbosehook
759 calling hook pre-identify.c: hooktests.verbosehook
762 verbose output from hook
760 verbose output from hook
763 cb9a9f314b8b
761 cb9a9f314b8b
764
762
765 new tags must be visible in pretxncommit (issue3210)
763 new tags must be visible in pretxncommit (issue3210)
766
764
767 $ echo 'pretxncommit.printtags = python:hooktests.printtags' >> .hg/hgrc
765 $ echo 'pretxncommit.printtags = python:hooktests.printtags' >> .hg/hgrc
768 $ hg tag -f foo
766 $ hg tag -f foo
769 ['a', 'foo', 'tip']
767 ['a', 'foo', 'tip']
770
768
771 post-init hooks must not crash (issue4983)
769 post-init hooks must not crash (issue4983)
772 This also creates the `to` repo for the next test block.
770 This also creates the `to` repo for the next test block.
773
771
774 $ cd ..
772 $ cd ..
775 $ cat << EOF >> hgrc-with-post-init-hook
773 $ cat << EOF >> hgrc-with-post-init-hook
776 > [hooks]
774 > [hooks]
777 > post-init = sh -c "printenv.py post-init"
775 > post-init = sh -c "printenv.py post-init"
778 > EOF
776 > EOF
779 $ HGRCPATH=hgrc-with-post-init-hook hg init to
777 $ HGRCPATH=hgrc-with-post-init-hook hg init to
780 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
778 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
781
779
782 new commits must be visible in pretxnchangegroup (issue3428)
780 new commits must be visible in pretxnchangegroup (issue3428)
783
781
784 $ echo '[hooks]' >> to/.hg/hgrc
782 $ echo '[hooks]' >> to/.hg/hgrc
785 $ echo 'prechangegroup = hg --traceback tip' >> to/.hg/hgrc
783 $ echo 'prechangegroup = hg --traceback tip' >> to/.hg/hgrc
786 $ echo 'pretxnchangegroup = hg --traceback tip' >> to/.hg/hgrc
784 $ echo 'pretxnchangegroup = hg --traceback tip' >> to/.hg/hgrc
787 $ echo a >> to/a
785 $ echo a >> to/a
788 $ hg --cwd to ci -Ama
786 $ hg --cwd to ci -Ama
789 adding a
787 adding a
790 $ hg clone to from
788 $ hg clone to from
791 updating to branch default
789 updating to branch default
792 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
790 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
793 $ echo aa >> from/a
791 $ echo aa >> from/a
794 $ hg --cwd from ci -mb
792 $ hg --cwd from ci -mb
795 $ hg --cwd from push
793 $ hg --cwd from push
796 pushing to $TESTTMP/to (glob)
794 pushing to $TESTTMP/to (glob)
797 searching for changes
795 searching for changes
798 changeset: 0:cb9a9f314b8b
796 changeset: 0:cb9a9f314b8b
799 tag: tip
797 tag: tip
800 user: test
798 user: test
801 date: Thu Jan 01 00:00:00 1970 +0000
799 date: Thu Jan 01 00:00:00 1970 +0000
802 summary: a
800 summary: a
803
801
804 adding changesets
802 adding changesets
805 adding manifests
803 adding manifests
806 adding file changes
804 adding file changes
807 added 1 changesets with 1 changes to 1 files
805 added 1 changesets with 1 changes to 1 files
808 changeset: 1:9836a07b9b9d
806 changeset: 1:9836a07b9b9d
809 tag: tip
807 tag: tip
810 user: test
808 user: test
811 date: Thu Jan 01 00:00:00 1970 +0000
809 date: Thu Jan 01 00:00:00 1970 +0000
812 summary: b
810 summary: b
813
811
814
812
815 pretxnclose hook failure should abort the transaction
813 pretxnclose hook failure should abort the transaction
816
814
817 $ hg init txnfailure
815 $ hg init txnfailure
818 $ cd txnfailure
816 $ cd txnfailure
819 $ touch a && hg commit -Aqm a
817 $ touch a && hg commit -Aqm a
820 $ cat >> .hg/hgrc <<EOF
818 $ cat >> .hg/hgrc <<EOF
821 > [hooks]
819 > [hooks]
822 > pretxnclose.error = exit 1
820 > pretxnclose.error = exit 1
823 > EOF
821 > EOF
824 $ hg strip -r 0 --config extensions.strip=
822 $ hg strip -r 0 --config extensions.strip=
825 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
823 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
826 saved backup bundle to * (glob)
824 saved backup bundle to * (glob)
827 transaction abort!
825 transaction abort!
828 rollback completed
826 rollback completed
829 strip failed, backup bundle stored in * (glob)
827 strip failed, backup bundle stored in * (glob)
830 abort: pretxnclose.error hook exited with status 1
828 abort: pretxnclose.error hook exited with status 1
831 [255]
829 [255]
832 $ hg recover
830 $ hg recover
833 no interrupted transaction available
831 no interrupted transaction available
834 [1]
832 [1]
835 $ cd ..
833 $ cd ..
836
834
837 check whether HG_PENDING makes pending changes only in related
835 check whether HG_PENDING makes pending changes only in related
838 repositories visible to an external hook.
836 repositories visible to an external hook.
839
837
840 (emulate a transaction running concurrently by copied
838 (emulate a transaction running concurrently by copied
841 .hg/store/00changelog.i.a in subsequent test)
839 .hg/store/00changelog.i.a in subsequent test)
842
840
843 $ cat > $TESTTMP/savepending.sh <<EOF
841 $ cat > $TESTTMP/savepending.sh <<EOF
844 > cp .hg/store/00changelog.i.a .hg/store/00changelog.i.a.saved
842 > cp .hg/store/00changelog.i.a .hg/store/00changelog.i.a.saved
845 > exit 1 # to avoid adding new revision for subsequent tests
843 > exit 1 # to avoid adding new revision for subsequent tests
846 > EOF
844 > EOF
847 $ cd a
845 $ cd a
848 $ hg tip -q
846 $ hg tip -q
849 4:539e4b31b6dc
847 4:539e4b31b6dc
850 $ hg --config hooks.pretxnclose="sh $TESTTMP/savepending.sh" commit -m "invisible"
848 $ hg --config hooks.pretxnclose="sh $TESTTMP/savepending.sh" commit -m "invisible"
851 transaction abort!
849 transaction abort!
852 rollback completed
850 rollback completed
853 abort: pretxnclose hook exited with status 1
851 abort: pretxnclose hook exited with status 1
854 [255]
852 [255]
855 $ cp .hg/store/00changelog.i.a.saved .hg/store/00changelog.i.a
853 $ cp .hg/store/00changelog.i.a.saved .hg/store/00changelog.i.a
856
854
857 (check (in)visibility of new changeset while transaction running in
855 (check (in)visibility of new changeset while transaction running in
858 repo)
856 repo)
859
857
860 $ cat > $TESTTMP/checkpending.sh <<EOF
858 $ cat > $TESTTMP/checkpending.sh <<EOF
861 > echo '@a'
859 > echo '@a'
862 > hg -R "$TESTTMP/a" tip -q
860 > hg -R "$TESTTMP/a" tip -q
863 > echo '@a/nested'
861 > echo '@a/nested'
864 > hg -R "$TESTTMP/a/nested" tip -q
862 > hg -R "$TESTTMP/a/nested" tip -q
865 > exit 1 # to avoid adding new revision for subsequent tests
863 > exit 1 # to avoid adding new revision for subsequent tests
866 > EOF
864 > EOF
867 $ hg init nested
865 $ hg init nested
868 $ cd nested
866 $ cd nested
869 $ echo a > a
867 $ echo a > a
870 $ hg add a
868 $ hg add a
871 $ hg --config hooks.pretxnclose="sh $TESTTMP/checkpending.sh" commit -m '#0'
869 $ hg --config hooks.pretxnclose="sh $TESTTMP/checkpending.sh" commit -m '#0'
872 @a
870 @a
873 4:539e4b31b6dc
871 4:539e4b31b6dc
874 @a/nested
872 @a/nested
875 0:bf5e395ced2c
873 0:bf5e395ced2c
876 transaction abort!
874 transaction abort!
877 rollback completed
875 rollback completed
878 abort: pretxnclose hook exited with status 1
876 abort: pretxnclose hook exited with status 1
879 [255]
877 [255]
880
878
881 Hook from untrusted hgrc are reported as failure
879 Hook from untrusted hgrc are reported as failure
882 ================================================
880 ================================================
883
881
884 $ cat << EOF > $TESTTMP/untrusted.py
882 $ cat << EOF > $TESTTMP/untrusted.py
885 > from mercurial import scmutil, util
883 > from mercurial import scmutil, util
886 > def uisetup(ui):
884 > def uisetup(ui):
887 > class untrustedui(ui.__class__):
885 > class untrustedui(ui.__class__):
888 > def _trusted(self, fp, f):
886 > def _trusted(self, fp, f):
889 > if util.normpath(fp.name).endswith('untrusted/.hg/hgrc'):
887 > if util.normpath(fp.name).endswith('untrusted/.hg/hgrc'):
890 > return False
888 > return False
891 > return super(untrustedui, self)._trusted(fp, f)
889 > return super(untrustedui, self)._trusted(fp, f)
892 > ui.__class__ = untrustedui
890 > ui.__class__ = untrustedui
893 > EOF
891 > EOF
894 $ cat << EOF >> $HGRCPATH
892 $ cat << EOF >> $HGRCPATH
895 > [extensions]
893 > [extensions]
896 > untrusted=$TESTTMP/untrusted.py
894 > untrusted=$TESTTMP/untrusted.py
897 > EOF
895 > EOF
898 $ hg init untrusted
896 $ hg init untrusted
899 $ cd untrusted
897 $ cd untrusted
900
898
901 Non-blocking hook
899 Non-blocking hook
902 -----------------
900 -----------------
903
901
904 $ cat << EOF >> .hg/hgrc
902 $ cat << EOF >> .hg/hgrc
905 > [hooks]
903 > [hooks]
906 > txnclose.testing=echo txnclose hook called
904 > txnclose.testing=echo txnclose hook called
907 > EOF
905 > EOF
908 $ touch a && hg commit -Aqm a
906 $ touch a && hg commit -Aqm a
909 warning: untrusted hook txnclose.testing not executed
907 warning: untrusted hook txnclose.testing not executed
910 $ hg log
908 $ hg log
911 changeset: 0:3903775176ed
909 changeset: 0:3903775176ed
912 tag: tip
910 tag: tip
913 user: test
911 user: test
914 date: Thu Jan 01 00:00:00 1970 +0000
912 date: Thu Jan 01 00:00:00 1970 +0000
915 summary: a
913 summary: a
916
914
917
915
918 Non-blocking hook
916 Non-blocking hook
919 -----------------
917 -----------------
920
918
921 $ cat << EOF >> .hg/hgrc
919 $ cat << EOF >> .hg/hgrc
922 > [hooks]
920 > [hooks]
923 > pretxnclose.testing=echo pre-txnclose hook called
921 > pretxnclose.testing=echo pre-txnclose hook called
924 > EOF
922 > EOF
925 $ touch b && hg commit -Aqm a
923 $ touch b && hg commit -Aqm a
926 transaction abort!
924 transaction abort!
927 rollback completed
925 rollback completed
928 abort: untrusted hook pretxnclose.testing not executed
926 abort: untrusted hook pretxnclose.testing not executed
929 (see 'hg help config.trusted')
927 (see 'hg help config.trusted')
930 [255]
928 [255]
931 $ hg log
929 $ hg log
932 changeset: 0:3903775176ed
930 changeset: 0:3903775176ed
933 tag: tip
931 tag: tip
934 user: test
932 user: test
935 date: Thu Jan 01 00:00:00 1970 +0000
933 date: Thu Jan 01 00:00:00 1970 +0000
936 summary: a
934 summary: a
937
935
General Comments 0
You need to be logged in to leave comments. Login now