##// END OF EJS Templates
tests: check visibility of pending changesets...
John Coomes -
r13237:c046978c default
parent child Browse files
Show More
@@ -0,0 +1,117 b''
1 Verify that pending changesets are seen by pretxn* hooks but not by other
2 processes that access the destination repo while the hooks are running.
3
4 The hooks (python and external) both reject changesets after some think time,
5 during which another process runs pull. Each hook creates a file ('notify') to
6 indicate to the controlling process that it is running; the process removes the
7 file to indicate the hook can terminate.
8
9 init env vars
10
11 $ d=`pwd`
12 $ maxwait=20
13
14 utility to run the test - start a push in the background and run pull
15
16 $ dotest() {
17 > rm -f notify
18 > printf 'push '; hg -R child-push tip --template '{node}\n'
19 > hg -R child-push -q push > push.out 2>&1 &
20 >
21 > # wait for hook to create the notify file
22 > i=$maxwait
23 > while [ ! -f notify -a $i != 0 ]; do
24 > sleep 1
25 > i=`expr $i - 1`
26 > done
27 >
28 > # run pull
29 > hg -R child-pull -q pull
30 > rc=$?
31 >
32 > # tell hook to finish; notify should exist.
33 > rm notify
34 > wait
35 >
36 > cat push.out
37 > printf 'pull '; hg -R child-pull tip --template '{node}\n'
38 > return $rc
39 > }
40
41 python hook
42
43 $ cat <<EOF > reject.py
44 > import os, time
45 > from mercurial import ui, localrepo
46 > def rejecthook(ui, repo, hooktype, node, **opts):
47 > ui.write('hook %s\\n' % repo['tip'].hex())
48 > # create the notify file so caller knows we're running
49 > fpath = os.path.join('$d', 'notify')
50 > f = open(fpath, 'w')
51 > f.close()
52 > # wait for ack - caller should delete the notify file
53 > i = $maxwait
54 > while os.path.exists(fpath) and i > 0:
55 > time.sleep(1)
56 > i -= 1
57 > return True # reject the changesets
58 > EOF
59
60 external hook
61
62 $ cat <<EOF > reject.sh
63 > #! /bin/sh
64 > printf 'hook '; hg tip --template '{node}\\n'
65 > # create the notify file so caller knows we're running
66 > fpath=$d/notify
67 > touch \$fpath
68 > # wait for ack - caller should delete the notify file
69 > i=$maxwait
70 > while [ -f \$fpath -a \$i != 0 ]; do
71 > sleep 1
72 > i=\`expr \$i - 1\`
73 > done
74 > exit 1 # reject the changesets
75 > EOF
76 $ chmod +x reject.sh
77
78 create repos
79
80 $ hg init parent
81 $ hg clone -q parent child-push
82 $ hg clone -q parent child-pull
83 $ echo a > child-push/a
84 $ hg -R child-push add child-push/a
85 $ hg -R child-push commit -m a -d '1000000 0'
86
87 test python hook
88
89 $ cat <<EOF > parent/.hg/hgrc
90 > [extensions]
91 > reject = $d/reject.py
92 > [hooks]
93 > pretxnchangegroup = python:reject.rejecthook
94 > EOF
95
96 $ dotest
97 push 29b62aeb769fdf78d8d9c5f28b017f76d7ef824b
98 hook 29b62aeb769fdf78d8d9c5f28b017f76d7ef824b
99 transaction abort!
100 rollback completed
101 abort: pretxnchangegroup hook failed
102 pull 0000000000000000000000000000000000000000
103
104 test external hook
105
106 $ cat <<EOF > parent/.hg/hgrc
107 > [hooks]
108 > pretxnchangegroup = $d/reject.sh
109 > EOF
110
111 $ dotest
112 push 29b62aeb769fdf78d8d9c5f28b017f76d7ef824b
113 hook 29b62aeb769fdf78d8d9c5f28b017f76d7ef824b
114 transaction abort!
115 rollback completed
116 abort: pretxnchangegroup hook exited with status 1
117 pull 0000000000000000000000000000000000000000
General Comments 0
You need to be logged in to leave comments. Login now