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