##// END OF EJS Templates
py3: byte-stringify most literals in test-commandserver.t...
Yuya Nishihara -
r40390:f9f2faf2 default
parent child Browse files
Show More
@@ -1,1030 +1,1030 b''
1 1 #if windows
2 2 $ PYTHONPATH="$TESTDIR/../contrib;$PYTHONPATH"
3 3 #else
4 4 $ PYTHONPATH="$TESTDIR/../contrib:$PYTHONPATH"
5 5 #endif
6 6 $ export PYTHONPATH
7 7
8 8 typical client does not want echo-back messages, so test without it:
9 9
10 10 $ grep -v '^promptecho ' < $HGRCPATH >> $HGRCPATH.new
11 11 $ mv $HGRCPATH.new $HGRCPATH
12 12
13 13 $ hg init repo
14 14 $ cd repo
15 15
16 16 >>> from __future__ import absolute_import, print_function
17 17 >>> import os
18 18 >>> import sys
19 19 >>> from hgclient import check, readchannel, runcommand
20 20 >>> @check
21 21 ... def hellomessage(server):
22 22 ... ch, data = readchannel(server)
23 ... print('%c, %r' % (ch, data))
23 ... print(b'%c, %r' % (ch, data))
24 24 ... # run an arbitrary command to make sure the next thing the server
25 25 ... # sends isn't part of the hello message
26 ... runcommand(server, ['id'])
26 ... runcommand(server, [b'id'])
27 27 o, 'capabilities: getencoding runcommand\nencoding: *\npid: *' (glob)
28 28 *** runcommand id
29 29 000000000000 tip
30 30
31 31 >>> from hgclient import check
32 32 >>> @check
33 33 ... def unknowncommand(server):
34 ... server.stdin.write('unknowncommand\n')
34 ... server.stdin.write(b'unknowncommand\n')
35 35 abort: unknown command unknowncommand
36 36
37 37 >>> from hgclient import check, readchannel, runcommand
38 38 >>> @check
39 39 ... def checkruncommand(server):
40 40 ... # hello block
41 41 ... readchannel(server)
42 42 ...
43 43 ... # no args
44 44 ... runcommand(server, [])
45 45 ...
46 46 ... # global options
47 ... runcommand(server, ['id', '--quiet'])
47 ... runcommand(server, [b'id', b'--quiet'])
48 48 ...
49 49 ... # make sure global options don't stick through requests
50 ... runcommand(server, ['id'])
50 ... runcommand(server, [b'id'])
51 51 ...
52 52 ... # --config
53 ... runcommand(server, ['id', '--config', 'ui.quiet=True'])
53 ... runcommand(server, [b'id', b'--config', b'ui.quiet=True'])
54 54 ...
55 55 ... # make sure --config doesn't stick
56 ... runcommand(server, ['id'])
56 ... runcommand(server, [b'id'])
57 57 ...
58 58 ... # negative return code should be masked
59 ... runcommand(server, ['id', '-runknown'])
59 ... runcommand(server, [b'id', b'-runknown'])
60 60 *** runcommand
61 61 Mercurial Distributed SCM
62 62
63 63 basic commands:
64 64
65 65 add add the specified files on the next commit
66 66 annotate show changeset information by line for each file
67 67 clone make a copy of an existing repository
68 68 commit commit the specified files or all outstanding changes
69 69 diff diff repository (or selected files)
70 70 export dump the header and diffs for one or more changesets
71 71 forget forget the specified files on the next commit
72 72 init create a new repository in the given directory
73 73 log show revision history of entire repository or files
74 74 merge merge another revision into working directory
75 75 pull pull changes from the specified source
76 76 push push changes to the specified destination
77 77 remove remove the specified files on the next commit
78 78 serve start stand-alone webserver
79 79 status show changed files in the working directory
80 80 summary summarize working directory state
81 81 update update working directory (or switch revisions)
82 82
83 83 (use 'hg help' for the full list of commands or 'hg -v' for details)
84 84 *** runcommand id --quiet
85 85 000000000000
86 86 *** runcommand id
87 87 000000000000 tip
88 88 *** runcommand id --config ui.quiet=True
89 89 000000000000
90 90 *** runcommand id
91 91 000000000000 tip
92 92 *** runcommand id -runknown
93 93 abort: unknown revision 'unknown'!
94 94 [255]
95 95
96 96 >>> from hgclient import check, readchannel
97 97 >>> @check
98 98 ... def inputeof(server):
99 99 ... readchannel(server)
100 ... server.stdin.write('runcommand\n')
100 ... server.stdin.write(b'runcommand\n')
101 101 ... # close stdin while server is waiting for input
102 102 ... server.stdin.close()
103 103 ...
104 104 ... # server exits with 1 if the pipe closed while reading the command
105 ... print('server exit code =', server.wait())
105 ... print(b'server exit code =', server.wait())
106 106 server exit code = 1
107 107
108 108 >>> from hgclient import check, readchannel, runcommand, stringio
109 109 >>> @check
110 110 ... def serverinput(server):
111 111 ... readchannel(server)
112 112 ...
113 ... patch = """
113 ... patch = b"""
114 114 ... # HG changeset patch
115 115 ... # User test
116 116 ... # Date 0 0
117 117 ... # Node ID c103a3dec114d882c98382d684d8af798d09d857
118 118 ... # Parent 0000000000000000000000000000000000000000
119 119 ... 1
120 120 ...
121 121 ... diff -r 000000000000 -r c103a3dec114 a
122 122 ... --- /dev/null Thu Jan 01 00:00:00 1970 +0000
123 123 ... +++ b/a Thu Jan 01 00:00:00 1970 +0000
124 124 ... @@ -0,0 +1,1 @@
125 125 ... +1
126 126 ... """
127 127 ...
128 ... runcommand(server, ['import', '-'], input=stringio(patch))
129 ... runcommand(server, ['log'])
128 ... runcommand(server, [b'import', b'-'], input=stringio(patch))
129 ... runcommand(server, [b'log'])
130 130 *** runcommand import -
131 131 applying patch from stdin
132 132 *** runcommand log
133 133 changeset: 0:eff892de26ec
134 134 tag: tip
135 135 user: test
136 136 date: Thu Jan 01 00:00:00 1970 +0000
137 137 summary: 1
138 138
139 139
140 140 check strict parsing of early options:
141 141
142 142 >>> import os
143 143 >>> from hgclient import check, readchannel, runcommand
144 144 >>> os.environ['HGPLAIN'] = '+strictflags'
145 145 >>> @check
146 146 ... def cwd(server):
147 147 ... readchannel(server)
148 ... runcommand(server, ['log', '-b', '--config=alias.log=!echo pwned',
149 ... 'default'])
148 ... runcommand(server, [b'log', b'-b', b'--config=alias.log=!echo pwned',
149 ... b'default'])
150 150 *** runcommand log -b --config=alias.log=!echo pwned default
151 151 abort: unknown revision '--config=alias.log=!echo pwned'!
152 152 [255]
153 153
154 154 check that "histedit --commands=-" can read rules from the input channel:
155 155
156 156 >>> import cStringIO
157 157 >>> from hgclient import check, readchannel, runcommand
158 158 >>> @check
159 159 ... def serverinput(server):
160 160 ... readchannel(server)
161 ... rules = 'pick eff892de26ec\n'
162 ... runcommand(server, ['histedit', '0', '--commands=-',
163 ... '--config', 'extensions.histedit='],
161 ... rules = b'pick eff892de26ec\n'
162 ... runcommand(server, [b'histedit', b'0', b'--commands=-',
163 ... b'--config', b'extensions.histedit='],
164 164 ... input=cStringIO.StringIO(rules))
165 165 *** runcommand histedit 0 --commands=- --config extensions.histedit=
166 166
167 167 check that --cwd doesn't persist between requests:
168 168
169 169 $ mkdir foo
170 170 $ touch foo/bar
171 171 >>> from hgclient import check, readchannel, runcommand
172 172 >>> @check
173 173 ... def cwd(server):
174 174 ... readchannel(server)
175 ... runcommand(server, ['--cwd', 'foo', 'st', 'bar'])
176 ... runcommand(server, ['st', 'foo/bar'])
175 ... runcommand(server, [b'--cwd', b'foo', b'st', b'bar'])
176 ... runcommand(server, [b'st', b'foo/bar'])
177 177 *** runcommand --cwd foo st bar
178 178 ? bar
179 179 *** runcommand st foo/bar
180 180 ? foo/bar
181 181
182 182 $ rm foo/bar
183 183
184 184
185 185 check that local configs for the cached repo aren't inherited when -R is used:
186 186
187 187 $ cat <<EOF >> .hg/hgrc
188 188 > [ui]
189 189 > foo = bar
190 190 > EOF
191 191
192 192 #if no-extraextensions
193 193
194 194 >>> from hgclient import check, readchannel, runcommand, sep
195 195 >>> @check
196 196 ... def localhgrc(server):
197 197 ... readchannel(server)
198 198 ...
199 199 ... # the cached repo local hgrc contains ui.foo=bar, so showconfig should
200 200 ... # show it
201 ... runcommand(server, ['showconfig'], outfilter=sep)
201 ... runcommand(server, [b'showconfig'], outfilter=sep)
202 202 ...
203 203 ... # but not for this repo
204 ... runcommand(server, ['init', 'foo'])
205 ... runcommand(server, ['-R', 'foo', 'showconfig', 'ui', 'defaults'])
204 ... runcommand(server, [b'init', b'foo'])
205 ... runcommand(server, [b'-R', b'foo', b'showconfig', b'ui', b'defaults'])
206 206 *** runcommand showconfig
207 207 bundle.mainreporoot=$TESTTMP/repo
208 208 devel.all-warnings=true
209 209 devel.default-date=0 0
210 210 extensions.fsmonitor= (fsmonitor !)
211 211 largefiles.usercache=$TESTTMP/.cache/largefiles
212 212 lfs.usercache=$TESTTMP/.cache/lfs
213 213 ui.slash=True
214 214 ui.interactive=False
215 215 ui.mergemarkers=detailed
216 216 ui.foo=bar
217 217 ui.nontty=true
218 218 web.address=localhost
219 219 web\.ipv6=(?:True|False) (re)
220 220 web.server-header=testing stub value
221 221 *** runcommand init foo
222 222 *** runcommand -R foo showconfig ui defaults
223 223 ui.slash=True
224 224 ui.interactive=False
225 225 ui.mergemarkers=detailed
226 226 ui.nontty=true
227 227 #endif
228 228
229 229 $ rm -R foo
230 230
231 231 #if windows
232 232 $ PYTHONPATH="$TESTTMP/repo;$PYTHONPATH"
233 233 #else
234 234 $ PYTHONPATH="$TESTTMP/repo:$PYTHONPATH"
235 235 #endif
236 236
237 237 $ cat <<EOF > hook.py
238 238 > from __future__ import print_function
239 239 > import sys
240 240 > def hook(**args):
241 > print('hook talking')
242 > print('now try to read something: %r' % sys.stdin.read())
241 > print(b'hook talking')
242 > print(b'now try to read something: %r' % sys.stdin.read())
243 243 > EOF
244 244
245 245 >>> from hgclient import check, readchannel, runcommand, stringio
246 246 >>> @check
247 247 ... def hookoutput(server):
248 248 ... readchannel(server)
249 ... runcommand(server, ['--config',
250 ... 'hooks.pre-identify=python:hook.hook',
251 ... 'id'],
252 ... input=stringio('some input'))
249 ... runcommand(server, [b'--config',
250 ... b'hooks.pre-identify=python:hook.hook',
251 ... b'id'],
252 ... input=stringio(b'some input'))
253 253 *** runcommand --config hooks.pre-identify=python:hook.hook id
254 254 eff892de26ec tip
255 255 hook talking
256 256 now try to read something: ''
257 257
258 258 Clean hook cached version
259 259 $ rm hook.py*
260 260 $ rm -Rf __pycache__
261 261
262 262 $ echo a >> a
263 263 >>> import os
264 264 >>> from hgclient import check, readchannel, runcommand
265 265 >>> @check
266 266 ... def outsidechanges(server):
267 267 ... readchannel(server)
268 ... runcommand(server, ['status'])
268 ... runcommand(server, [b'status'])
269 269 ... os.system('hg ci -Am2')
270 ... runcommand(server, ['tip'])
271 ... runcommand(server, ['status'])
270 ... runcommand(server, [b'tip'])
271 ... runcommand(server, [b'status'])
272 272 *** runcommand status
273 273 M a
274 274 *** runcommand tip
275 275 changeset: 1:d3a0a68be6de
276 276 tag: tip
277 277 user: test
278 278 date: Thu Jan 01 00:00:00 1970 +0000
279 279 summary: 2
280 280
281 281 *** runcommand status
282 282
283 283 >>> import os
284 284 >>> from hgclient import check, readchannel, runcommand
285 285 >>> @check
286 286 ... def bookmarks(server):
287 287 ... readchannel(server)
288 ... runcommand(server, ['bookmarks'])
288 ... runcommand(server, [b'bookmarks'])
289 289 ...
290 290 ... # changes .hg/bookmarks
291 291 ... os.system('hg bookmark -i bm1')
292 292 ... os.system('hg bookmark -i bm2')
293 ... runcommand(server, ['bookmarks'])
293 ... runcommand(server, [b'bookmarks'])
294 294 ...
295 295 ... # changes .hg/bookmarks.current
296 296 ... os.system('hg upd bm1 -q')
297 ... runcommand(server, ['bookmarks'])
297 ... runcommand(server, [b'bookmarks'])
298 298 ...
299 ... runcommand(server, ['bookmarks', 'bm3'])
299 ... runcommand(server, [b'bookmarks', b'bm3'])
300 300 ... f = open('a', 'ab')
301 ... f.write('a\n') and None
301 ... f.write(b'a\n') and None
302 302 ... f.close()
303 ... runcommand(server, ['commit', '-Amm'])
304 ... runcommand(server, ['bookmarks'])
305 ... print('')
303 ... runcommand(server, [b'commit', b'-Amm'])
304 ... runcommand(server, [b'bookmarks'])
305 ... print(b'')
306 306 *** runcommand bookmarks
307 307 no bookmarks set
308 308 *** runcommand bookmarks
309 309 bm1 1:d3a0a68be6de
310 310 bm2 1:d3a0a68be6de
311 311 *** runcommand bookmarks
312 312 * bm1 1:d3a0a68be6de
313 313 bm2 1:d3a0a68be6de
314 314 *** runcommand bookmarks bm3
315 315 *** runcommand commit -Amm
316 316 *** runcommand bookmarks
317 317 bm1 1:d3a0a68be6de
318 318 bm2 1:d3a0a68be6de
319 319 * bm3 2:aef17e88f5f0
320 320
321 321
322 322 >>> import os
323 323 >>> from hgclient import check, readchannel, runcommand
324 324 >>> @check
325 325 ... def tagscache(server):
326 326 ... readchannel(server)
327 ... runcommand(server, ['id', '-t', '-r', '0'])
327 ... runcommand(server, [b'id', b'-t', b'-r', b'0'])
328 328 ... os.system('hg tag -r 0 foo')
329 ... runcommand(server, ['id', '-t', '-r', '0'])
329 ... runcommand(server, [b'id', b'-t', b'-r', b'0'])
330 330 *** runcommand id -t -r 0
331 331
332 332 *** runcommand id -t -r 0
333 333 foo
334 334
335 335 >>> import os
336 336 >>> from hgclient import check, readchannel, runcommand
337 337 >>> @check
338 338 ... def setphase(server):
339 339 ... readchannel(server)
340 ... runcommand(server, ['phase', '-r', '.'])
340 ... runcommand(server, [b'phase', b'-r', b'.'])
341 341 ... os.system('hg phase -r . -p')
342 ... runcommand(server, ['phase', '-r', '.'])
342 ... runcommand(server, [b'phase', b'-r', b'.'])
343 343 *** runcommand phase -r .
344 344 3: draft
345 345 *** runcommand phase -r .
346 346 3: public
347 347
348 348 $ echo a >> a
349 349 >>> from hgclient import check, readchannel, runcommand
350 350 >>> @check
351 351 ... def rollback(server):
352 352 ... readchannel(server)
353 ... runcommand(server, ['phase', '-r', '.', '-p'])
354 ... runcommand(server, ['commit', '-Am.'])
355 ... runcommand(server, ['rollback'])
356 ... runcommand(server, ['phase', '-r', '.'])
357 ... print('')
353 ... runcommand(server, [b'phase', b'-r', b'.', b'-p'])
354 ... runcommand(server, [b'commit', b'-Am.'])
355 ... runcommand(server, [b'rollback'])
356 ... runcommand(server, [b'phase', b'-r', b'.'])
357 ... print(b'')
358 358 *** runcommand phase -r . -p
359 359 no phases changed
360 360 *** runcommand commit -Am.
361 361 *** runcommand rollback
362 362 repository tip rolled back to revision 3 (undo commit)
363 363 working directory now based on revision 3
364 364 *** runcommand phase -r .
365 365 3: public
366 366
367 367
368 368 >>> import os
369 369 >>> from hgclient import check, readchannel, runcommand
370 370 >>> @check
371 371 ... def branch(server):
372 372 ... readchannel(server)
373 ... runcommand(server, ['branch'])
373 ... runcommand(server, [b'branch'])
374 374 ... os.system('hg branch foo')
375 ... runcommand(server, ['branch'])
375 ... runcommand(server, [b'branch'])
376 376 ... os.system('hg branch default')
377 377 *** runcommand branch
378 378 default
379 379 marked working directory as branch foo
380 380 (branches are permanent and global, did you want a bookmark?)
381 381 *** runcommand branch
382 382 foo
383 383 marked working directory as branch default
384 384 (branches are permanent and global, did you want a bookmark?)
385 385
386 386 $ touch .hgignore
387 387 >>> import os
388 388 >>> from hgclient import check, readchannel, runcommand
389 389 >>> @check
390 390 ... def hgignore(server):
391 391 ... readchannel(server)
392 ... runcommand(server, ['commit', '-Am.'])
392 ... runcommand(server, [b'commit', b'-Am.'])
393 393 ... f = open('ignored-file', 'ab')
394 ... f.write('') and None
394 ... f.write(b'') and None
395 395 ... f.close()
396 396 ... f = open('.hgignore', 'ab')
397 ... f.write('ignored-file')
397 ... f.write(b'ignored-file')
398 398 ... f.close()
399 ... runcommand(server, ['status', '-i', '-u'])
400 ... print('')
399 ... runcommand(server, [b'status', b'-i', b'-u'])
400 ... print(b'')
401 401 *** runcommand commit -Am.
402 402 adding .hgignore
403 403 *** runcommand status -i -u
404 404 I ignored-file
405 405
406 406
407 407 cache of non-public revisions should be invalidated on repository change
408 408 (issue4855):
409 409
410 410 >>> import os
411 411 >>> from hgclient import check, readchannel, runcommand
412 412 >>> @check
413 413 ... def phasesetscacheaftercommit(server):
414 414 ... readchannel(server)
415 415 ... # load _phasecache._phaserevs and _phasesets
416 ... runcommand(server, ['log', '-qr', 'draft()'])
416 ... runcommand(server, [b'log', b'-qr', b'draft()'])
417 417 ... # create draft commits by another process
418 418 ... for i in range(5, 7):
419 419 ... f = open('a', 'ab')
420 420 ... f.seek(0, os.SEEK_END)
421 ... f.write('a\n') and None
421 ... f.write(b'a\n') and None
422 422 ... f.close()
423 423 ... os.system('hg commit -Aqm%d' % i)
424 424 ... # new commits should be listed as draft revisions
425 ... runcommand(server, ['log', '-qr', 'draft()'])
426 ... print('')
425 ... runcommand(server, [b'log', b'-qr', b'draft()'])
426 ... print(b'')
427 427 *** runcommand log -qr draft()
428 428 4:7966c8e3734d
429 429 *** runcommand log -qr draft()
430 430 4:7966c8e3734d
431 431 5:41f6602d1c4f
432 432 6:10501e202c35
433 433
434 434
435 435 >>> import os
436 436 >>> from hgclient import check, readchannel, runcommand
437 437 >>> @check
438 438 ... def phasesetscacheafterstrip(server):
439 439 ... readchannel(server)
440 440 ... # load _phasecache._phaserevs and _phasesets
441 ... runcommand(server, ['log', '-qr', 'draft()'])
441 ... runcommand(server, [b'log', b'-qr', b'draft()'])
442 442 ... # strip cached revisions by another process
443 443 ... os.system('hg --config extensions.strip= strip -q 5')
444 444 ... # shouldn't abort by "unknown revision '6'"
445 ... runcommand(server, ['log', '-qr', 'draft()'])
446 ... print('')
445 ... runcommand(server, [b'log', b'-qr', b'draft()'])
446 ... print(b'')
447 447 *** runcommand log -qr draft()
448 448 4:7966c8e3734d
449 449 5:41f6602d1c4f
450 450 6:10501e202c35
451 451 *** runcommand log -qr draft()
452 452 4:7966c8e3734d
453 453
454 454
455 455 cache of phase roots should be invalidated on strip (issue3827):
456 456
457 457 >>> import os
458 458 >>> from hgclient import check, readchannel, runcommand, sep
459 459 >>> @check
460 460 ... def phasecacheafterstrip(server):
461 461 ... readchannel(server)
462 462 ...
463 463 ... # create new head, 5:731265503d86
464 ... runcommand(server, ['update', '-C', '0'])
464 ... runcommand(server, [b'update', b'-C', b'0'])
465 465 ... f = open('a', 'ab')
466 ... f.write('a\n') and None
466 ... f.write(b'a\n') and None
467 467 ... f.close()
468 ... runcommand(server, ['commit', '-Am.', 'a'])
469 ... runcommand(server, ['log', '-Gq'])
468 ... runcommand(server, [b'commit', b'-Am.', b'a'])
469 ... runcommand(server, [b'log', b'-Gq'])
470 470 ...
471 471 ... # make it public; draft marker moves to 4:7966c8e3734d
472 ... runcommand(server, ['phase', '-p', '.'])
472 ... runcommand(server, [b'phase', b'-p', b'.'])
473 473 ... # load _phasecache.phaseroots
474 ... runcommand(server, ['phase', '.'], outfilter=sep)
474 ... runcommand(server, [b'phase', b'.'], outfilter=sep)
475 475 ...
476 476 ... # strip 1::4 outside server
477 477 ... os.system('hg -q --config extensions.mq= strip 1')
478 478 ...
479 479 ... # shouldn't raise "7966c8e3734d: no node!"
480 ... runcommand(server, ['branches'])
480 ... runcommand(server, [b'branches'])
481 481 *** runcommand update -C 0
482 482 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
483 483 (leaving bookmark bm3)
484 484 *** runcommand commit -Am. a
485 485 created new head
486 486 *** runcommand log -Gq
487 487 @ 5:731265503d86
488 488 |
489 489 | o 4:7966c8e3734d
490 490 | |
491 491 | o 3:b9b85890c400
492 492 | |
493 493 | o 2:aef17e88f5f0
494 494 | |
495 495 | o 1:d3a0a68be6de
496 496 |/
497 497 o 0:eff892de26ec
498 498
499 499 *** runcommand phase -p .
500 500 *** runcommand phase .
501 501 5: public
502 502 *** runcommand branches
503 503 default 1:731265503d86
504 504
505 505 in-memory cache must be reloaded if transaction is aborted. otherwise
506 506 changelog and manifest would have invalid node:
507 507
508 508 $ echo a >> a
509 509 >>> from hgclient import check, readchannel, runcommand
510 510 >>> @check
511 511 ... def txabort(server):
512 512 ... readchannel(server)
513 ... runcommand(server, ['commit', '--config', 'hooks.pretxncommit=false',
514 ... '-mfoo'])
515 ... runcommand(server, ['verify'])
513 ... runcommand(server, [b'commit', b'--config', b'hooks.pretxncommit=false',
514 ... b'-mfoo'])
515 ... runcommand(server, [b'verify'])
516 516 *** runcommand commit --config hooks.pretxncommit=false -mfoo
517 517 transaction abort!
518 518 rollback completed
519 519 abort: pretxncommit hook exited with status 1
520 520 [255]
521 521 *** runcommand verify
522 522 checking changesets
523 523 checking manifests
524 524 crosschecking files in changesets and manifests
525 525 checking files
526 526 checked 2 changesets with 2 changes to 1 files
527 527 $ hg revert --no-backup -aq
528 528
529 529 $ cat >> .hg/hgrc << EOF
530 530 > [experimental]
531 531 > evolution.createmarkers=True
532 532 > EOF
533 533
534 534 >>> import os
535 535 >>> from hgclient import check, readchannel, runcommand
536 536 >>> @check
537 537 ... def obsolete(server):
538 538 ... readchannel(server)
539 539 ...
540 ... runcommand(server, ['up', 'null'])
541 ... runcommand(server, ['phase', '-df', 'tip'])
540 ... runcommand(server, [b'up', b'null'])
541 ... runcommand(server, [b'phase', b'-df', b'tip'])
542 542 ... cmd = 'hg debugobsolete `hg log -r tip --template {node}`'
543 543 ... if os.name == 'nt':
544 544 ... cmd = 'sh -c "%s"' % cmd # run in sh, not cmd.exe
545 545 ... os.system(cmd)
546 ... runcommand(server, ['log', '--hidden'])
547 ... runcommand(server, ['log'])
546 ... runcommand(server, [b'log', b'--hidden'])
547 ... runcommand(server, [b'log'])
548 548 *** runcommand up null
549 549 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
550 550 *** runcommand phase -df tip
551 551 obsoleted 1 changesets
552 552 *** runcommand log --hidden
553 553 changeset: 1:731265503d86
554 554 tag: tip
555 555 user: test
556 556 date: Thu Jan 01 00:00:00 1970 +0000
557 557 obsolete: pruned
558 558 summary: .
559 559
560 560 changeset: 0:eff892de26ec
561 561 bookmark: bm1
562 562 bookmark: bm2
563 563 bookmark: bm3
564 564 user: test
565 565 date: Thu Jan 01 00:00:00 1970 +0000
566 566 summary: 1
567 567
568 568 *** runcommand log
569 569 changeset: 0:eff892de26ec
570 570 bookmark: bm1
571 571 bookmark: bm2
572 572 bookmark: bm3
573 573 tag: tip
574 574 user: test
575 575 date: Thu Jan 01 00:00:00 1970 +0000
576 576 summary: 1
577 577
578 578
579 579 $ cat <<EOF >> .hg/hgrc
580 580 > [extensions]
581 581 > mq =
582 582 > EOF
583 583
584 584 >>> import os
585 585 >>> from hgclient import check, readchannel, runcommand
586 586 >>> @check
587 587 ... def mqoutsidechanges(server):
588 588 ... readchannel(server)
589 589 ...
590 590 ... # load repo.mq
591 ... runcommand(server, ['qapplied'])
591 ... runcommand(server, [b'qapplied'])
592 592 ... os.system('hg qnew 0.diff')
593 593 ... # repo.mq should be invalidated
594 ... runcommand(server, ['qapplied'])
594 ... runcommand(server, [b'qapplied'])
595 595 ...
596 ... runcommand(server, ['qpop', '--all'])
596 ... runcommand(server, [b'qpop', b'--all'])
597 597 ... os.system('hg qqueue --create foo')
598 598 ... # repo.mq should be recreated to point to new queue
599 ... runcommand(server, ['qqueue', '--active'])
599 ... runcommand(server, [b'qqueue', b'--active'])
600 600 *** runcommand qapplied
601 601 *** runcommand qapplied
602 602 0.diff
603 603 *** runcommand qpop --all
604 604 popping 0.diff
605 605 patch queue now empty
606 606 *** runcommand qqueue --active
607 607 foo
608 608
609 609 $ cat <<EOF > dbgui.py
610 610 > import os
611 611 > import sys
612 612 > from mercurial import commands, registrar
613 613 > cmdtable = {}
614 614 > command = registrar.command(cmdtable)
615 615 > @command(b"debuggetpass", norepo=True)
616 616 > def debuggetpass(ui):
617 > ui.write("%s\\n" % ui.getpass())
617 > ui.write(b"%s\\n" % ui.getpass())
618 618 > @command(b"debugprompt", norepo=True)
619 619 > def debugprompt(ui):
620 > ui.write("%s\\n" % ui.prompt("prompt:"))
620 > ui.write(b"%s\\n" % ui.prompt(b"prompt:"))
621 621 > @command(b"debugreadstdin", norepo=True)
622 622 > def debugreadstdin(ui):
623 > ui.write("read: %r\n" % sys.stdin.read(1))
623 > ui.write(b"read: %r\n" % sys.stdin.read(1))
624 624 > @command(b"debugwritestdout", norepo=True)
625 625 > def debugwritestdout(ui):
626 > os.write(1, "low-level stdout fd and\n")
626 > os.write(1, b"low-level stdout fd and\n")
627 627 > sys.stdout.write("stdout should be redirected to stderr\n")
628 628 > sys.stdout.flush()
629 629 > EOF
630 630 $ cat <<EOF >> .hg/hgrc
631 631 > [extensions]
632 632 > dbgui = dbgui.py
633 633 > EOF
634 634
635 635 >>> from hgclient import check, readchannel, runcommand, stringio
636 636 >>> @check
637 637 ... def getpass(server):
638 638 ... readchannel(server)
639 ... runcommand(server, ['debuggetpass', '--config',
640 ... 'ui.interactive=True'],
641 ... input=stringio('1234\n'))
642 ... runcommand(server, ['debuggetpass', '--config',
643 ... 'ui.interactive=True'],
644 ... input=stringio('\n'))
645 ... runcommand(server, ['debuggetpass', '--config',
646 ... 'ui.interactive=True'],
647 ... input=stringio(''))
648 ... runcommand(server, ['debugprompt', '--config',
649 ... 'ui.interactive=True'],
650 ... input=stringio('5678\n'))
651 ... runcommand(server, ['debugreadstdin'])
652 ... runcommand(server, ['debugwritestdout'])
639 ... runcommand(server, [b'debuggetpass', b'--config',
640 ... b'ui.interactive=True'],
641 ... input=stringio(b'1234\n'))
642 ... runcommand(server, [b'debuggetpass', b'--config',
643 ... b'ui.interactive=True'],
644 ... input=stringio(b'\n'))
645 ... runcommand(server, [b'debuggetpass', b'--config',
646 ... b'ui.interactive=True'],
647 ... input=stringio(b''))
648 ... runcommand(server, [b'debugprompt', b'--config',
649 ... b'ui.interactive=True'],
650 ... input=stringio(b'5678\n'))
651 ... runcommand(server, [b'debugreadstdin'])
652 ... runcommand(server, [b'debugwritestdout'])
653 653 *** runcommand debuggetpass --config ui.interactive=True
654 654 password: 1234
655 655 *** runcommand debuggetpass --config ui.interactive=True
656 656 password:
657 657 *** runcommand debuggetpass --config ui.interactive=True
658 658 password: abort: response expected
659 659 [255]
660 660 *** runcommand debugprompt --config ui.interactive=True
661 661 prompt: 5678
662 662 *** runcommand debugreadstdin
663 663 read: ''
664 664 *** runcommand debugwritestdout
665 665 low-level stdout fd and
666 666 stdout should be redirected to stderr
667 667
668 668
669 669 run commandserver in commandserver, which is silly but should work:
670 670
671 671 >>> from __future__ import print_function
672 672 >>> from hgclient import check, readchannel, runcommand, stringio
673 673 >>> @check
674 674 ... def nested(server):
675 ... print('%c, %r' % readchannel(server))
675 ... print(b'%c, %r' % readchannel(server))
676 676 ... class nestedserver(object):
677 ... stdin = stringio('getencoding\n')
677 ... stdin = stringio(b'getencoding\n')
678 678 ... stdout = stringio()
679 ... runcommand(server, ['serve', '--cmdserver', 'pipe'],
679 ... runcommand(server, [b'serve', b'--cmdserver', b'pipe'],
680 680 ... output=nestedserver.stdout, input=nestedserver.stdin)
681 681 ... nestedserver.stdout.seek(0)
682 ... print('%c, %r' % readchannel(nestedserver)) # hello
683 ... print('%c, %r' % readchannel(nestedserver)) # getencoding
682 ... print(b'%c, %r' % readchannel(nestedserver)) # hello
683 ... print(b'%c, %r' % readchannel(nestedserver)) # getencoding
684 684 o, 'capabilities: getencoding runcommand\nencoding: *\npid: *' (glob)
685 685 *** runcommand serve --cmdserver pipe
686 686 o, 'capabilities: getencoding runcommand\nencoding: *\npid: *' (glob)
687 687 r, '*' (glob)
688 688
689 689
690 690 start without repository:
691 691
692 692 $ cd ..
693 693
694 694 >>> from __future__ import print_function
695 695 >>> from hgclient import check, readchannel, runcommand
696 696 >>> @check
697 697 ... def hellomessage(server):
698 698 ... ch, data = readchannel(server)
699 ... print('%c, %r' % (ch, data))
699 ... print(b'%c, %r' % (ch, data))
700 700 ... # run an arbitrary command to make sure the next thing the server
701 701 ... # sends isn't part of the hello message
702 ... runcommand(server, ['id'])
702 ... runcommand(server, [b'id'])
703 703 o, 'capabilities: getencoding runcommand\nencoding: *\npid: *' (glob)
704 704 *** runcommand id
705 705 abort: there is no Mercurial repository here (.hg not found)
706 706 [255]
707 707
708 708 >>> from hgclient import check, readchannel, runcommand
709 709 >>> @check
710 710 ... def startwithoutrepo(server):
711 711 ... readchannel(server)
712 ... runcommand(server, ['init', 'repo2'])
713 ... runcommand(server, ['id', '-R', 'repo2'])
712 ... runcommand(server, [b'init', b'repo2'])
713 ... runcommand(server, [b'id', b'-R', b'repo2'])
714 714 *** runcommand init repo2
715 715 *** runcommand id -R repo2
716 716 000000000000 tip
717 717
718 718
719 719 don't fall back to cwd if invalid -R path is specified (issue4805):
720 720
721 721 $ cd repo
722 722 $ hg serve --cmdserver pipe -R ../nonexistent
723 723 abort: repository ../nonexistent not found!
724 724 [255]
725 725 $ cd ..
726 726
727 727
728 728 unix domain socket:
729 729
730 730 $ cd repo
731 731 $ hg update -q
732 732
733 733 #if unix-socket unix-permissions
734 734
735 735 >>> from __future__ import print_function
736 736 >>> from hgclient import check, readchannel, runcommand, stringio, unixserver
737 >>> server = unixserver('.hg/server.sock', '.hg/server.log')
737 >>> server = unixserver(b'.hg/server.sock', b'.hg/server.log')
738 738 >>> def hellomessage(conn):
739 739 ... ch, data = readchannel(conn)
740 ... print('%c, %r' % (ch, data))
741 ... runcommand(conn, ['id'])
740 ... print(b'%c, %r' % (ch, data))
741 ... runcommand(conn, [b'id'])
742 742 >>> check(hellomessage, server.connect)
743 743 o, 'capabilities: getencoding runcommand\nencoding: *\npid: *' (glob)
744 744 *** runcommand id
745 745 eff892de26ec tip bm1/bm2/bm3
746 746 >>> def unknowncommand(conn):
747 747 ... readchannel(conn)
748 ... conn.stdin.write('unknowncommand\n')
748 ... conn.stdin.write(b'unknowncommand\n')
749 749 >>> check(unknowncommand, server.connect) # error sent to server.log
750 750 >>> def serverinput(conn):
751 751 ... readchannel(conn)
752 ... patch = """
752 ... patch = b"""
753 753 ... # HG changeset patch
754 754 ... # User test
755 755 ... # Date 0 0
756 756 ... 2
757 757 ...
758 758 ... diff -r eff892de26ec -r 1ed24be7e7a0 a
759 759 ... --- a/a
760 760 ... +++ b/a
761 761 ... @@ -1,1 +1,2 @@
762 762 ... 1
763 763 ... +2
764 764 ... """
765 ... runcommand(conn, ['import', '-'], input=stringio(patch))
766 ... runcommand(conn, ['log', '-rtip', '-q'])
765 ... runcommand(conn, [b'import', b'-'], input=stringio(patch))
766 ... runcommand(conn, [b'log', b'-rtip', b'-q'])
767 767 >>> check(serverinput, server.connect)
768 768 *** runcommand import -
769 769 applying patch from stdin
770 770 *** runcommand log -rtip -q
771 771 2:1ed24be7e7a0
772 772 >>> server.shutdown()
773 773
774 774 $ cat .hg/server.log
775 775 listening at .hg/server.sock
776 776 abort: unknown command unknowncommand
777 777 killed!
778 778 $ rm .hg/server.log
779 779
780 780 if server crashed before hello, traceback will be sent to 'e' channel as
781 781 last ditch:
782 782
783 783 $ cat <<EOF >> .hg/hgrc
784 784 > [cmdserver]
785 785 > log = inexistent/path.log
786 786 > EOF
787 787 >>> from __future__ import print_function
788 788 >>> from hgclient import check, readchannel, unixserver
789 >>> server = unixserver('.hg/server.sock', '.hg/server.log')
789 >>> server = unixserver(b'.hg/server.sock', b'.hg/server.log')
790 790 >>> def earlycrash(conn):
791 791 ... while True:
792 792 ... try:
793 793 ... ch, data = readchannel(conn)
794 ... if not data.startswith(' '):
795 ... print('%c, %r' % (ch, data))
794 ... if not data.startswith(b' '):
795 ... print(b'%c, %r' % (ch, data))
796 796 ... except EOFError:
797 797 ... break
798 798 >>> check(earlycrash, server.connect)
799 799 e, 'Traceback (most recent call last):\n'
800 800 e, "IOError: *" (glob)
801 801 >>> server.shutdown()
802 802
803 803 $ cat .hg/server.log | grep -v '^ '
804 804 listening at .hg/server.sock
805 805 Traceback (most recent call last):
806 806 IOError: * (glob)
807 807 killed!
808 808 #endif
809 809 #if no-unix-socket
810 810
811 811 $ hg serve --cmdserver unix -a .hg/server.sock
812 812 abort: unsupported platform
813 813 [255]
814 814
815 815 #endif
816 816
817 817 $ cd ..
818 818
819 819 Test that accessing to invalid changelog cache is avoided at
820 820 subsequent operations even if repo object is reused even after failure
821 821 of transaction (see 0a7610758c42 also)
822 822
823 823 "hg log" after failure of transaction is needed to detect invalid
824 824 cache in repoview: this can't detect by "hg verify" only.
825 825
826 826 Combination of "finalization" and "empty-ness of changelog" (2 x 2 =
827 827 4) are tested, because '00changelog.i' are differently changed in each
828 828 cases.
829 829
830 830 $ cat > $TESTTMP/failafterfinalize.py <<EOF
831 831 > # extension to abort transaction after finalization forcibly
832 832 > from mercurial import commands, error, extensions, lock as lockmod
833 833 > from mercurial import registrar
834 834 > cmdtable = {}
835 835 > command = registrar.command(cmdtable)
836 836 > configtable = {}
837 837 > configitem = registrar.configitem(configtable)
838 > configitem('failafterfinalize', 'fail',
838 > configitem(b'failafterfinalize', b'fail',
839 839 > default=None,
840 840 > )
841 841 > def fail(tr):
842 > raise error.Abort('fail after finalization')
842 > raise error.Abort(b'fail after finalization')
843 843 > def reposetup(ui, repo):
844 844 > class failrepo(repo.__class__):
845 845 > def commitctx(self, ctx, error=False):
846 > if self.ui.configbool('failafterfinalize', 'fail'):
846 > if self.ui.configbool(b'failafterfinalize', b'fail'):
847 847 > # 'sorted()' by ASCII code on category names causes
848 848 > # invoking 'fail' after finalization of changelog
849 849 > # using "'cl-%i' % id(self)" as category name
850 > self.currenttransaction().addfinalize('zzzzzzzz', fail)
850 > self.currenttransaction().addfinalize(b'zzzzzzzz', fail)
851 851 > return super(failrepo, self).commitctx(ctx, error)
852 852 > repo.__class__ = failrepo
853 853 > EOF
854 854
855 855 $ hg init repo3
856 856 $ cd repo3
857 857
858 858 $ cat <<EOF >> $HGRCPATH
859 859 > [ui]
860 860 > logtemplate = {rev} {desc|firstline} ({files})\n
861 861 >
862 862 > [extensions]
863 863 > failafterfinalize = $TESTTMP/failafterfinalize.py
864 864 > EOF
865 865
866 866 - test failure with "empty changelog"
867 867
868 868 $ echo foo > foo
869 869 $ hg add foo
870 870
871 871 (failure before finalization)
872 872
873 873 >>> from hgclient import check, readchannel, runcommand
874 874 >>> @check
875 875 ... def abort(server):
876 876 ... readchannel(server)
877 ... runcommand(server, ['commit',
878 ... '--config', 'hooks.pretxncommit=false',
879 ... '-mfoo'])
880 ... runcommand(server, ['log'])
881 ... runcommand(server, ['verify', '-q'])
877 ... runcommand(server, [b'commit',
878 ... b'--config', b'hooks.pretxncommit=false',
879 ... b'-mfoo'])
880 ... runcommand(server, [b'log'])
881 ... runcommand(server, [b'verify', b'-q'])
882 882 *** runcommand commit --config hooks.pretxncommit=false -mfoo
883 883 transaction abort!
884 884 rollback completed
885 885 abort: pretxncommit hook exited with status 1
886 886 [255]
887 887 *** runcommand log
888 888 *** runcommand verify -q
889 889
890 890 (failure after finalization)
891 891
892 892 >>> from hgclient import check, readchannel, runcommand
893 893 >>> @check
894 894 ... def abort(server):
895 895 ... readchannel(server)
896 ... runcommand(server, ['commit',
897 ... '--config', 'failafterfinalize.fail=true',
898 ... '-mfoo'])
899 ... runcommand(server, ['log'])
900 ... runcommand(server, ['verify', '-q'])
896 ... runcommand(server, [b'commit',
897 ... b'--config', b'failafterfinalize.fail=true',
898 ... b'-mfoo'])
899 ... runcommand(server, [b'log'])
900 ... runcommand(server, [b'verify', b'-q'])
901 901 *** runcommand commit --config failafterfinalize.fail=true -mfoo
902 902 transaction abort!
903 903 rollback completed
904 904 abort: fail after finalization
905 905 [255]
906 906 *** runcommand log
907 907 *** runcommand verify -q
908 908
909 909 - test failure with "not-empty changelog"
910 910
911 911 $ echo bar > bar
912 912 $ hg add bar
913 913 $ hg commit -mbar bar
914 914
915 915 (failure before finalization)
916 916
917 917 >>> from hgclient import check, readchannel, runcommand
918 918 >>> @check
919 919 ... def abort(server):
920 920 ... readchannel(server)
921 ... runcommand(server, ['commit',
922 ... '--config', 'hooks.pretxncommit=false',
923 ... '-mfoo', 'foo'])
924 ... runcommand(server, ['log'])
925 ... runcommand(server, ['verify', '-q'])
921 ... runcommand(server, [b'commit',
922 ... b'--config', b'hooks.pretxncommit=false',
923 ... b'-mfoo', b'foo'])
924 ... runcommand(server, [b'log'])
925 ... runcommand(server, [b'verify', b'-q'])
926 926 *** runcommand commit --config hooks.pretxncommit=false -mfoo foo
927 927 transaction abort!
928 928 rollback completed
929 929 abort: pretxncommit hook exited with status 1
930 930 [255]
931 931 *** runcommand log
932 932 0 bar (bar)
933 933 *** runcommand verify -q
934 934
935 935 (failure after finalization)
936 936
937 937 >>> from hgclient import check, readchannel, runcommand
938 938 >>> @check
939 939 ... def abort(server):
940 940 ... readchannel(server)
941 ... runcommand(server, ['commit',
942 ... '--config', 'failafterfinalize.fail=true',
943 ... '-mfoo', 'foo'])
944 ... runcommand(server, ['log'])
945 ... runcommand(server, ['verify', '-q'])
941 ... runcommand(server, [b'commit',
942 ... b'--config', b'failafterfinalize.fail=true',
943 ... b'-mfoo', b'foo'])
944 ... runcommand(server, [b'log'])
945 ... runcommand(server, [b'verify', b'-q'])
946 946 *** runcommand commit --config failafterfinalize.fail=true -mfoo foo
947 947 transaction abort!
948 948 rollback completed
949 949 abort: fail after finalization
950 950 [255]
951 951 *** runcommand log
952 952 0 bar (bar)
953 953 *** runcommand verify -q
954 954
955 955 $ cd ..
956 956
957 957 Test symlink traversal over cached audited paths:
958 958 -------------------------------------------------
959 959
960 960 #if symlink
961 961
962 962 set up symlink hell
963 963
964 964 $ mkdir merge-symlink-out
965 965 $ hg init merge-symlink
966 966 $ cd merge-symlink
967 967 $ touch base
968 968 $ hg commit -qAm base
969 969 $ ln -s ../merge-symlink-out a
970 970 $ hg commit -qAm 'symlink a -> ../merge-symlink-out'
971 971 $ hg up -q 0
972 972 $ mkdir a
973 973 $ touch a/poisoned
974 974 $ hg commit -qAm 'file a/poisoned'
975 975 $ hg log -G -T '{rev}: {desc}\n'
976 976 @ 2: file a/poisoned
977 977 |
978 978 | o 1: symlink a -> ../merge-symlink-out
979 979 |/
980 980 o 0: base
981 981
982 982
983 983 try trivial merge after update: cache of audited paths should be discarded,
984 984 and the merge should fail (issue5628)
985 985
986 986 $ hg up -q null
987 987 >>> from hgclient import check, readchannel, runcommand
988 988 >>> @check
989 989 ... def merge(server):
990 990 ... readchannel(server)
991 991 ... # audit a/poisoned as a good path
992 ... runcommand(server, ['up', '-qC', '2'])
993 ... runcommand(server, ['up', '-qC', '1'])
992 ... runcommand(server, [b'up', b'-qC', b'2'])
993 ... runcommand(server, [b'up', b'-qC', b'1'])
994 994 ... # here a is a symlink, so a/poisoned is bad
995 ... runcommand(server, ['merge', '2'])
995 ... runcommand(server, [b'merge', b'2'])
996 996 *** runcommand up -qC 2
997 997 *** runcommand up -qC 1
998 998 *** runcommand merge 2
999 999 abort: path 'a/poisoned' traverses symbolic link 'a'
1000 1000 [255]
1001 1001 $ ls ../merge-symlink-out
1002 1002
1003 1003 cache of repo.auditor should be discarded, so matcher would never traverse
1004 1004 symlinks:
1005 1005
1006 1006 $ hg up -qC 0
1007 1007 $ touch ../merge-symlink-out/poisoned
1008 1008 >>> from hgclient import check, readchannel, runcommand
1009 1009 >>> @check
1010 1010 ... def files(server):
1011 1011 ... readchannel(server)
1012 ... runcommand(server, ['up', '-qC', '2'])
1012 ... runcommand(server, [b'up', b'-qC', b'2'])
1013 1013 ... # audit a/poisoned as a good path
1014 ... runcommand(server, ['files', 'a/poisoned'])
1015 ... runcommand(server, ['up', '-qC', '0'])
1016 ... runcommand(server, ['up', '-qC', '1'])
1014 ... runcommand(server, [b'files', b'a/poisoned'])
1015 ... runcommand(server, [b'up', b'-qC', b'0'])
1016 ... runcommand(server, [b'up', b'-qC', b'1'])
1017 1017 ... # here 'a' is a symlink, so a/poisoned should be warned
1018 ... runcommand(server, ['files', 'a/poisoned'])
1018 ... runcommand(server, [b'files', b'a/poisoned'])
1019 1019 *** runcommand up -qC 2
1020 1020 *** runcommand files a/poisoned
1021 1021 a/poisoned
1022 1022 *** runcommand up -qC 0
1023 1023 *** runcommand up -qC 1
1024 1024 *** runcommand files a/poisoned
1025 1025 abort: path 'a/poisoned' traverses symbolic link 'a'
1026 1026 [255]
1027 1027
1028 1028 $ cd ..
1029 1029
1030 1030 #endif
General Comments 0
You need to be logged in to leave comments. Login now