##// END OF EJS Templates
test-command-template: rewrite recursion tests by using a map file...
Yuya Nishihara -
r32874:dddba6f3 default
parent child Browse files
Show More
@@ -1,4238 +1,4244 b''
1 1 $ hg init a
2 2 $ cd a
3 3 $ echo a > a
4 4 $ hg add a
5 5 $ echo line 1 > b
6 6 $ echo line 2 >> b
7 7 $ hg commit -l b -d '1000000 0' -u 'User Name <user@hostname>'
8 8
9 9 $ hg add b
10 10 $ echo other 1 > c
11 11 $ echo other 2 >> c
12 12 $ echo >> c
13 13 $ echo other 3 >> c
14 14 $ hg commit -l c -d '1100000 0' -u 'A. N. Other <other@place>'
15 15
16 16 $ hg add c
17 17 $ hg commit -m 'no person' -d '1200000 0' -u 'other@place'
18 18 $ echo c >> c
19 19 $ hg commit -m 'no user, no domain' -d '1300000 0' -u 'person'
20 20
21 21 $ echo foo > .hg/branch
22 22 $ hg commit -m 'new branch' -d '1400000 0' -u 'person'
23 23
24 24 $ hg co -q 3
25 25 $ echo other 4 >> d
26 26 $ hg add d
27 27 $ hg commit -m 'new head' -d '1500000 0' -u 'person'
28 28
29 29 $ hg merge -q foo
30 30 $ hg commit -m 'merge' -d '1500001 0' -u 'person'
31 31
32 32 Test arithmetic operators have the right precedence:
33 33
34 34 $ hg log -l 1 -T '{date(date, "%Y") + 5 * 10} {date(date, "%Y") - 2 * 3}\n'
35 35 2020 1964
36 36 $ hg log -l 1 -T '{date(date, "%Y") * 5 + 10} {date(date, "%Y") * 3 - 2}\n'
37 37 9860 5908
38 38
39 39 Test division:
40 40
41 41 $ hg debugtemplate -r0 -v '{5 / 2} {mod(5, 2)}\n'
42 42 (template
43 43 (/
44 44 ('integer', '5')
45 45 ('integer', '2'))
46 46 ('string', ' ')
47 47 (func
48 48 ('symbol', 'mod')
49 49 (list
50 50 ('integer', '5')
51 51 ('integer', '2')))
52 52 ('string', '\n'))
53 53 2 1
54 54 $ hg debugtemplate -r0 -v '{5 / -2} {mod(5, -2)}\n'
55 55 (template
56 56 (/
57 57 ('integer', '5')
58 58 (negate
59 59 ('integer', '2')))
60 60 ('string', ' ')
61 61 (func
62 62 ('symbol', 'mod')
63 63 (list
64 64 ('integer', '5')
65 65 (negate
66 66 ('integer', '2'))))
67 67 ('string', '\n'))
68 68 -3 -1
69 69 $ hg debugtemplate -r0 -v '{-5 / 2} {mod(-5, 2)}\n'
70 70 (template
71 71 (/
72 72 (negate
73 73 ('integer', '5'))
74 74 ('integer', '2'))
75 75 ('string', ' ')
76 76 (func
77 77 ('symbol', 'mod')
78 78 (list
79 79 (negate
80 80 ('integer', '5'))
81 81 ('integer', '2')))
82 82 ('string', '\n'))
83 83 -3 1
84 84 $ hg debugtemplate -r0 -v '{-5 / -2} {mod(-5, -2)}\n'
85 85 (template
86 86 (/
87 87 (negate
88 88 ('integer', '5'))
89 89 (negate
90 90 ('integer', '2')))
91 91 ('string', ' ')
92 92 (func
93 93 ('symbol', 'mod')
94 94 (list
95 95 (negate
96 96 ('integer', '5'))
97 97 (negate
98 98 ('integer', '2'))))
99 99 ('string', '\n'))
100 100 2 -1
101 101
102 102 Filters bind closer than arithmetic:
103 103
104 104 $ hg debugtemplate -r0 -v '{revset(".")|count - 1}\n'
105 105 (template
106 106 (-
107 107 (|
108 108 (func
109 109 ('symbol', 'revset')
110 110 ('string', '.'))
111 111 ('symbol', 'count'))
112 112 ('integer', '1'))
113 113 ('string', '\n'))
114 114 0
115 115
116 116 But negate binds closer still:
117 117
118 118 $ hg debugtemplate -r0 -v '{1-3|stringify}\n'
119 119 (template
120 120 (-
121 121 ('integer', '1')
122 122 (|
123 123 ('integer', '3')
124 124 ('symbol', 'stringify')))
125 125 ('string', '\n'))
126 126 hg: parse error: arithmetic only defined on integers
127 127 [255]
128 128 $ hg debugtemplate -r0 -v '{-3|stringify}\n'
129 129 (template
130 130 (|
131 131 (negate
132 132 ('integer', '3'))
133 133 ('symbol', 'stringify'))
134 134 ('string', '\n'))
135 135 -3
136 136
137 137 Keyword arguments:
138 138
139 139 $ hg debugtemplate -r0 -v '{foo=bar|baz}'
140 140 (template
141 141 (keyvalue
142 142 ('symbol', 'foo')
143 143 (|
144 144 ('symbol', 'bar')
145 145 ('symbol', 'baz'))))
146 146 hg: parse error: can't use a key-value pair in this context
147 147 [255]
148 148
149 149 $ hg debugtemplate '{pad("foo", width=10, left=true)}\n'
150 150 foo
151 151
152 152 Call function which takes named arguments by filter syntax:
153 153
154 154 $ hg debugtemplate '{" "|separate}'
155 155 $ hg debugtemplate '{("not", "an", "argument", "list")|separate}'
156 156 hg: parse error: unknown method 'list'
157 157 [255]
158 158
159 159 Second branch starting at nullrev:
160 160
161 161 $ hg update null
162 162 0 files updated, 0 files merged, 4 files removed, 0 files unresolved
163 163 $ echo second > second
164 164 $ hg add second
165 165 $ hg commit -m second -d '1000000 0' -u 'User Name <user@hostname>'
166 166 created new head
167 167
168 168 $ echo third > third
169 169 $ hg add third
170 170 $ hg mv second fourth
171 171 $ hg commit -m third -d "2020-01-01 10:01"
172 172
173 173 $ hg log --template '{join(file_copies, ",\n")}\n' -r .
174 174 fourth (second)
175 175 $ hg log -T '{file_copies % "{source} -> {name}\n"}' -r .
176 176 second -> fourth
177 177 $ hg log -T '{rev} {ifcontains("fourth", file_copies, "t", "f")}\n' -r .:7
178 178 8 t
179 179 7 f
180 180
181 181 Working-directory revision has special identifiers, though they are still
182 182 experimental:
183 183
184 184 $ hg log -r 'wdir()' -T '{rev}:{node}\n'
185 185 2147483647:ffffffffffffffffffffffffffffffffffffffff
186 186
187 187 Some keywords are invalid for working-directory revision, but they should
188 188 never cause crash:
189 189
190 190 $ hg log -r 'wdir()' -T '{manifest}\n'
191 191
192 192
193 193 Quoting for ui.logtemplate
194 194
195 195 $ hg tip --config "ui.logtemplate={rev}\n"
196 196 8
197 197 $ hg tip --config "ui.logtemplate='{rev}\n'"
198 198 8
199 199 $ hg tip --config 'ui.logtemplate="{rev}\n"'
200 200 8
201 201 $ hg tip --config 'ui.logtemplate=n{rev}\n'
202 202 n8
203 203
204 204 Make sure user/global hgrc does not affect tests
205 205
206 206 $ echo '[ui]' > .hg/hgrc
207 207 $ echo 'logtemplate =' >> .hg/hgrc
208 208 $ echo 'style =' >> .hg/hgrc
209 209
210 210 Add some simple styles to settings
211 211
212 212 $ echo '[templates]' >> .hg/hgrc
213 213 $ printf 'simple = "{rev}\\n"\n' >> .hg/hgrc
214 214 $ printf 'simple2 = {rev}\\n\n' >> .hg/hgrc
215 215
216 216 $ hg log -l1 -Tsimple
217 217 8
218 218 $ hg log -l1 -Tsimple2
219 219 8
220 220
221 221 Test templates and style maps in files:
222 222
223 223 $ echo "{rev}" > tmpl
224 224 $ hg log -l1 -T./tmpl
225 225 8
226 226 $ hg log -l1 -Tblah/blah
227 227 blah/blah (no-eol)
228 228
229 229 $ printf 'changeset = "{rev}\\n"\n' > map-simple
230 230 $ hg log -l1 -T./map-simple
231 231 8
232 232
233 233 Test template map inheritance
234 234
235 235 $ echo "__base__ = map-cmdline.default" > map-simple
236 236 $ printf 'cset = "changeset: ***{rev}***\\n"\n' >> map-simple
237 237 $ hg log -l1 -T./map-simple
238 238 changeset: ***8***
239 239 tag: tip
240 240 user: test
241 241 date: Wed Jan 01 10:01:00 2020 +0000
242 242 summary: third
243 243
244 244
245 245 Template should precede style option
246 246
247 247 $ hg log -l1 --style default -T '{rev}\n'
248 248 8
249 249
250 250 Add a commit with empty description, to ensure that the templates
251 251 below will omit the description line.
252 252
253 253 $ echo c >> c
254 254 $ hg add c
255 255 $ hg commit -qm ' '
256 256
257 257 Default style is like normal output. Phases style should be the same
258 258 as default style, except for extra phase lines.
259 259
260 260 $ hg log > log.out
261 261 $ hg log --style default > style.out
262 262 $ cmp log.out style.out || diff -u log.out style.out
263 263 $ hg log -T phases > phases.out
264 264 $ diff -U 0 log.out phases.out | egrep -v '^---|^\+\+\+|^@@'
265 265 +phase: draft
266 266 +phase: draft
267 267 +phase: draft
268 268 +phase: draft
269 269 +phase: draft
270 270 +phase: draft
271 271 +phase: draft
272 272 +phase: draft
273 273 +phase: draft
274 274 +phase: draft
275 275
276 276 $ hg log -v > log.out
277 277 $ hg log -v --style default > style.out
278 278 $ cmp log.out style.out || diff -u log.out style.out
279 279 $ hg log -v -T phases > phases.out
280 280 $ diff -U 0 log.out phases.out | egrep -v '^---|^\+\+\+|^@@'
281 281 +phase: draft
282 282 +phase: draft
283 283 +phase: draft
284 284 +phase: draft
285 285 +phase: draft
286 286 +phase: draft
287 287 +phase: draft
288 288 +phase: draft
289 289 +phase: draft
290 290 +phase: draft
291 291
292 292 $ hg log -q > log.out
293 293 $ hg log -q --style default > style.out
294 294 $ cmp log.out style.out || diff -u log.out style.out
295 295 $ hg log -q -T phases > phases.out
296 296 $ cmp log.out phases.out || diff -u log.out phases.out
297 297
298 298 $ hg log --debug > log.out
299 299 $ hg log --debug --style default > style.out
300 300 $ cmp log.out style.out || diff -u log.out style.out
301 301 $ hg log --debug -T phases > phases.out
302 302 $ cmp log.out phases.out || diff -u log.out phases.out
303 303
304 304 Default style of working-directory revision should also be the same (but
305 305 date may change while running tests):
306 306
307 307 $ hg log -r 'wdir()' | sed 's|^date:.*|date:|' > log.out
308 308 $ hg log -r 'wdir()' --style default | sed 's|^date:.*|date:|' > style.out
309 309 $ cmp log.out style.out || diff -u log.out style.out
310 310
311 311 $ hg log -r 'wdir()' -v | sed 's|^date:.*|date:|' > log.out
312 312 $ hg log -r 'wdir()' -v --style default | sed 's|^date:.*|date:|' > style.out
313 313 $ cmp log.out style.out || diff -u log.out style.out
314 314
315 315 $ hg log -r 'wdir()' -q > log.out
316 316 $ hg log -r 'wdir()' -q --style default > style.out
317 317 $ cmp log.out style.out || diff -u log.out style.out
318 318
319 319 $ hg log -r 'wdir()' --debug | sed 's|^date:.*|date:|' > log.out
320 320 $ hg log -r 'wdir()' --debug --style default \
321 321 > | sed 's|^date:.*|date:|' > style.out
322 322 $ cmp log.out style.out || diff -u log.out style.out
323 323
324 324 Default style should also preserve color information (issue2866):
325 325
326 326 $ cp $HGRCPATH $HGRCPATH-bak
327 327 $ cat <<EOF >> $HGRCPATH
328 328 > [extensions]
329 329 > color=
330 330 > EOF
331 331
332 332 $ hg --color=debug log > log.out
333 333 $ hg --color=debug log --style default > style.out
334 334 $ cmp log.out style.out || diff -u log.out style.out
335 335 $ hg --color=debug log -T phases > phases.out
336 336 $ diff -U 0 log.out phases.out | egrep -v '^---|^\+\+\+|^@@'
337 337 +[log.phase|phase: draft]
338 338 +[log.phase|phase: draft]
339 339 +[log.phase|phase: draft]
340 340 +[log.phase|phase: draft]
341 341 +[log.phase|phase: draft]
342 342 +[log.phase|phase: draft]
343 343 +[log.phase|phase: draft]
344 344 +[log.phase|phase: draft]
345 345 +[log.phase|phase: draft]
346 346 +[log.phase|phase: draft]
347 347
348 348 $ hg --color=debug -v log > log.out
349 349 $ hg --color=debug -v log --style default > style.out
350 350 $ cmp log.out style.out || diff -u log.out style.out
351 351 $ hg --color=debug -v log -T phases > phases.out
352 352 $ diff -U 0 log.out phases.out | egrep -v '^---|^\+\+\+|^@@'
353 353 +[log.phase|phase: draft]
354 354 +[log.phase|phase: draft]
355 355 +[log.phase|phase: draft]
356 356 +[log.phase|phase: draft]
357 357 +[log.phase|phase: draft]
358 358 +[log.phase|phase: draft]
359 359 +[log.phase|phase: draft]
360 360 +[log.phase|phase: draft]
361 361 +[log.phase|phase: draft]
362 362 +[log.phase|phase: draft]
363 363
364 364 $ hg --color=debug -q log > log.out
365 365 $ hg --color=debug -q log --style default > style.out
366 366 $ cmp log.out style.out || diff -u log.out style.out
367 367 $ hg --color=debug -q log -T phases > phases.out
368 368 $ cmp log.out phases.out || diff -u log.out phases.out
369 369
370 370 $ hg --color=debug --debug log > log.out
371 371 $ hg --color=debug --debug log --style default > style.out
372 372 $ cmp log.out style.out || diff -u log.out style.out
373 373 $ hg --color=debug --debug log -T phases > phases.out
374 374 $ cmp log.out phases.out || diff -u log.out phases.out
375 375
376 376 $ mv $HGRCPATH-bak $HGRCPATH
377 377
378 378 Remove commit with empty commit message, so as to not pollute further
379 379 tests.
380 380
381 381 $ hg --config extensions.strip= strip -q .
382 382
383 383 Revision with no copies (used to print a traceback):
384 384
385 385 $ hg tip -v --template '\n'
386 386
387 387
388 388 Compact style works:
389 389
390 390 $ hg log -Tcompact
391 391 8[tip] 95c24699272e 2020-01-01 10:01 +0000 test
392 392 third
393 393
394 394 7:-1 29114dbae42b 1970-01-12 13:46 +0000 user
395 395 second
396 396
397 397 6:5,4 d41e714fe50d 1970-01-18 08:40 +0000 person
398 398 merge
399 399
400 400 5:3 13207e5a10d9 1970-01-18 08:40 +0000 person
401 401 new head
402 402
403 403 4 bbe44766e73d 1970-01-17 04:53 +0000 person
404 404 new branch
405 405
406 406 3 10e46f2dcbf4 1970-01-16 01:06 +0000 person
407 407 no user, no domain
408 408
409 409 2 97054abb4ab8 1970-01-14 21:20 +0000 other
410 410 no person
411 411
412 412 1 b608e9d1a3f0 1970-01-13 17:33 +0000 other
413 413 other 1
414 414
415 415 0 1e4e1b8f71e0 1970-01-12 13:46 +0000 user
416 416 line 1
417 417
418 418
419 419 $ hg log -v --style compact
420 420 8[tip] 95c24699272e 2020-01-01 10:01 +0000 test
421 421 third
422 422
423 423 7:-1 29114dbae42b 1970-01-12 13:46 +0000 User Name <user@hostname>
424 424 second
425 425
426 426 6:5,4 d41e714fe50d 1970-01-18 08:40 +0000 person
427 427 merge
428 428
429 429 5:3 13207e5a10d9 1970-01-18 08:40 +0000 person
430 430 new head
431 431
432 432 4 bbe44766e73d 1970-01-17 04:53 +0000 person
433 433 new branch
434 434
435 435 3 10e46f2dcbf4 1970-01-16 01:06 +0000 person
436 436 no user, no domain
437 437
438 438 2 97054abb4ab8 1970-01-14 21:20 +0000 other@place
439 439 no person
440 440
441 441 1 b608e9d1a3f0 1970-01-13 17:33 +0000 A. N. Other <other@place>
442 442 other 1
443 443 other 2
444 444
445 445 other 3
446 446
447 447 0 1e4e1b8f71e0 1970-01-12 13:46 +0000 User Name <user@hostname>
448 448 line 1
449 449 line 2
450 450
451 451
452 452 $ hg log --debug --style compact
453 453 8[tip]:7,-1 95c24699272e 2020-01-01 10:01 +0000 test
454 454 third
455 455
456 456 7:-1,-1 29114dbae42b 1970-01-12 13:46 +0000 User Name <user@hostname>
457 457 second
458 458
459 459 6:5,4 d41e714fe50d 1970-01-18 08:40 +0000 person
460 460 merge
461 461
462 462 5:3,-1 13207e5a10d9 1970-01-18 08:40 +0000 person
463 463 new head
464 464
465 465 4:3,-1 bbe44766e73d 1970-01-17 04:53 +0000 person
466 466 new branch
467 467
468 468 3:2,-1 10e46f2dcbf4 1970-01-16 01:06 +0000 person
469 469 no user, no domain
470 470
471 471 2:1,-1 97054abb4ab8 1970-01-14 21:20 +0000 other@place
472 472 no person
473 473
474 474 1:0,-1 b608e9d1a3f0 1970-01-13 17:33 +0000 A. N. Other <other@place>
475 475 other 1
476 476 other 2
477 477
478 478 other 3
479 479
480 480 0:-1,-1 1e4e1b8f71e0 1970-01-12 13:46 +0000 User Name <user@hostname>
481 481 line 1
482 482 line 2
483 483
484 484
485 485 Test xml styles:
486 486
487 487 $ hg log --style xml -r 'not all()'
488 488 <?xml version="1.0"?>
489 489 <log>
490 490 </log>
491 491
492 492 $ hg log --style xml
493 493 <?xml version="1.0"?>
494 494 <log>
495 495 <logentry revision="8" node="95c24699272ef57d062b8bccc32c878bf841784a">
496 496 <tag>tip</tag>
497 497 <author email="test">test</author>
498 498 <date>2020-01-01T10:01:00+00:00</date>
499 499 <msg xml:space="preserve">third</msg>
500 500 </logentry>
501 501 <logentry revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453">
502 502 <parent revision="-1" node="0000000000000000000000000000000000000000" />
503 503 <author email="user@hostname">User Name</author>
504 504 <date>1970-01-12T13:46:40+00:00</date>
505 505 <msg xml:space="preserve">second</msg>
506 506 </logentry>
507 507 <logentry revision="6" node="d41e714fe50d9e4a5f11b4d595d543481b5f980b">
508 508 <parent revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f" />
509 509 <parent revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74" />
510 510 <author email="person">person</author>
511 511 <date>1970-01-18T08:40:01+00:00</date>
512 512 <msg xml:space="preserve">merge</msg>
513 513 </logentry>
514 514 <logentry revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f">
515 515 <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
516 516 <author email="person">person</author>
517 517 <date>1970-01-18T08:40:00+00:00</date>
518 518 <msg xml:space="preserve">new head</msg>
519 519 </logentry>
520 520 <logentry revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74">
521 521 <branch>foo</branch>
522 522 <author email="person">person</author>
523 523 <date>1970-01-17T04:53:20+00:00</date>
524 524 <msg xml:space="preserve">new branch</msg>
525 525 </logentry>
526 526 <logentry revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47">
527 527 <author email="person">person</author>
528 528 <date>1970-01-16T01:06:40+00:00</date>
529 529 <msg xml:space="preserve">no user, no domain</msg>
530 530 </logentry>
531 531 <logentry revision="2" node="97054abb4ab824450e9164180baf491ae0078465">
532 532 <author email="other@place">other</author>
533 533 <date>1970-01-14T21:20:00+00:00</date>
534 534 <msg xml:space="preserve">no person</msg>
535 535 </logentry>
536 536 <logentry revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965">
537 537 <author email="other@place">A. N. Other</author>
538 538 <date>1970-01-13T17:33:20+00:00</date>
539 539 <msg xml:space="preserve">other 1
540 540 other 2
541 541
542 542 other 3</msg>
543 543 </logentry>
544 544 <logentry revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f">
545 545 <author email="user@hostname">User Name</author>
546 546 <date>1970-01-12T13:46:40+00:00</date>
547 547 <msg xml:space="preserve">line 1
548 548 line 2</msg>
549 549 </logentry>
550 550 </log>
551 551
552 552 $ hg log -v --style xml
553 553 <?xml version="1.0"?>
554 554 <log>
555 555 <logentry revision="8" node="95c24699272ef57d062b8bccc32c878bf841784a">
556 556 <tag>tip</tag>
557 557 <author email="test">test</author>
558 558 <date>2020-01-01T10:01:00+00:00</date>
559 559 <msg xml:space="preserve">third</msg>
560 560 <paths>
561 561 <path action="A">fourth</path>
562 562 <path action="A">third</path>
563 563 <path action="R">second</path>
564 564 </paths>
565 565 <copies>
566 566 <copy source="second">fourth</copy>
567 567 </copies>
568 568 </logentry>
569 569 <logentry revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453">
570 570 <parent revision="-1" node="0000000000000000000000000000000000000000" />
571 571 <author email="user@hostname">User Name</author>
572 572 <date>1970-01-12T13:46:40+00:00</date>
573 573 <msg xml:space="preserve">second</msg>
574 574 <paths>
575 575 <path action="A">second</path>
576 576 </paths>
577 577 </logentry>
578 578 <logentry revision="6" node="d41e714fe50d9e4a5f11b4d595d543481b5f980b">
579 579 <parent revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f" />
580 580 <parent revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74" />
581 581 <author email="person">person</author>
582 582 <date>1970-01-18T08:40:01+00:00</date>
583 583 <msg xml:space="preserve">merge</msg>
584 584 <paths>
585 585 </paths>
586 586 </logentry>
587 587 <logentry revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f">
588 588 <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
589 589 <author email="person">person</author>
590 590 <date>1970-01-18T08:40:00+00:00</date>
591 591 <msg xml:space="preserve">new head</msg>
592 592 <paths>
593 593 <path action="A">d</path>
594 594 </paths>
595 595 </logentry>
596 596 <logentry revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74">
597 597 <branch>foo</branch>
598 598 <author email="person">person</author>
599 599 <date>1970-01-17T04:53:20+00:00</date>
600 600 <msg xml:space="preserve">new branch</msg>
601 601 <paths>
602 602 </paths>
603 603 </logentry>
604 604 <logentry revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47">
605 605 <author email="person">person</author>
606 606 <date>1970-01-16T01:06:40+00:00</date>
607 607 <msg xml:space="preserve">no user, no domain</msg>
608 608 <paths>
609 609 <path action="M">c</path>
610 610 </paths>
611 611 </logentry>
612 612 <logentry revision="2" node="97054abb4ab824450e9164180baf491ae0078465">
613 613 <author email="other@place">other</author>
614 614 <date>1970-01-14T21:20:00+00:00</date>
615 615 <msg xml:space="preserve">no person</msg>
616 616 <paths>
617 617 <path action="A">c</path>
618 618 </paths>
619 619 </logentry>
620 620 <logentry revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965">
621 621 <author email="other@place">A. N. Other</author>
622 622 <date>1970-01-13T17:33:20+00:00</date>
623 623 <msg xml:space="preserve">other 1
624 624 other 2
625 625
626 626 other 3</msg>
627 627 <paths>
628 628 <path action="A">b</path>
629 629 </paths>
630 630 </logentry>
631 631 <logentry revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f">
632 632 <author email="user@hostname">User Name</author>
633 633 <date>1970-01-12T13:46:40+00:00</date>
634 634 <msg xml:space="preserve">line 1
635 635 line 2</msg>
636 636 <paths>
637 637 <path action="A">a</path>
638 638 </paths>
639 639 </logentry>
640 640 </log>
641 641
642 642 $ hg log --debug --style xml
643 643 <?xml version="1.0"?>
644 644 <log>
645 645 <logentry revision="8" node="95c24699272ef57d062b8bccc32c878bf841784a">
646 646 <tag>tip</tag>
647 647 <parent revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453" />
648 648 <parent revision="-1" node="0000000000000000000000000000000000000000" />
649 649 <author email="test">test</author>
650 650 <date>2020-01-01T10:01:00+00:00</date>
651 651 <msg xml:space="preserve">third</msg>
652 652 <paths>
653 653 <path action="A">fourth</path>
654 654 <path action="A">third</path>
655 655 <path action="R">second</path>
656 656 </paths>
657 657 <copies>
658 658 <copy source="second">fourth</copy>
659 659 </copies>
660 660 <extra key="branch">default</extra>
661 661 </logentry>
662 662 <logentry revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453">
663 663 <parent revision="-1" node="0000000000000000000000000000000000000000" />
664 664 <parent revision="-1" node="0000000000000000000000000000000000000000" />
665 665 <author email="user@hostname">User Name</author>
666 666 <date>1970-01-12T13:46:40+00:00</date>
667 667 <msg xml:space="preserve">second</msg>
668 668 <paths>
669 669 <path action="A">second</path>
670 670 </paths>
671 671 <extra key="branch">default</extra>
672 672 </logentry>
673 673 <logentry revision="6" node="d41e714fe50d9e4a5f11b4d595d543481b5f980b">
674 674 <parent revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f" />
675 675 <parent revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74" />
676 676 <author email="person">person</author>
677 677 <date>1970-01-18T08:40:01+00:00</date>
678 678 <msg xml:space="preserve">merge</msg>
679 679 <paths>
680 680 </paths>
681 681 <extra key="branch">default</extra>
682 682 </logentry>
683 683 <logentry revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f">
684 684 <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
685 685 <parent revision="-1" node="0000000000000000000000000000000000000000" />
686 686 <author email="person">person</author>
687 687 <date>1970-01-18T08:40:00+00:00</date>
688 688 <msg xml:space="preserve">new head</msg>
689 689 <paths>
690 690 <path action="A">d</path>
691 691 </paths>
692 692 <extra key="branch">default</extra>
693 693 </logentry>
694 694 <logentry revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74">
695 695 <branch>foo</branch>
696 696 <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
697 697 <parent revision="-1" node="0000000000000000000000000000000000000000" />
698 698 <author email="person">person</author>
699 699 <date>1970-01-17T04:53:20+00:00</date>
700 700 <msg xml:space="preserve">new branch</msg>
701 701 <paths>
702 702 </paths>
703 703 <extra key="branch">foo</extra>
704 704 </logentry>
705 705 <logentry revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47">
706 706 <parent revision="2" node="97054abb4ab824450e9164180baf491ae0078465" />
707 707 <parent revision="-1" node="0000000000000000000000000000000000000000" />
708 708 <author email="person">person</author>
709 709 <date>1970-01-16T01:06:40+00:00</date>
710 710 <msg xml:space="preserve">no user, no domain</msg>
711 711 <paths>
712 712 <path action="M">c</path>
713 713 </paths>
714 714 <extra key="branch">default</extra>
715 715 </logentry>
716 716 <logentry revision="2" node="97054abb4ab824450e9164180baf491ae0078465">
717 717 <parent revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965" />
718 718 <parent revision="-1" node="0000000000000000000000000000000000000000" />
719 719 <author email="other@place">other</author>
720 720 <date>1970-01-14T21:20:00+00:00</date>
721 721 <msg xml:space="preserve">no person</msg>
722 722 <paths>
723 723 <path action="A">c</path>
724 724 </paths>
725 725 <extra key="branch">default</extra>
726 726 </logentry>
727 727 <logentry revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965">
728 728 <parent revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f" />
729 729 <parent revision="-1" node="0000000000000000000000000000000000000000" />
730 730 <author email="other@place">A. N. Other</author>
731 731 <date>1970-01-13T17:33:20+00:00</date>
732 732 <msg xml:space="preserve">other 1
733 733 other 2
734 734
735 735 other 3</msg>
736 736 <paths>
737 737 <path action="A">b</path>
738 738 </paths>
739 739 <extra key="branch">default</extra>
740 740 </logentry>
741 741 <logentry revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f">
742 742 <parent revision="-1" node="0000000000000000000000000000000000000000" />
743 743 <parent revision="-1" node="0000000000000000000000000000000000000000" />
744 744 <author email="user@hostname">User Name</author>
745 745 <date>1970-01-12T13:46:40+00:00</date>
746 746 <msg xml:space="preserve">line 1
747 747 line 2</msg>
748 748 <paths>
749 749 <path action="A">a</path>
750 750 </paths>
751 751 <extra key="branch">default</extra>
752 752 </logentry>
753 753 </log>
754 754
755 755
756 756 Test JSON style:
757 757
758 758 $ hg log -k nosuch -Tjson
759 759 []
760 760
761 761 $ hg log -qr . -Tjson
762 762 [
763 763 {
764 764 "rev": 8,
765 765 "node": "95c24699272ef57d062b8bccc32c878bf841784a"
766 766 }
767 767 ]
768 768
769 769 $ hg log -vpr . -Tjson --stat
770 770 [
771 771 {
772 772 "rev": 8,
773 773 "node": "95c24699272ef57d062b8bccc32c878bf841784a",
774 774 "branch": "default",
775 775 "phase": "draft",
776 776 "user": "test",
777 777 "date": [1577872860, 0],
778 778 "desc": "third",
779 779 "bookmarks": [],
780 780 "tags": ["tip"],
781 781 "parents": ["29114dbae42b9f078cf2714dbe3a86bba8ec7453"],
782 782 "files": ["fourth", "second", "third"],
783 783 "diffstat": " fourth | 1 +\n second | 1 -\n third | 1 +\n 3 files changed, 2 insertions(+), 1 deletions(-)\n",
784 784 "diff": "diff -r 29114dbae42b -r 95c24699272e fourth\n--- /dev/null\tThu Jan 01 00:00:00 1970 +0000\n+++ b/fourth\tWed Jan 01 10:01:00 2020 +0000\n@@ -0,0 +1,1 @@\n+second\ndiff -r 29114dbae42b -r 95c24699272e second\n--- a/second\tMon Jan 12 13:46:40 1970 +0000\n+++ /dev/null\tThu Jan 01 00:00:00 1970 +0000\n@@ -1,1 +0,0 @@\n-second\ndiff -r 29114dbae42b -r 95c24699272e third\n--- /dev/null\tThu Jan 01 00:00:00 1970 +0000\n+++ b/third\tWed Jan 01 10:01:00 2020 +0000\n@@ -0,0 +1,1 @@\n+third\n"
785 785 }
786 786 ]
787 787
788 788 honor --git but not format-breaking diffopts
789 789 $ hg --config diff.noprefix=True log --git -vpr . -Tjson
790 790 [
791 791 {
792 792 "rev": 8,
793 793 "node": "95c24699272ef57d062b8bccc32c878bf841784a",
794 794 "branch": "default",
795 795 "phase": "draft",
796 796 "user": "test",
797 797 "date": [1577872860, 0],
798 798 "desc": "third",
799 799 "bookmarks": [],
800 800 "tags": ["tip"],
801 801 "parents": ["29114dbae42b9f078cf2714dbe3a86bba8ec7453"],
802 802 "files": ["fourth", "second", "third"],
803 803 "diff": "diff --git a/second b/fourth\nrename from second\nrename to fourth\ndiff --git a/third b/third\nnew file mode 100644\n--- /dev/null\n+++ b/third\n@@ -0,0 +1,1 @@\n+third\n"
804 804 }
805 805 ]
806 806
807 807 $ hg log -T json
808 808 [
809 809 {
810 810 "rev": 8,
811 811 "node": "95c24699272ef57d062b8bccc32c878bf841784a",
812 812 "branch": "default",
813 813 "phase": "draft",
814 814 "user": "test",
815 815 "date": [1577872860, 0],
816 816 "desc": "third",
817 817 "bookmarks": [],
818 818 "tags": ["tip"],
819 819 "parents": ["29114dbae42b9f078cf2714dbe3a86bba8ec7453"]
820 820 },
821 821 {
822 822 "rev": 7,
823 823 "node": "29114dbae42b9f078cf2714dbe3a86bba8ec7453",
824 824 "branch": "default",
825 825 "phase": "draft",
826 826 "user": "User Name <user@hostname>",
827 827 "date": [1000000, 0],
828 828 "desc": "second",
829 829 "bookmarks": [],
830 830 "tags": [],
831 831 "parents": ["0000000000000000000000000000000000000000"]
832 832 },
833 833 {
834 834 "rev": 6,
835 835 "node": "d41e714fe50d9e4a5f11b4d595d543481b5f980b",
836 836 "branch": "default",
837 837 "phase": "draft",
838 838 "user": "person",
839 839 "date": [1500001, 0],
840 840 "desc": "merge",
841 841 "bookmarks": [],
842 842 "tags": [],
843 843 "parents": ["13207e5a10d9fd28ec424934298e176197f2c67f", "bbe44766e73d5f11ed2177f1838de10c53ef3e74"]
844 844 },
845 845 {
846 846 "rev": 5,
847 847 "node": "13207e5a10d9fd28ec424934298e176197f2c67f",
848 848 "branch": "default",
849 849 "phase": "draft",
850 850 "user": "person",
851 851 "date": [1500000, 0],
852 852 "desc": "new head",
853 853 "bookmarks": [],
854 854 "tags": [],
855 855 "parents": ["10e46f2dcbf4823578cf180f33ecf0b957964c47"]
856 856 },
857 857 {
858 858 "rev": 4,
859 859 "node": "bbe44766e73d5f11ed2177f1838de10c53ef3e74",
860 860 "branch": "foo",
861 861 "phase": "draft",
862 862 "user": "person",
863 863 "date": [1400000, 0],
864 864 "desc": "new branch",
865 865 "bookmarks": [],
866 866 "tags": [],
867 867 "parents": ["10e46f2dcbf4823578cf180f33ecf0b957964c47"]
868 868 },
869 869 {
870 870 "rev": 3,
871 871 "node": "10e46f2dcbf4823578cf180f33ecf0b957964c47",
872 872 "branch": "default",
873 873 "phase": "draft",
874 874 "user": "person",
875 875 "date": [1300000, 0],
876 876 "desc": "no user, no domain",
877 877 "bookmarks": [],
878 878 "tags": [],
879 879 "parents": ["97054abb4ab824450e9164180baf491ae0078465"]
880 880 },
881 881 {
882 882 "rev": 2,
883 883 "node": "97054abb4ab824450e9164180baf491ae0078465",
884 884 "branch": "default",
885 885 "phase": "draft",
886 886 "user": "other@place",
887 887 "date": [1200000, 0],
888 888 "desc": "no person",
889 889 "bookmarks": [],
890 890 "tags": [],
891 891 "parents": ["b608e9d1a3f0273ccf70fb85fd6866b3482bf965"]
892 892 },
893 893 {
894 894 "rev": 1,
895 895 "node": "b608e9d1a3f0273ccf70fb85fd6866b3482bf965",
896 896 "branch": "default",
897 897 "phase": "draft",
898 898 "user": "A. N. Other <other@place>",
899 899 "date": [1100000, 0],
900 900 "desc": "other 1\nother 2\n\nother 3",
901 901 "bookmarks": [],
902 902 "tags": [],
903 903 "parents": ["1e4e1b8f71e05681d422154f5421e385fec3454f"]
904 904 },
905 905 {
906 906 "rev": 0,
907 907 "node": "1e4e1b8f71e05681d422154f5421e385fec3454f",
908 908 "branch": "default",
909 909 "phase": "draft",
910 910 "user": "User Name <user@hostname>",
911 911 "date": [1000000, 0],
912 912 "desc": "line 1\nline 2",
913 913 "bookmarks": [],
914 914 "tags": [],
915 915 "parents": ["0000000000000000000000000000000000000000"]
916 916 }
917 917 ]
918 918
919 919 $ hg heads -v -Tjson
920 920 [
921 921 {
922 922 "rev": 8,
923 923 "node": "95c24699272ef57d062b8bccc32c878bf841784a",
924 924 "branch": "default",
925 925 "phase": "draft",
926 926 "user": "test",
927 927 "date": [1577872860, 0],
928 928 "desc": "third",
929 929 "bookmarks": [],
930 930 "tags": ["tip"],
931 931 "parents": ["29114dbae42b9f078cf2714dbe3a86bba8ec7453"],
932 932 "files": ["fourth", "second", "third"]
933 933 },
934 934 {
935 935 "rev": 6,
936 936 "node": "d41e714fe50d9e4a5f11b4d595d543481b5f980b",
937 937 "branch": "default",
938 938 "phase": "draft",
939 939 "user": "person",
940 940 "date": [1500001, 0],
941 941 "desc": "merge",
942 942 "bookmarks": [],
943 943 "tags": [],
944 944 "parents": ["13207e5a10d9fd28ec424934298e176197f2c67f", "bbe44766e73d5f11ed2177f1838de10c53ef3e74"],
945 945 "files": []
946 946 },
947 947 {
948 948 "rev": 4,
949 949 "node": "bbe44766e73d5f11ed2177f1838de10c53ef3e74",
950 950 "branch": "foo",
951 951 "phase": "draft",
952 952 "user": "person",
953 953 "date": [1400000, 0],
954 954 "desc": "new branch",
955 955 "bookmarks": [],
956 956 "tags": [],
957 957 "parents": ["10e46f2dcbf4823578cf180f33ecf0b957964c47"],
958 958 "files": []
959 959 }
960 960 ]
961 961
962 962 $ hg log --debug -Tjson
963 963 [
964 964 {
965 965 "rev": 8,
966 966 "node": "95c24699272ef57d062b8bccc32c878bf841784a",
967 967 "branch": "default",
968 968 "phase": "draft",
969 969 "user": "test",
970 970 "date": [1577872860, 0],
971 971 "desc": "third",
972 972 "bookmarks": [],
973 973 "tags": ["tip"],
974 974 "parents": ["29114dbae42b9f078cf2714dbe3a86bba8ec7453"],
975 975 "manifest": "94961b75a2da554b4df6fb599e5bfc7d48de0c64",
976 976 "extra": {"branch": "default"},
977 977 "modified": [],
978 978 "added": ["fourth", "third"],
979 979 "removed": ["second"]
980 980 },
981 981 {
982 982 "rev": 7,
983 983 "node": "29114dbae42b9f078cf2714dbe3a86bba8ec7453",
984 984 "branch": "default",
985 985 "phase": "draft",
986 986 "user": "User Name <user@hostname>",
987 987 "date": [1000000, 0],
988 988 "desc": "second",
989 989 "bookmarks": [],
990 990 "tags": [],
991 991 "parents": ["0000000000000000000000000000000000000000"],
992 992 "manifest": "f2dbc354b94e5ec0b4f10680ee0cee816101d0bf",
993 993 "extra": {"branch": "default"},
994 994 "modified": [],
995 995 "added": ["second"],
996 996 "removed": []
997 997 },
998 998 {
999 999 "rev": 6,
1000 1000 "node": "d41e714fe50d9e4a5f11b4d595d543481b5f980b",
1001 1001 "branch": "default",
1002 1002 "phase": "draft",
1003 1003 "user": "person",
1004 1004 "date": [1500001, 0],
1005 1005 "desc": "merge",
1006 1006 "bookmarks": [],
1007 1007 "tags": [],
1008 1008 "parents": ["13207e5a10d9fd28ec424934298e176197f2c67f", "bbe44766e73d5f11ed2177f1838de10c53ef3e74"],
1009 1009 "manifest": "4dc3def4f9b4c6e8de820f6ee74737f91e96a216",
1010 1010 "extra": {"branch": "default"},
1011 1011 "modified": [],
1012 1012 "added": [],
1013 1013 "removed": []
1014 1014 },
1015 1015 {
1016 1016 "rev": 5,
1017 1017 "node": "13207e5a10d9fd28ec424934298e176197f2c67f",
1018 1018 "branch": "default",
1019 1019 "phase": "draft",
1020 1020 "user": "person",
1021 1021 "date": [1500000, 0],
1022 1022 "desc": "new head",
1023 1023 "bookmarks": [],
1024 1024 "tags": [],
1025 1025 "parents": ["10e46f2dcbf4823578cf180f33ecf0b957964c47"],
1026 1026 "manifest": "4dc3def4f9b4c6e8de820f6ee74737f91e96a216",
1027 1027 "extra": {"branch": "default"},
1028 1028 "modified": [],
1029 1029 "added": ["d"],
1030 1030 "removed": []
1031 1031 },
1032 1032 {
1033 1033 "rev": 4,
1034 1034 "node": "bbe44766e73d5f11ed2177f1838de10c53ef3e74",
1035 1035 "branch": "foo",
1036 1036 "phase": "draft",
1037 1037 "user": "person",
1038 1038 "date": [1400000, 0],
1039 1039 "desc": "new branch",
1040 1040 "bookmarks": [],
1041 1041 "tags": [],
1042 1042 "parents": ["10e46f2dcbf4823578cf180f33ecf0b957964c47"],
1043 1043 "manifest": "cb5a1327723bada42f117e4c55a303246eaf9ccc",
1044 1044 "extra": {"branch": "foo"},
1045 1045 "modified": [],
1046 1046 "added": [],
1047 1047 "removed": []
1048 1048 },
1049 1049 {
1050 1050 "rev": 3,
1051 1051 "node": "10e46f2dcbf4823578cf180f33ecf0b957964c47",
1052 1052 "branch": "default",
1053 1053 "phase": "draft",
1054 1054 "user": "person",
1055 1055 "date": [1300000, 0],
1056 1056 "desc": "no user, no domain",
1057 1057 "bookmarks": [],
1058 1058 "tags": [],
1059 1059 "parents": ["97054abb4ab824450e9164180baf491ae0078465"],
1060 1060 "manifest": "cb5a1327723bada42f117e4c55a303246eaf9ccc",
1061 1061 "extra": {"branch": "default"},
1062 1062 "modified": ["c"],
1063 1063 "added": [],
1064 1064 "removed": []
1065 1065 },
1066 1066 {
1067 1067 "rev": 2,
1068 1068 "node": "97054abb4ab824450e9164180baf491ae0078465",
1069 1069 "branch": "default",
1070 1070 "phase": "draft",
1071 1071 "user": "other@place",
1072 1072 "date": [1200000, 0],
1073 1073 "desc": "no person",
1074 1074 "bookmarks": [],
1075 1075 "tags": [],
1076 1076 "parents": ["b608e9d1a3f0273ccf70fb85fd6866b3482bf965"],
1077 1077 "manifest": "6e0e82995c35d0d57a52aca8da4e56139e06b4b1",
1078 1078 "extra": {"branch": "default"},
1079 1079 "modified": [],
1080 1080 "added": ["c"],
1081 1081 "removed": []
1082 1082 },
1083 1083 {
1084 1084 "rev": 1,
1085 1085 "node": "b608e9d1a3f0273ccf70fb85fd6866b3482bf965",
1086 1086 "branch": "default",
1087 1087 "phase": "draft",
1088 1088 "user": "A. N. Other <other@place>",
1089 1089 "date": [1100000, 0],
1090 1090 "desc": "other 1\nother 2\n\nother 3",
1091 1091 "bookmarks": [],
1092 1092 "tags": [],
1093 1093 "parents": ["1e4e1b8f71e05681d422154f5421e385fec3454f"],
1094 1094 "manifest": "4e8d705b1e53e3f9375e0e60dc7b525d8211fe55",
1095 1095 "extra": {"branch": "default"},
1096 1096 "modified": [],
1097 1097 "added": ["b"],
1098 1098 "removed": []
1099 1099 },
1100 1100 {
1101 1101 "rev": 0,
1102 1102 "node": "1e4e1b8f71e05681d422154f5421e385fec3454f",
1103 1103 "branch": "default",
1104 1104 "phase": "draft",
1105 1105 "user": "User Name <user@hostname>",
1106 1106 "date": [1000000, 0],
1107 1107 "desc": "line 1\nline 2",
1108 1108 "bookmarks": [],
1109 1109 "tags": [],
1110 1110 "parents": ["0000000000000000000000000000000000000000"],
1111 1111 "manifest": "a0c8bcbbb45c63b90b70ad007bf38961f64f2af0",
1112 1112 "extra": {"branch": "default"},
1113 1113 "modified": [],
1114 1114 "added": ["a"],
1115 1115 "removed": []
1116 1116 }
1117 1117 ]
1118 1118
1119 1119 Error if style not readable:
1120 1120
1121 1121 #if unix-permissions no-root
1122 1122 $ touch q
1123 1123 $ chmod 0 q
1124 1124 $ hg log --style ./q
1125 1125 abort: Permission denied: ./q
1126 1126 [255]
1127 1127 #endif
1128 1128
1129 1129 Error if no style:
1130 1130
1131 1131 $ hg log --style notexist
1132 1132 abort: style 'notexist' not found
1133 1133 (available styles: bisect, changelog, compact, default, phases, show, status, xml)
1134 1134 [255]
1135 1135
1136 1136 $ hg log -T list
1137 1137 available styles: bisect, changelog, compact, default, phases, show, status, xml
1138 1138 abort: specify a template
1139 1139 [255]
1140 1140
1141 1141 Error if style missing key:
1142 1142
1143 1143 $ echo 'q = q' > t
1144 1144 $ hg log --style ./t
1145 1145 abort: "changeset" not in template map
1146 1146 [255]
1147 1147
1148 1148 Error if style missing value:
1149 1149
1150 1150 $ echo 'changeset =' > t
1151 1151 $ hg log --style t
1152 1152 hg: parse error at t:1: missing value
1153 1153 [255]
1154 1154
1155 1155 Error if include fails:
1156 1156
1157 1157 $ echo 'changeset = q' >> t
1158 1158 #if unix-permissions no-root
1159 1159 $ hg log --style ./t
1160 1160 abort: template file ./q: Permission denied
1161 1161 [255]
1162 1162 $ rm -f q
1163 1163 #endif
1164 1164
1165 1165 Include works:
1166 1166
1167 1167 $ echo '{rev}' > q
1168 1168 $ hg log --style ./t
1169 1169 8
1170 1170 7
1171 1171 6
1172 1172 5
1173 1173 4
1174 1174 3
1175 1175 2
1176 1176 1
1177 1177 0
1178 1178
1179 1179 Check that recursive reference does not fall into RuntimeError (issue4758):
1180 1180
1181 1181 common mistake:
1182 1182
1183 $ hg log -T '{changeset}\n'
1183 $ cat << EOF > issue4758
1184 > changeset = '{changeset}\n'
1185 > EOF
1186 $ hg log --style ./issue4758
1184 1187 abort: recursive reference 'changeset' in template
1185 1188 [255]
1186 1189
1187 1190 circular reference:
1188 1191
1189 1192 $ cat << EOF > issue4758
1190 1193 > changeset = '{foo}'
1191 1194 > foo = '{changeset}'
1192 1195 > EOF
1193 1196 $ hg log --style ./issue4758
1194 1197 abort: recursive reference 'foo' in template
1195 1198 [255]
1196 1199
1197 1200 buildmap() -> gettemplate(), where no thunk was made:
1198 1201
1199 $ hg log -T '{files % changeset}\n'
1202 $ cat << EOF > issue4758
1203 > changeset = '{files % changeset}\n'
1204 > EOF
1205 $ hg log --style ./issue4758
1200 1206 abort: recursive reference 'changeset' in template
1201 1207 [255]
1202 1208
1203 1209 not a recursion if a keyword of the same name exists:
1204 1210
1205 1211 $ cat << EOF > issue4758
1206 1212 > changeset = '{tags % rev}'
1207 1213 > rev = '{rev} {tag}\n'
1208 1214 > EOF
1209 1215 $ hg log --style ./issue4758 -r tip
1210 1216 8 tip
1211 1217
1212 1218 Check that {phase} works correctly on parents:
1213 1219
1214 1220 $ cat << EOF > parentphase
1215 1221 > changeset_debug = '{rev} ({phase}):{parents}\n'
1216 1222 > parent = ' {rev} ({phase})'
1217 1223 > EOF
1218 1224 $ hg phase -r 5 --public
1219 1225 $ hg phase -r 7 --secret --force
1220 1226 $ hg log --debug -G --style ./parentphase
1221 1227 @ 8 (secret): 7 (secret) -1 (public)
1222 1228 |
1223 1229 o 7 (secret): -1 (public) -1 (public)
1224 1230
1225 1231 o 6 (draft): 5 (public) 4 (draft)
1226 1232 |\
1227 1233 | o 5 (public): 3 (public) -1 (public)
1228 1234 | |
1229 1235 o | 4 (draft): 3 (public) -1 (public)
1230 1236 |/
1231 1237 o 3 (public): 2 (public) -1 (public)
1232 1238 |
1233 1239 o 2 (public): 1 (public) -1 (public)
1234 1240 |
1235 1241 o 1 (public): 0 (public) -1 (public)
1236 1242 |
1237 1243 o 0 (public): -1 (public) -1 (public)
1238 1244
1239 1245
1240 1246 Missing non-standard names give no error (backward compatibility):
1241 1247
1242 1248 $ echo "changeset = '{c}'" > t
1243 1249 $ hg log --style ./t
1244 1250
1245 1251 Defining non-standard name works:
1246 1252
1247 1253 $ cat <<EOF > t
1248 1254 > changeset = '{c}'
1249 1255 > c = q
1250 1256 > EOF
1251 1257 $ hg log --style ./t
1252 1258 8
1253 1259 7
1254 1260 6
1255 1261 5
1256 1262 4
1257 1263 3
1258 1264 2
1259 1265 1
1260 1266 0
1261 1267
1262 1268 ui.style works:
1263 1269
1264 1270 $ echo '[ui]' > .hg/hgrc
1265 1271 $ echo 'style = t' >> .hg/hgrc
1266 1272 $ hg log
1267 1273 8
1268 1274 7
1269 1275 6
1270 1276 5
1271 1277 4
1272 1278 3
1273 1279 2
1274 1280 1
1275 1281 0
1276 1282
1277 1283
1278 1284 Issue338:
1279 1285
1280 1286 $ hg log --style=changelog > changelog
1281 1287
1282 1288 $ cat changelog
1283 1289 2020-01-01 test <test>
1284 1290
1285 1291 * fourth, second, third:
1286 1292 third
1287 1293 [95c24699272e] [tip]
1288 1294
1289 1295 1970-01-12 User Name <user@hostname>
1290 1296
1291 1297 * second:
1292 1298 second
1293 1299 [29114dbae42b]
1294 1300
1295 1301 1970-01-18 person <person>
1296 1302
1297 1303 * merge
1298 1304 [d41e714fe50d]
1299 1305
1300 1306 * d:
1301 1307 new head
1302 1308 [13207e5a10d9]
1303 1309
1304 1310 1970-01-17 person <person>
1305 1311
1306 1312 * new branch
1307 1313 [bbe44766e73d] <foo>
1308 1314
1309 1315 1970-01-16 person <person>
1310 1316
1311 1317 * c:
1312 1318 no user, no domain
1313 1319 [10e46f2dcbf4]
1314 1320
1315 1321 1970-01-14 other <other@place>
1316 1322
1317 1323 * c:
1318 1324 no person
1319 1325 [97054abb4ab8]
1320 1326
1321 1327 1970-01-13 A. N. Other <other@place>
1322 1328
1323 1329 * b:
1324 1330 other 1 other 2
1325 1331
1326 1332 other 3
1327 1333 [b608e9d1a3f0]
1328 1334
1329 1335 1970-01-12 User Name <user@hostname>
1330 1336
1331 1337 * a:
1332 1338 line 1 line 2
1333 1339 [1e4e1b8f71e0]
1334 1340
1335 1341
1336 1342 Issue2130: xml output for 'hg heads' is malformed
1337 1343
1338 1344 $ hg heads --style changelog
1339 1345 2020-01-01 test <test>
1340 1346
1341 1347 * fourth, second, third:
1342 1348 third
1343 1349 [95c24699272e] [tip]
1344 1350
1345 1351 1970-01-18 person <person>
1346 1352
1347 1353 * merge
1348 1354 [d41e714fe50d]
1349 1355
1350 1356 1970-01-17 person <person>
1351 1357
1352 1358 * new branch
1353 1359 [bbe44766e73d] <foo>
1354 1360
1355 1361
1356 1362 Keys work:
1357 1363
1358 1364 $ for key in author branch branches date desc file_adds file_dels file_mods \
1359 1365 > file_copies file_copies_switch files \
1360 1366 > manifest node parents rev tags diffstat extras \
1361 1367 > p1rev p2rev p1node p2node; do
1362 1368 > for mode in '' --verbose --debug; do
1363 1369 > hg log $mode --template "$key$mode: {$key}\n"
1364 1370 > done
1365 1371 > done
1366 1372 author: test
1367 1373 author: User Name <user@hostname>
1368 1374 author: person
1369 1375 author: person
1370 1376 author: person
1371 1377 author: person
1372 1378 author: other@place
1373 1379 author: A. N. Other <other@place>
1374 1380 author: User Name <user@hostname>
1375 1381 author--verbose: test
1376 1382 author--verbose: User Name <user@hostname>
1377 1383 author--verbose: person
1378 1384 author--verbose: person
1379 1385 author--verbose: person
1380 1386 author--verbose: person
1381 1387 author--verbose: other@place
1382 1388 author--verbose: A. N. Other <other@place>
1383 1389 author--verbose: User Name <user@hostname>
1384 1390 author--debug: test
1385 1391 author--debug: User Name <user@hostname>
1386 1392 author--debug: person
1387 1393 author--debug: person
1388 1394 author--debug: person
1389 1395 author--debug: person
1390 1396 author--debug: other@place
1391 1397 author--debug: A. N. Other <other@place>
1392 1398 author--debug: User Name <user@hostname>
1393 1399 branch: default
1394 1400 branch: default
1395 1401 branch: default
1396 1402 branch: default
1397 1403 branch: foo
1398 1404 branch: default
1399 1405 branch: default
1400 1406 branch: default
1401 1407 branch: default
1402 1408 branch--verbose: default
1403 1409 branch--verbose: default
1404 1410 branch--verbose: default
1405 1411 branch--verbose: default
1406 1412 branch--verbose: foo
1407 1413 branch--verbose: default
1408 1414 branch--verbose: default
1409 1415 branch--verbose: default
1410 1416 branch--verbose: default
1411 1417 branch--debug: default
1412 1418 branch--debug: default
1413 1419 branch--debug: default
1414 1420 branch--debug: default
1415 1421 branch--debug: foo
1416 1422 branch--debug: default
1417 1423 branch--debug: default
1418 1424 branch--debug: default
1419 1425 branch--debug: default
1420 1426 branches:
1421 1427 branches:
1422 1428 branches:
1423 1429 branches:
1424 1430 branches: foo
1425 1431 branches:
1426 1432 branches:
1427 1433 branches:
1428 1434 branches:
1429 1435 branches--verbose:
1430 1436 branches--verbose:
1431 1437 branches--verbose:
1432 1438 branches--verbose:
1433 1439 branches--verbose: foo
1434 1440 branches--verbose:
1435 1441 branches--verbose:
1436 1442 branches--verbose:
1437 1443 branches--verbose:
1438 1444 branches--debug:
1439 1445 branches--debug:
1440 1446 branches--debug:
1441 1447 branches--debug:
1442 1448 branches--debug: foo
1443 1449 branches--debug:
1444 1450 branches--debug:
1445 1451 branches--debug:
1446 1452 branches--debug:
1447 1453 date: 1577872860.00
1448 1454 date: 1000000.00
1449 1455 date: 1500001.00
1450 1456 date: 1500000.00
1451 1457 date: 1400000.00
1452 1458 date: 1300000.00
1453 1459 date: 1200000.00
1454 1460 date: 1100000.00
1455 1461 date: 1000000.00
1456 1462 date--verbose: 1577872860.00
1457 1463 date--verbose: 1000000.00
1458 1464 date--verbose: 1500001.00
1459 1465 date--verbose: 1500000.00
1460 1466 date--verbose: 1400000.00
1461 1467 date--verbose: 1300000.00
1462 1468 date--verbose: 1200000.00
1463 1469 date--verbose: 1100000.00
1464 1470 date--verbose: 1000000.00
1465 1471 date--debug: 1577872860.00
1466 1472 date--debug: 1000000.00
1467 1473 date--debug: 1500001.00
1468 1474 date--debug: 1500000.00
1469 1475 date--debug: 1400000.00
1470 1476 date--debug: 1300000.00
1471 1477 date--debug: 1200000.00
1472 1478 date--debug: 1100000.00
1473 1479 date--debug: 1000000.00
1474 1480 desc: third
1475 1481 desc: second
1476 1482 desc: merge
1477 1483 desc: new head
1478 1484 desc: new branch
1479 1485 desc: no user, no domain
1480 1486 desc: no person
1481 1487 desc: other 1
1482 1488 other 2
1483 1489
1484 1490 other 3
1485 1491 desc: line 1
1486 1492 line 2
1487 1493 desc--verbose: third
1488 1494 desc--verbose: second
1489 1495 desc--verbose: merge
1490 1496 desc--verbose: new head
1491 1497 desc--verbose: new branch
1492 1498 desc--verbose: no user, no domain
1493 1499 desc--verbose: no person
1494 1500 desc--verbose: other 1
1495 1501 other 2
1496 1502
1497 1503 other 3
1498 1504 desc--verbose: line 1
1499 1505 line 2
1500 1506 desc--debug: third
1501 1507 desc--debug: second
1502 1508 desc--debug: merge
1503 1509 desc--debug: new head
1504 1510 desc--debug: new branch
1505 1511 desc--debug: no user, no domain
1506 1512 desc--debug: no person
1507 1513 desc--debug: other 1
1508 1514 other 2
1509 1515
1510 1516 other 3
1511 1517 desc--debug: line 1
1512 1518 line 2
1513 1519 file_adds: fourth third
1514 1520 file_adds: second
1515 1521 file_adds:
1516 1522 file_adds: d
1517 1523 file_adds:
1518 1524 file_adds:
1519 1525 file_adds: c
1520 1526 file_adds: b
1521 1527 file_adds: a
1522 1528 file_adds--verbose: fourth third
1523 1529 file_adds--verbose: second
1524 1530 file_adds--verbose:
1525 1531 file_adds--verbose: d
1526 1532 file_adds--verbose:
1527 1533 file_adds--verbose:
1528 1534 file_adds--verbose: c
1529 1535 file_adds--verbose: b
1530 1536 file_adds--verbose: a
1531 1537 file_adds--debug: fourth third
1532 1538 file_adds--debug: second
1533 1539 file_adds--debug:
1534 1540 file_adds--debug: d
1535 1541 file_adds--debug:
1536 1542 file_adds--debug:
1537 1543 file_adds--debug: c
1538 1544 file_adds--debug: b
1539 1545 file_adds--debug: a
1540 1546 file_dels: second
1541 1547 file_dels:
1542 1548 file_dels:
1543 1549 file_dels:
1544 1550 file_dels:
1545 1551 file_dels:
1546 1552 file_dels:
1547 1553 file_dels:
1548 1554 file_dels:
1549 1555 file_dels--verbose: second
1550 1556 file_dels--verbose:
1551 1557 file_dels--verbose:
1552 1558 file_dels--verbose:
1553 1559 file_dels--verbose:
1554 1560 file_dels--verbose:
1555 1561 file_dels--verbose:
1556 1562 file_dels--verbose:
1557 1563 file_dels--verbose:
1558 1564 file_dels--debug: second
1559 1565 file_dels--debug:
1560 1566 file_dels--debug:
1561 1567 file_dels--debug:
1562 1568 file_dels--debug:
1563 1569 file_dels--debug:
1564 1570 file_dels--debug:
1565 1571 file_dels--debug:
1566 1572 file_dels--debug:
1567 1573 file_mods:
1568 1574 file_mods:
1569 1575 file_mods:
1570 1576 file_mods:
1571 1577 file_mods:
1572 1578 file_mods: c
1573 1579 file_mods:
1574 1580 file_mods:
1575 1581 file_mods:
1576 1582 file_mods--verbose:
1577 1583 file_mods--verbose:
1578 1584 file_mods--verbose:
1579 1585 file_mods--verbose:
1580 1586 file_mods--verbose:
1581 1587 file_mods--verbose: c
1582 1588 file_mods--verbose:
1583 1589 file_mods--verbose:
1584 1590 file_mods--verbose:
1585 1591 file_mods--debug:
1586 1592 file_mods--debug:
1587 1593 file_mods--debug:
1588 1594 file_mods--debug:
1589 1595 file_mods--debug:
1590 1596 file_mods--debug: c
1591 1597 file_mods--debug:
1592 1598 file_mods--debug:
1593 1599 file_mods--debug:
1594 1600 file_copies: fourth (second)
1595 1601 file_copies:
1596 1602 file_copies:
1597 1603 file_copies:
1598 1604 file_copies:
1599 1605 file_copies:
1600 1606 file_copies:
1601 1607 file_copies:
1602 1608 file_copies:
1603 1609 file_copies--verbose: fourth (second)
1604 1610 file_copies--verbose:
1605 1611 file_copies--verbose:
1606 1612 file_copies--verbose:
1607 1613 file_copies--verbose:
1608 1614 file_copies--verbose:
1609 1615 file_copies--verbose:
1610 1616 file_copies--verbose:
1611 1617 file_copies--verbose:
1612 1618 file_copies--debug: fourth (second)
1613 1619 file_copies--debug:
1614 1620 file_copies--debug:
1615 1621 file_copies--debug:
1616 1622 file_copies--debug:
1617 1623 file_copies--debug:
1618 1624 file_copies--debug:
1619 1625 file_copies--debug:
1620 1626 file_copies--debug:
1621 1627 file_copies_switch:
1622 1628 file_copies_switch:
1623 1629 file_copies_switch:
1624 1630 file_copies_switch:
1625 1631 file_copies_switch:
1626 1632 file_copies_switch:
1627 1633 file_copies_switch:
1628 1634 file_copies_switch:
1629 1635 file_copies_switch:
1630 1636 file_copies_switch--verbose:
1631 1637 file_copies_switch--verbose:
1632 1638 file_copies_switch--verbose:
1633 1639 file_copies_switch--verbose:
1634 1640 file_copies_switch--verbose:
1635 1641 file_copies_switch--verbose:
1636 1642 file_copies_switch--verbose:
1637 1643 file_copies_switch--verbose:
1638 1644 file_copies_switch--verbose:
1639 1645 file_copies_switch--debug:
1640 1646 file_copies_switch--debug:
1641 1647 file_copies_switch--debug:
1642 1648 file_copies_switch--debug:
1643 1649 file_copies_switch--debug:
1644 1650 file_copies_switch--debug:
1645 1651 file_copies_switch--debug:
1646 1652 file_copies_switch--debug:
1647 1653 file_copies_switch--debug:
1648 1654 files: fourth second third
1649 1655 files: second
1650 1656 files:
1651 1657 files: d
1652 1658 files:
1653 1659 files: c
1654 1660 files: c
1655 1661 files: b
1656 1662 files: a
1657 1663 files--verbose: fourth second third
1658 1664 files--verbose: second
1659 1665 files--verbose:
1660 1666 files--verbose: d
1661 1667 files--verbose:
1662 1668 files--verbose: c
1663 1669 files--verbose: c
1664 1670 files--verbose: b
1665 1671 files--verbose: a
1666 1672 files--debug: fourth second third
1667 1673 files--debug: second
1668 1674 files--debug:
1669 1675 files--debug: d
1670 1676 files--debug:
1671 1677 files--debug: c
1672 1678 files--debug: c
1673 1679 files--debug: b
1674 1680 files--debug: a
1675 1681 manifest: 6:94961b75a2da
1676 1682 manifest: 5:f2dbc354b94e
1677 1683 manifest: 4:4dc3def4f9b4
1678 1684 manifest: 4:4dc3def4f9b4
1679 1685 manifest: 3:cb5a1327723b
1680 1686 manifest: 3:cb5a1327723b
1681 1687 manifest: 2:6e0e82995c35
1682 1688 manifest: 1:4e8d705b1e53
1683 1689 manifest: 0:a0c8bcbbb45c
1684 1690 manifest--verbose: 6:94961b75a2da
1685 1691 manifest--verbose: 5:f2dbc354b94e
1686 1692 manifest--verbose: 4:4dc3def4f9b4
1687 1693 manifest--verbose: 4:4dc3def4f9b4
1688 1694 manifest--verbose: 3:cb5a1327723b
1689 1695 manifest--verbose: 3:cb5a1327723b
1690 1696 manifest--verbose: 2:6e0e82995c35
1691 1697 manifest--verbose: 1:4e8d705b1e53
1692 1698 manifest--verbose: 0:a0c8bcbbb45c
1693 1699 manifest--debug: 6:94961b75a2da554b4df6fb599e5bfc7d48de0c64
1694 1700 manifest--debug: 5:f2dbc354b94e5ec0b4f10680ee0cee816101d0bf
1695 1701 manifest--debug: 4:4dc3def4f9b4c6e8de820f6ee74737f91e96a216
1696 1702 manifest--debug: 4:4dc3def4f9b4c6e8de820f6ee74737f91e96a216
1697 1703 manifest--debug: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
1698 1704 manifest--debug: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
1699 1705 manifest--debug: 2:6e0e82995c35d0d57a52aca8da4e56139e06b4b1
1700 1706 manifest--debug: 1:4e8d705b1e53e3f9375e0e60dc7b525d8211fe55
1701 1707 manifest--debug: 0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0
1702 1708 node: 95c24699272ef57d062b8bccc32c878bf841784a
1703 1709 node: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
1704 1710 node: d41e714fe50d9e4a5f11b4d595d543481b5f980b
1705 1711 node: 13207e5a10d9fd28ec424934298e176197f2c67f
1706 1712 node: bbe44766e73d5f11ed2177f1838de10c53ef3e74
1707 1713 node: 10e46f2dcbf4823578cf180f33ecf0b957964c47
1708 1714 node: 97054abb4ab824450e9164180baf491ae0078465
1709 1715 node: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
1710 1716 node: 1e4e1b8f71e05681d422154f5421e385fec3454f
1711 1717 node--verbose: 95c24699272ef57d062b8bccc32c878bf841784a
1712 1718 node--verbose: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
1713 1719 node--verbose: d41e714fe50d9e4a5f11b4d595d543481b5f980b
1714 1720 node--verbose: 13207e5a10d9fd28ec424934298e176197f2c67f
1715 1721 node--verbose: bbe44766e73d5f11ed2177f1838de10c53ef3e74
1716 1722 node--verbose: 10e46f2dcbf4823578cf180f33ecf0b957964c47
1717 1723 node--verbose: 97054abb4ab824450e9164180baf491ae0078465
1718 1724 node--verbose: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
1719 1725 node--verbose: 1e4e1b8f71e05681d422154f5421e385fec3454f
1720 1726 node--debug: 95c24699272ef57d062b8bccc32c878bf841784a
1721 1727 node--debug: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
1722 1728 node--debug: d41e714fe50d9e4a5f11b4d595d543481b5f980b
1723 1729 node--debug: 13207e5a10d9fd28ec424934298e176197f2c67f
1724 1730 node--debug: bbe44766e73d5f11ed2177f1838de10c53ef3e74
1725 1731 node--debug: 10e46f2dcbf4823578cf180f33ecf0b957964c47
1726 1732 node--debug: 97054abb4ab824450e9164180baf491ae0078465
1727 1733 node--debug: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
1728 1734 node--debug: 1e4e1b8f71e05681d422154f5421e385fec3454f
1729 1735 parents:
1730 1736 parents: -1:000000000000
1731 1737 parents: 5:13207e5a10d9 4:bbe44766e73d
1732 1738 parents: 3:10e46f2dcbf4
1733 1739 parents:
1734 1740 parents:
1735 1741 parents:
1736 1742 parents:
1737 1743 parents:
1738 1744 parents--verbose:
1739 1745 parents--verbose: -1:000000000000
1740 1746 parents--verbose: 5:13207e5a10d9 4:bbe44766e73d
1741 1747 parents--verbose: 3:10e46f2dcbf4
1742 1748 parents--verbose:
1743 1749 parents--verbose:
1744 1750 parents--verbose:
1745 1751 parents--verbose:
1746 1752 parents--verbose:
1747 1753 parents--debug: 7:29114dbae42b9f078cf2714dbe3a86bba8ec7453 -1:0000000000000000000000000000000000000000
1748 1754 parents--debug: -1:0000000000000000000000000000000000000000 -1:0000000000000000000000000000000000000000
1749 1755 parents--debug: 5:13207e5a10d9fd28ec424934298e176197f2c67f 4:bbe44766e73d5f11ed2177f1838de10c53ef3e74
1750 1756 parents--debug: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47 -1:0000000000000000000000000000000000000000
1751 1757 parents--debug: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47 -1:0000000000000000000000000000000000000000
1752 1758 parents--debug: 2:97054abb4ab824450e9164180baf491ae0078465 -1:0000000000000000000000000000000000000000
1753 1759 parents--debug: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965 -1:0000000000000000000000000000000000000000
1754 1760 parents--debug: 0:1e4e1b8f71e05681d422154f5421e385fec3454f -1:0000000000000000000000000000000000000000
1755 1761 parents--debug: -1:0000000000000000000000000000000000000000 -1:0000000000000000000000000000000000000000
1756 1762 rev: 8
1757 1763 rev: 7
1758 1764 rev: 6
1759 1765 rev: 5
1760 1766 rev: 4
1761 1767 rev: 3
1762 1768 rev: 2
1763 1769 rev: 1
1764 1770 rev: 0
1765 1771 rev--verbose: 8
1766 1772 rev--verbose: 7
1767 1773 rev--verbose: 6
1768 1774 rev--verbose: 5
1769 1775 rev--verbose: 4
1770 1776 rev--verbose: 3
1771 1777 rev--verbose: 2
1772 1778 rev--verbose: 1
1773 1779 rev--verbose: 0
1774 1780 rev--debug: 8
1775 1781 rev--debug: 7
1776 1782 rev--debug: 6
1777 1783 rev--debug: 5
1778 1784 rev--debug: 4
1779 1785 rev--debug: 3
1780 1786 rev--debug: 2
1781 1787 rev--debug: 1
1782 1788 rev--debug: 0
1783 1789 tags: tip
1784 1790 tags:
1785 1791 tags:
1786 1792 tags:
1787 1793 tags:
1788 1794 tags:
1789 1795 tags:
1790 1796 tags:
1791 1797 tags:
1792 1798 tags--verbose: tip
1793 1799 tags--verbose:
1794 1800 tags--verbose:
1795 1801 tags--verbose:
1796 1802 tags--verbose:
1797 1803 tags--verbose:
1798 1804 tags--verbose:
1799 1805 tags--verbose:
1800 1806 tags--verbose:
1801 1807 tags--debug: tip
1802 1808 tags--debug:
1803 1809 tags--debug:
1804 1810 tags--debug:
1805 1811 tags--debug:
1806 1812 tags--debug:
1807 1813 tags--debug:
1808 1814 tags--debug:
1809 1815 tags--debug:
1810 1816 diffstat: 3: +2/-1
1811 1817 diffstat: 1: +1/-0
1812 1818 diffstat: 0: +0/-0
1813 1819 diffstat: 1: +1/-0
1814 1820 diffstat: 0: +0/-0
1815 1821 diffstat: 1: +1/-0
1816 1822 diffstat: 1: +4/-0
1817 1823 diffstat: 1: +2/-0
1818 1824 diffstat: 1: +1/-0
1819 1825 diffstat--verbose: 3: +2/-1
1820 1826 diffstat--verbose: 1: +1/-0
1821 1827 diffstat--verbose: 0: +0/-0
1822 1828 diffstat--verbose: 1: +1/-0
1823 1829 diffstat--verbose: 0: +0/-0
1824 1830 diffstat--verbose: 1: +1/-0
1825 1831 diffstat--verbose: 1: +4/-0
1826 1832 diffstat--verbose: 1: +2/-0
1827 1833 diffstat--verbose: 1: +1/-0
1828 1834 diffstat--debug: 3: +2/-1
1829 1835 diffstat--debug: 1: +1/-0
1830 1836 diffstat--debug: 0: +0/-0
1831 1837 diffstat--debug: 1: +1/-0
1832 1838 diffstat--debug: 0: +0/-0
1833 1839 diffstat--debug: 1: +1/-0
1834 1840 diffstat--debug: 1: +4/-0
1835 1841 diffstat--debug: 1: +2/-0
1836 1842 diffstat--debug: 1: +1/-0
1837 1843 extras: branch=default
1838 1844 extras: branch=default
1839 1845 extras: branch=default
1840 1846 extras: branch=default
1841 1847 extras: branch=foo
1842 1848 extras: branch=default
1843 1849 extras: branch=default
1844 1850 extras: branch=default
1845 1851 extras: branch=default
1846 1852 extras--verbose: branch=default
1847 1853 extras--verbose: branch=default
1848 1854 extras--verbose: branch=default
1849 1855 extras--verbose: branch=default
1850 1856 extras--verbose: branch=foo
1851 1857 extras--verbose: branch=default
1852 1858 extras--verbose: branch=default
1853 1859 extras--verbose: branch=default
1854 1860 extras--verbose: branch=default
1855 1861 extras--debug: branch=default
1856 1862 extras--debug: branch=default
1857 1863 extras--debug: branch=default
1858 1864 extras--debug: branch=default
1859 1865 extras--debug: branch=foo
1860 1866 extras--debug: branch=default
1861 1867 extras--debug: branch=default
1862 1868 extras--debug: branch=default
1863 1869 extras--debug: branch=default
1864 1870 p1rev: 7
1865 1871 p1rev: -1
1866 1872 p1rev: 5
1867 1873 p1rev: 3
1868 1874 p1rev: 3
1869 1875 p1rev: 2
1870 1876 p1rev: 1
1871 1877 p1rev: 0
1872 1878 p1rev: -1
1873 1879 p1rev--verbose: 7
1874 1880 p1rev--verbose: -1
1875 1881 p1rev--verbose: 5
1876 1882 p1rev--verbose: 3
1877 1883 p1rev--verbose: 3
1878 1884 p1rev--verbose: 2
1879 1885 p1rev--verbose: 1
1880 1886 p1rev--verbose: 0
1881 1887 p1rev--verbose: -1
1882 1888 p1rev--debug: 7
1883 1889 p1rev--debug: -1
1884 1890 p1rev--debug: 5
1885 1891 p1rev--debug: 3
1886 1892 p1rev--debug: 3
1887 1893 p1rev--debug: 2
1888 1894 p1rev--debug: 1
1889 1895 p1rev--debug: 0
1890 1896 p1rev--debug: -1
1891 1897 p2rev: -1
1892 1898 p2rev: -1
1893 1899 p2rev: 4
1894 1900 p2rev: -1
1895 1901 p2rev: -1
1896 1902 p2rev: -1
1897 1903 p2rev: -1
1898 1904 p2rev: -1
1899 1905 p2rev: -1
1900 1906 p2rev--verbose: -1
1901 1907 p2rev--verbose: -1
1902 1908 p2rev--verbose: 4
1903 1909 p2rev--verbose: -1
1904 1910 p2rev--verbose: -1
1905 1911 p2rev--verbose: -1
1906 1912 p2rev--verbose: -1
1907 1913 p2rev--verbose: -1
1908 1914 p2rev--verbose: -1
1909 1915 p2rev--debug: -1
1910 1916 p2rev--debug: -1
1911 1917 p2rev--debug: 4
1912 1918 p2rev--debug: -1
1913 1919 p2rev--debug: -1
1914 1920 p2rev--debug: -1
1915 1921 p2rev--debug: -1
1916 1922 p2rev--debug: -1
1917 1923 p2rev--debug: -1
1918 1924 p1node: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
1919 1925 p1node: 0000000000000000000000000000000000000000
1920 1926 p1node: 13207e5a10d9fd28ec424934298e176197f2c67f
1921 1927 p1node: 10e46f2dcbf4823578cf180f33ecf0b957964c47
1922 1928 p1node: 10e46f2dcbf4823578cf180f33ecf0b957964c47
1923 1929 p1node: 97054abb4ab824450e9164180baf491ae0078465
1924 1930 p1node: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
1925 1931 p1node: 1e4e1b8f71e05681d422154f5421e385fec3454f
1926 1932 p1node: 0000000000000000000000000000000000000000
1927 1933 p1node--verbose: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
1928 1934 p1node--verbose: 0000000000000000000000000000000000000000
1929 1935 p1node--verbose: 13207e5a10d9fd28ec424934298e176197f2c67f
1930 1936 p1node--verbose: 10e46f2dcbf4823578cf180f33ecf0b957964c47
1931 1937 p1node--verbose: 10e46f2dcbf4823578cf180f33ecf0b957964c47
1932 1938 p1node--verbose: 97054abb4ab824450e9164180baf491ae0078465
1933 1939 p1node--verbose: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
1934 1940 p1node--verbose: 1e4e1b8f71e05681d422154f5421e385fec3454f
1935 1941 p1node--verbose: 0000000000000000000000000000000000000000
1936 1942 p1node--debug: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
1937 1943 p1node--debug: 0000000000000000000000000000000000000000
1938 1944 p1node--debug: 13207e5a10d9fd28ec424934298e176197f2c67f
1939 1945 p1node--debug: 10e46f2dcbf4823578cf180f33ecf0b957964c47
1940 1946 p1node--debug: 10e46f2dcbf4823578cf180f33ecf0b957964c47
1941 1947 p1node--debug: 97054abb4ab824450e9164180baf491ae0078465
1942 1948 p1node--debug: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
1943 1949 p1node--debug: 1e4e1b8f71e05681d422154f5421e385fec3454f
1944 1950 p1node--debug: 0000000000000000000000000000000000000000
1945 1951 p2node: 0000000000000000000000000000000000000000
1946 1952 p2node: 0000000000000000000000000000000000000000
1947 1953 p2node: bbe44766e73d5f11ed2177f1838de10c53ef3e74
1948 1954 p2node: 0000000000000000000000000000000000000000
1949 1955 p2node: 0000000000000000000000000000000000000000
1950 1956 p2node: 0000000000000000000000000000000000000000
1951 1957 p2node: 0000000000000000000000000000000000000000
1952 1958 p2node: 0000000000000000000000000000000000000000
1953 1959 p2node: 0000000000000000000000000000000000000000
1954 1960 p2node--verbose: 0000000000000000000000000000000000000000
1955 1961 p2node--verbose: 0000000000000000000000000000000000000000
1956 1962 p2node--verbose: bbe44766e73d5f11ed2177f1838de10c53ef3e74
1957 1963 p2node--verbose: 0000000000000000000000000000000000000000
1958 1964 p2node--verbose: 0000000000000000000000000000000000000000
1959 1965 p2node--verbose: 0000000000000000000000000000000000000000
1960 1966 p2node--verbose: 0000000000000000000000000000000000000000
1961 1967 p2node--verbose: 0000000000000000000000000000000000000000
1962 1968 p2node--verbose: 0000000000000000000000000000000000000000
1963 1969 p2node--debug: 0000000000000000000000000000000000000000
1964 1970 p2node--debug: 0000000000000000000000000000000000000000
1965 1971 p2node--debug: bbe44766e73d5f11ed2177f1838de10c53ef3e74
1966 1972 p2node--debug: 0000000000000000000000000000000000000000
1967 1973 p2node--debug: 0000000000000000000000000000000000000000
1968 1974 p2node--debug: 0000000000000000000000000000000000000000
1969 1975 p2node--debug: 0000000000000000000000000000000000000000
1970 1976 p2node--debug: 0000000000000000000000000000000000000000
1971 1977 p2node--debug: 0000000000000000000000000000000000000000
1972 1978
1973 1979 Filters work:
1974 1980
1975 1981 $ hg log --template '{author|domain}\n'
1976 1982
1977 1983 hostname
1978 1984
1979 1985
1980 1986
1981 1987
1982 1988 place
1983 1989 place
1984 1990 hostname
1985 1991
1986 1992 $ hg log --template '{author|person}\n'
1987 1993 test
1988 1994 User Name
1989 1995 person
1990 1996 person
1991 1997 person
1992 1998 person
1993 1999 other
1994 2000 A. N. Other
1995 2001 User Name
1996 2002
1997 2003 $ hg log --template '{author|user}\n'
1998 2004 test
1999 2005 user
2000 2006 person
2001 2007 person
2002 2008 person
2003 2009 person
2004 2010 other
2005 2011 other
2006 2012 user
2007 2013
2008 2014 $ hg log --template '{date|date}\n'
2009 2015 Wed Jan 01 10:01:00 2020 +0000
2010 2016 Mon Jan 12 13:46:40 1970 +0000
2011 2017 Sun Jan 18 08:40:01 1970 +0000
2012 2018 Sun Jan 18 08:40:00 1970 +0000
2013 2019 Sat Jan 17 04:53:20 1970 +0000
2014 2020 Fri Jan 16 01:06:40 1970 +0000
2015 2021 Wed Jan 14 21:20:00 1970 +0000
2016 2022 Tue Jan 13 17:33:20 1970 +0000
2017 2023 Mon Jan 12 13:46:40 1970 +0000
2018 2024
2019 2025 $ hg log --template '{date|isodate}\n'
2020 2026 2020-01-01 10:01 +0000
2021 2027 1970-01-12 13:46 +0000
2022 2028 1970-01-18 08:40 +0000
2023 2029 1970-01-18 08:40 +0000
2024 2030 1970-01-17 04:53 +0000
2025 2031 1970-01-16 01:06 +0000
2026 2032 1970-01-14 21:20 +0000
2027 2033 1970-01-13 17:33 +0000
2028 2034 1970-01-12 13:46 +0000
2029 2035
2030 2036 $ hg log --template '{date|isodatesec}\n'
2031 2037 2020-01-01 10:01:00 +0000
2032 2038 1970-01-12 13:46:40 +0000
2033 2039 1970-01-18 08:40:01 +0000
2034 2040 1970-01-18 08:40:00 +0000
2035 2041 1970-01-17 04:53:20 +0000
2036 2042 1970-01-16 01:06:40 +0000
2037 2043 1970-01-14 21:20:00 +0000
2038 2044 1970-01-13 17:33:20 +0000
2039 2045 1970-01-12 13:46:40 +0000
2040 2046
2041 2047 $ hg log --template '{date|rfc822date}\n'
2042 2048 Wed, 01 Jan 2020 10:01:00 +0000
2043 2049 Mon, 12 Jan 1970 13:46:40 +0000
2044 2050 Sun, 18 Jan 1970 08:40:01 +0000
2045 2051 Sun, 18 Jan 1970 08:40:00 +0000
2046 2052 Sat, 17 Jan 1970 04:53:20 +0000
2047 2053 Fri, 16 Jan 1970 01:06:40 +0000
2048 2054 Wed, 14 Jan 1970 21:20:00 +0000
2049 2055 Tue, 13 Jan 1970 17:33:20 +0000
2050 2056 Mon, 12 Jan 1970 13:46:40 +0000
2051 2057
2052 2058 $ hg log --template '{desc|firstline}\n'
2053 2059 third
2054 2060 second
2055 2061 merge
2056 2062 new head
2057 2063 new branch
2058 2064 no user, no domain
2059 2065 no person
2060 2066 other 1
2061 2067 line 1
2062 2068
2063 2069 $ hg log --template '{node|short}\n'
2064 2070 95c24699272e
2065 2071 29114dbae42b
2066 2072 d41e714fe50d
2067 2073 13207e5a10d9
2068 2074 bbe44766e73d
2069 2075 10e46f2dcbf4
2070 2076 97054abb4ab8
2071 2077 b608e9d1a3f0
2072 2078 1e4e1b8f71e0
2073 2079
2074 2080 $ hg log --template '<changeset author="{author|xmlescape}"/>\n'
2075 2081 <changeset author="test"/>
2076 2082 <changeset author="User Name &lt;user@hostname&gt;"/>
2077 2083 <changeset author="person"/>
2078 2084 <changeset author="person"/>
2079 2085 <changeset author="person"/>
2080 2086 <changeset author="person"/>
2081 2087 <changeset author="other@place"/>
2082 2088 <changeset author="A. N. Other &lt;other@place&gt;"/>
2083 2089 <changeset author="User Name &lt;user@hostname&gt;"/>
2084 2090
2085 2091 $ hg log --template '{rev}: {children}\n'
2086 2092 8:
2087 2093 7: 8:95c24699272e
2088 2094 6:
2089 2095 5: 6:d41e714fe50d
2090 2096 4: 6:d41e714fe50d
2091 2097 3: 4:bbe44766e73d 5:13207e5a10d9
2092 2098 2: 3:10e46f2dcbf4
2093 2099 1: 2:97054abb4ab8
2094 2100 0: 1:b608e9d1a3f0
2095 2101
2096 2102 Formatnode filter works:
2097 2103
2098 2104 $ hg -q log -r 0 --template '{node|formatnode}\n'
2099 2105 1e4e1b8f71e0
2100 2106
2101 2107 $ hg log -r 0 --template '{node|formatnode}\n'
2102 2108 1e4e1b8f71e0
2103 2109
2104 2110 $ hg -v log -r 0 --template '{node|formatnode}\n'
2105 2111 1e4e1b8f71e0
2106 2112
2107 2113 $ hg --debug log -r 0 --template '{node|formatnode}\n'
2108 2114 1e4e1b8f71e05681d422154f5421e385fec3454f
2109 2115
2110 2116 Age filter:
2111 2117
2112 2118 $ hg init unstable-hash
2113 2119 $ cd unstable-hash
2114 2120 $ hg log --template '{date|age}\n' > /dev/null || exit 1
2115 2121
2116 2122 >>> from datetime import datetime, timedelta
2117 2123 >>> fp = open('a', 'w')
2118 2124 >>> n = datetime.now() + timedelta(366 * 7)
2119 2125 >>> fp.write('%d-%d-%d 00:00' % (n.year, n.month, n.day))
2120 2126 >>> fp.close()
2121 2127 $ hg add a
2122 2128 $ hg commit -m future -d "`cat a`"
2123 2129
2124 2130 $ hg log -l1 --template '{date|age}\n'
2125 2131 7 years from now
2126 2132
2127 2133 $ cd ..
2128 2134 $ rm -rf unstable-hash
2129 2135
2130 2136 Add a dummy commit to make up for the instability of the above:
2131 2137
2132 2138 $ echo a > a
2133 2139 $ hg add a
2134 2140 $ hg ci -m future
2135 2141
2136 2142 Count filter:
2137 2143
2138 2144 $ hg log -l1 --template '{node|count} {node|short|count}\n'
2139 2145 40 12
2140 2146
2141 2147 $ hg log -l1 --template '{revset("null^")|count} {revset(".")|count} {revset("0::3")|count}\n'
2142 2148 0 1 4
2143 2149
2144 2150 $ hg log -G --template '{rev}: children: {children|count}, \
2145 2151 > tags: {tags|count}, file_adds: {file_adds|count}, \
2146 2152 > ancestors: {revset("ancestors(%s)", rev)|count}'
2147 2153 @ 9: children: 0, tags: 1, file_adds: 1, ancestors: 3
2148 2154 |
2149 2155 o 8: children: 1, tags: 0, file_adds: 2, ancestors: 2
2150 2156 |
2151 2157 o 7: children: 1, tags: 0, file_adds: 1, ancestors: 1
2152 2158
2153 2159 o 6: children: 0, tags: 0, file_adds: 0, ancestors: 7
2154 2160 |\
2155 2161 | o 5: children: 1, tags: 0, file_adds: 1, ancestors: 5
2156 2162 | |
2157 2163 o | 4: children: 1, tags: 0, file_adds: 0, ancestors: 5
2158 2164 |/
2159 2165 o 3: children: 2, tags: 0, file_adds: 0, ancestors: 4
2160 2166 |
2161 2167 o 2: children: 1, tags: 0, file_adds: 1, ancestors: 3
2162 2168 |
2163 2169 o 1: children: 1, tags: 0, file_adds: 1, ancestors: 2
2164 2170 |
2165 2171 o 0: children: 1, tags: 0, file_adds: 1, ancestors: 1
2166 2172
2167 2173
2168 2174 Upper/lower filters:
2169 2175
2170 2176 $ hg log -r0 --template '{branch|upper}\n'
2171 2177 DEFAULT
2172 2178 $ hg log -r0 --template '{author|lower}\n'
2173 2179 user name <user@hostname>
2174 2180 $ hg log -r0 --template '{date|upper}\n'
2175 2181 abort: template filter 'upper' is not compatible with keyword 'date'
2176 2182 [255]
2177 2183
2178 2184 Add a commit that does all possible modifications at once
2179 2185
2180 2186 $ echo modify >> third
2181 2187 $ touch b
2182 2188 $ hg add b
2183 2189 $ hg mv fourth fifth
2184 2190 $ hg rm a
2185 2191 $ hg ci -m "Modify, add, remove, rename"
2186 2192
2187 2193 Check the status template
2188 2194
2189 2195 $ cat <<EOF >> $HGRCPATH
2190 2196 > [extensions]
2191 2197 > color=
2192 2198 > EOF
2193 2199
2194 2200 $ hg log -T status -r 10
2195 2201 changeset: 10:0f9759ec227a
2196 2202 tag: tip
2197 2203 user: test
2198 2204 date: Thu Jan 01 00:00:00 1970 +0000
2199 2205 summary: Modify, add, remove, rename
2200 2206 files:
2201 2207 M third
2202 2208 A b
2203 2209 A fifth
2204 2210 R a
2205 2211 R fourth
2206 2212
2207 2213 $ hg log -T status -C -r 10
2208 2214 changeset: 10:0f9759ec227a
2209 2215 tag: tip
2210 2216 user: test
2211 2217 date: Thu Jan 01 00:00:00 1970 +0000
2212 2218 summary: Modify, add, remove, rename
2213 2219 files:
2214 2220 M third
2215 2221 A b
2216 2222 A fifth
2217 2223 fourth
2218 2224 R a
2219 2225 R fourth
2220 2226
2221 2227 $ hg log -T status -C -r 10 -v
2222 2228 changeset: 10:0f9759ec227a
2223 2229 tag: tip
2224 2230 user: test
2225 2231 date: Thu Jan 01 00:00:00 1970 +0000
2226 2232 description:
2227 2233 Modify, add, remove, rename
2228 2234
2229 2235 files:
2230 2236 M third
2231 2237 A b
2232 2238 A fifth
2233 2239 fourth
2234 2240 R a
2235 2241 R fourth
2236 2242
2237 2243 $ hg log -T status -C -r 10 --debug
2238 2244 changeset: 10:0f9759ec227a4859c2014a345cd8a859022b7c6c
2239 2245 tag: tip
2240 2246 phase: secret
2241 2247 parent: 9:bf9dfba36635106d6a73ccc01e28b762da60e066
2242 2248 parent: -1:0000000000000000000000000000000000000000
2243 2249 manifest: 8:89dd546f2de0a9d6d664f58d86097eb97baba567
2244 2250 user: test
2245 2251 date: Thu Jan 01 00:00:00 1970 +0000
2246 2252 extra: branch=default
2247 2253 description:
2248 2254 Modify, add, remove, rename
2249 2255
2250 2256 files:
2251 2257 M third
2252 2258 A b
2253 2259 A fifth
2254 2260 fourth
2255 2261 R a
2256 2262 R fourth
2257 2263
2258 2264 $ hg log -T status -C -r 10 --quiet
2259 2265 10:0f9759ec227a
2260 2266 $ hg --color=debug log -T status -r 10
2261 2267 [log.changeset changeset.secret|changeset: 10:0f9759ec227a]
2262 2268 [log.tag|tag: tip]
2263 2269 [log.user|user: test]
2264 2270 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
2265 2271 [log.summary|summary: Modify, add, remove, rename]
2266 2272 [ui.note log.files|files:]
2267 2273 [status.modified|M third]
2268 2274 [status.added|A b]
2269 2275 [status.added|A fifth]
2270 2276 [status.removed|R a]
2271 2277 [status.removed|R fourth]
2272 2278
2273 2279 $ hg --color=debug log -T status -C -r 10
2274 2280 [log.changeset changeset.secret|changeset: 10:0f9759ec227a]
2275 2281 [log.tag|tag: tip]
2276 2282 [log.user|user: test]
2277 2283 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
2278 2284 [log.summary|summary: Modify, add, remove, rename]
2279 2285 [ui.note log.files|files:]
2280 2286 [status.modified|M third]
2281 2287 [status.added|A b]
2282 2288 [status.added|A fifth]
2283 2289 [status.copied| fourth]
2284 2290 [status.removed|R a]
2285 2291 [status.removed|R fourth]
2286 2292
2287 2293 $ hg --color=debug log -T status -C -r 10 -v
2288 2294 [log.changeset changeset.secret|changeset: 10:0f9759ec227a]
2289 2295 [log.tag|tag: tip]
2290 2296 [log.user|user: test]
2291 2297 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
2292 2298 [ui.note log.description|description:]
2293 2299 [ui.note log.description|Modify, add, remove, rename]
2294 2300
2295 2301 [ui.note log.files|files:]
2296 2302 [status.modified|M third]
2297 2303 [status.added|A b]
2298 2304 [status.added|A fifth]
2299 2305 [status.copied| fourth]
2300 2306 [status.removed|R a]
2301 2307 [status.removed|R fourth]
2302 2308
2303 2309 $ hg --color=debug log -T status -C -r 10 --debug
2304 2310 [log.changeset changeset.secret|changeset: 10:0f9759ec227a4859c2014a345cd8a859022b7c6c]
2305 2311 [log.tag|tag: tip]
2306 2312 [log.phase|phase: secret]
2307 2313 [log.parent changeset.secret|parent: 9:bf9dfba36635106d6a73ccc01e28b762da60e066]
2308 2314 [log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
2309 2315 [ui.debug log.manifest|manifest: 8:89dd546f2de0a9d6d664f58d86097eb97baba567]
2310 2316 [log.user|user: test]
2311 2317 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
2312 2318 [ui.debug log.extra|extra: branch=default]
2313 2319 [ui.note log.description|description:]
2314 2320 [ui.note log.description|Modify, add, remove, rename]
2315 2321
2316 2322 [ui.note log.files|files:]
2317 2323 [status.modified|M third]
2318 2324 [status.added|A b]
2319 2325 [status.added|A fifth]
2320 2326 [status.copied| fourth]
2321 2327 [status.removed|R a]
2322 2328 [status.removed|R fourth]
2323 2329
2324 2330 $ hg --color=debug log -T status -C -r 10 --quiet
2325 2331 [log.node|10:0f9759ec227a]
2326 2332
2327 2333 Check the bisect template
2328 2334
2329 2335 $ hg bisect -g 1
2330 2336 $ hg bisect -b 3 --noupdate
2331 2337 Testing changeset 2:97054abb4ab8 (2 changesets remaining, ~1 tests)
2332 2338 $ hg log -T bisect -r 0:4
2333 2339 changeset: 0:1e4e1b8f71e0
2334 2340 bisect: good (implicit)
2335 2341 user: User Name <user@hostname>
2336 2342 date: Mon Jan 12 13:46:40 1970 +0000
2337 2343 summary: line 1
2338 2344
2339 2345 changeset: 1:b608e9d1a3f0
2340 2346 bisect: good
2341 2347 user: A. N. Other <other@place>
2342 2348 date: Tue Jan 13 17:33:20 1970 +0000
2343 2349 summary: other 1
2344 2350
2345 2351 changeset: 2:97054abb4ab8
2346 2352 bisect: untested
2347 2353 user: other@place
2348 2354 date: Wed Jan 14 21:20:00 1970 +0000
2349 2355 summary: no person
2350 2356
2351 2357 changeset: 3:10e46f2dcbf4
2352 2358 bisect: bad
2353 2359 user: person
2354 2360 date: Fri Jan 16 01:06:40 1970 +0000
2355 2361 summary: no user, no domain
2356 2362
2357 2363 changeset: 4:bbe44766e73d
2358 2364 bisect: bad (implicit)
2359 2365 branch: foo
2360 2366 user: person
2361 2367 date: Sat Jan 17 04:53:20 1970 +0000
2362 2368 summary: new branch
2363 2369
2364 2370 $ hg log --debug -T bisect -r 0:4
2365 2371 changeset: 0:1e4e1b8f71e05681d422154f5421e385fec3454f
2366 2372 bisect: good (implicit)
2367 2373 phase: public
2368 2374 parent: -1:0000000000000000000000000000000000000000
2369 2375 parent: -1:0000000000000000000000000000000000000000
2370 2376 manifest: 0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0
2371 2377 user: User Name <user@hostname>
2372 2378 date: Mon Jan 12 13:46:40 1970 +0000
2373 2379 files+: a
2374 2380 extra: branch=default
2375 2381 description:
2376 2382 line 1
2377 2383 line 2
2378 2384
2379 2385
2380 2386 changeset: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965
2381 2387 bisect: good
2382 2388 phase: public
2383 2389 parent: 0:1e4e1b8f71e05681d422154f5421e385fec3454f
2384 2390 parent: -1:0000000000000000000000000000000000000000
2385 2391 manifest: 1:4e8d705b1e53e3f9375e0e60dc7b525d8211fe55
2386 2392 user: A. N. Other <other@place>
2387 2393 date: Tue Jan 13 17:33:20 1970 +0000
2388 2394 files+: b
2389 2395 extra: branch=default
2390 2396 description:
2391 2397 other 1
2392 2398 other 2
2393 2399
2394 2400 other 3
2395 2401
2396 2402
2397 2403 changeset: 2:97054abb4ab824450e9164180baf491ae0078465
2398 2404 bisect: untested
2399 2405 phase: public
2400 2406 parent: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965
2401 2407 parent: -1:0000000000000000000000000000000000000000
2402 2408 manifest: 2:6e0e82995c35d0d57a52aca8da4e56139e06b4b1
2403 2409 user: other@place
2404 2410 date: Wed Jan 14 21:20:00 1970 +0000
2405 2411 files+: c
2406 2412 extra: branch=default
2407 2413 description:
2408 2414 no person
2409 2415
2410 2416
2411 2417 changeset: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47
2412 2418 bisect: bad
2413 2419 phase: public
2414 2420 parent: 2:97054abb4ab824450e9164180baf491ae0078465
2415 2421 parent: -1:0000000000000000000000000000000000000000
2416 2422 manifest: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
2417 2423 user: person
2418 2424 date: Fri Jan 16 01:06:40 1970 +0000
2419 2425 files: c
2420 2426 extra: branch=default
2421 2427 description:
2422 2428 no user, no domain
2423 2429
2424 2430
2425 2431 changeset: 4:bbe44766e73d5f11ed2177f1838de10c53ef3e74
2426 2432 bisect: bad (implicit)
2427 2433 branch: foo
2428 2434 phase: draft
2429 2435 parent: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47
2430 2436 parent: -1:0000000000000000000000000000000000000000
2431 2437 manifest: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
2432 2438 user: person
2433 2439 date: Sat Jan 17 04:53:20 1970 +0000
2434 2440 extra: branch=foo
2435 2441 description:
2436 2442 new branch
2437 2443
2438 2444
2439 2445 $ hg log -v -T bisect -r 0:4
2440 2446 changeset: 0:1e4e1b8f71e0
2441 2447 bisect: good (implicit)
2442 2448 user: User Name <user@hostname>
2443 2449 date: Mon Jan 12 13:46:40 1970 +0000
2444 2450 files: a
2445 2451 description:
2446 2452 line 1
2447 2453 line 2
2448 2454
2449 2455
2450 2456 changeset: 1:b608e9d1a3f0
2451 2457 bisect: good
2452 2458 user: A. N. Other <other@place>
2453 2459 date: Tue Jan 13 17:33:20 1970 +0000
2454 2460 files: b
2455 2461 description:
2456 2462 other 1
2457 2463 other 2
2458 2464
2459 2465 other 3
2460 2466
2461 2467
2462 2468 changeset: 2:97054abb4ab8
2463 2469 bisect: untested
2464 2470 user: other@place
2465 2471 date: Wed Jan 14 21:20:00 1970 +0000
2466 2472 files: c
2467 2473 description:
2468 2474 no person
2469 2475
2470 2476
2471 2477 changeset: 3:10e46f2dcbf4
2472 2478 bisect: bad
2473 2479 user: person
2474 2480 date: Fri Jan 16 01:06:40 1970 +0000
2475 2481 files: c
2476 2482 description:
2477 2483 no user, no domain
2478 2484
2479 2485
2480 2486 changeset: 4:bbe44766e73d
2481 2487 bisect: bad (implicit)
2482 2488 branch: foo
2483 2489 user: person
2484 2490 date: Sat Jan 17 04:53:20 1970 +0000
2485 2491 description:
2486 2492 new branch
2487 2493
2488 2494
2489 2495 $ hg --color=debug log -T bisect -r 0:4
2490 2496 [log.changeset changeset.public|changeset: 0:1e4e1b8f71e0]
2491 2497 [log.bisect bisect.good|bisect: good (implicit)]
2492 2498 [log.user|user: User Name <user@hostname>]
2493 2499 [log.date|date: Mon Jan 12 13:46:40 1970 +0000]
2494 2500 [log.summary|summary: line 1]
2495 2501
2496 2502 [log.changeset changeset.public|changeset: 1:b608e9d1a3f0]
2497 2503 [log.bisect bisect.good|bisect: good]
2498 2504 [log.user|user: A. N. Other <other@place>]
2499 2505 [log.date|date: Tue Jan 13 17:33:20 1970 +0000]
2500 2506 [log.summary|summary: other 1]
2501 2507
2502 2508 [log.changeset changeset.public|changeset: 2:97054abb4ab8]
2503 2509 [log.bisect bisect.untested|bisect: untested]
2504 2510 [log.user|user: other@place]
2505 2511 [log.date|date: Wed Jan 14 21:20:00 1970 +0000]
2506 2512 [log.summary|summary: no person]
2507 2513
2508 2514 [log.changeset changeset.public|changeset: 3:10e46f2dcbf4]
2509 2515 [log.bisect bisect.bad|bisect: bad]
2510 2516 [log.user|user: person]
2511 2517 [log.date|date: Fri Jan 16 01:06:40 1970 +0000]
2512 2518 [log.summary|summary: no user, no domain]
2513 2519
2514 2520 [log.changeset changeset.draft|changeset: 4:bbe44766e73d]
2515 2521 [log.bisect bisect.bad|bisect: bad (implicit)]
2516 2522 [log.branch|branch: foo]
2517 2523 [log.user|user: person]
2518 2524 [log.date|date: Sat Jan 17 04:53:20 1970 +0000]
2519 2525 [log.summary|summary: new branch]
2520 2526
2521 2527 $ hg --color=debug log --debug -T bisect -r 0:4
2522 2528 [log.changeset changeset.public|changeset: 0:1e4e1b8f71e05681d422154f5421e385fec3454f]
2523 2529 [log.bisect bisect.good|bisect: good (implicit)]
2524 2530 [log.phase|phase: public]
2525 2531 [log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
2526 2532 [log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
2527 2533 [ui.debug log.manifest|manifest: 0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0]
2528 2534 [log.user|user: User Name <user@hostname>]
2529 2535 [log.date|date: Mon Jan 12 13:46:40 1970 +0000]
2530 2536 [ui.debug log.files|files+: a]
2531 2537 [ui.debug log.extra|extra: branch=default]
2532 2538 [ui.note log.description|description:]
2533 2539 [ui.note log.description|line 1
2534 2540 line 2]
2535 2541
2536 2542
2537 2543 [log.changeset changeset.public|changeset: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965]
2538 2544 [log.bisect bisect.good|bisect: good]
2539 2545 [log.phase|phase: public]
2540 2546 [log.parent changeset.public|parent: 0:1e4e1b8f71e05681d422154f5421e385fec3454f]
2541 2547 [log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
2542 2548 [ui.debug log.manifest|manifest: 1:4e8d705b1e53e3f9375e0e60dc7b525d8211fe55]
2543 2549 [log.user|user: A. N. Other <other@place>]
2544 2550 [log.date|date: Tue Jan 13 17:33:20 1970 +0000]
2545 2551 [ui.debug log.files|files+: b]
2546 2552 [ui.debug log.extra|extra: branch=default]
2547 2553 [ui.note log.description|description:]
2548 2554 [ui.note log.description|other 1
2549 2555 other 2
2550 2556
2551 2557 other 3]
2552 2558
2553 2559
2554 2560 [log.changeset changeset.public|changeset: 2:97054abb4ab824450e9164180baf491ae0078465]
2555 2561 [log.bisect bisect.untested|bisect: untested]
2556 2562 [log.phase|phase: public]
2557 2563 [log.parent changeset.public|parent: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965]
2558 2564 [log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
2559 2565 [ui.debug log.manifest|manifest: 2:6e0e82995c35d0d57a52aca8da4e56139e06b4b1]
2560 2566 [log.user|user: other@place]
2561 2567 [log.date|date: Wed Jan 14 21:20:00 1970 +0000]
2562 2568 [ui.debug log.files|files+: c]
2563 2569 [ui.debug log.extra|extra: branch=default]
2564 2570 [ui.note log.description|description:]
2565 2571 [ui.note log.description|no person]
2566 2572
2567 2573
2568 2574 [log.changeset changeset.public|changeset: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47]
2569 2575 [log.bisect bisect.bad|bisect: bad]
2570 2576 [log.phase|phase: public]
2571 2577 [log.parent changeset.public|parent: 2:97054abb4ab824450e9164180baf491ae0078465]
2572 2578 [log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
2573 2579 [ui.debug log.manifest|manifest: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc]
2574 2580 [log.user|user: person]
2575 2581 [log.date|date: Fri Jan 16 01:06:40 1970 +0000]
2576 2582 [ui.debug log.files|files: c]
2577 2583 [ui.debug log.extra|extra: branch=default]
2578 2584 [ui.note log.description|description:]
2579 2585 [ui.note log.description|no user, no domain]
2580 2586
2581 2587
2582 2588 [log.changeset changeset.draft|changeset: 4:bbe44766e73d5f11ed2177f1838de10c53ef3e74]
2583 2589 [log.bisect bisect.bad|bisect: bad (implicit)]
2584 2590 [log.branch|branch: foo]
2585 2591 [log.phase|phase: draft]
2586 2592 [log.parent changeset.public|parent: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47]
2587 2593 [log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
2588 2594 [ui.debug log.manifest|manifest: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc]
2589 2595 [log.user|user: person]
2590 2596 [log.date|date: Sat Jan 17 04:53:20 1970 +0000]
2591 2597 [ui.debug log.extra|extra: branch=foo]
2592 2598 [ui.note log.description|description:]
2593 2599 [ui.note log.description|new branch]
2594 2600
2595 2601
2596 2602 $ hg --color=debug log -v -T bisect -r 0:4
2597 2603 [log.changeset changeset.public|changeset: 0:1e4e1b8f71e0]
2598 2604 [log.bisect bisect.good|bisect: good (implicit)]
2599 2605 [log.user|user: User Name <user@hostname>]
2600 2606 [log.date|date: Mon Jan 12 13:46:40 1970 +0000]
2601 2607 [ui.note log.files|files: a]
2602 2608 [ui.note log.description|description:]
2603 2609 [ui.note log.description|line 1
2604 2610 line 2]
2605 2611
2606 2612
2607 2613 [log.changeset changeset.public|changeset: 1:b608e9d1a3f0]
2608 2614 [log.bisect bisect.good|bisect: good]
2609 2615 [log.user|user: A. N. Other <other@place>]
2610 2616 [log.date|date: Tue Jan 13 17:33:20 1970 +0000]
2611 2617 [ui.note log.files|files: b]
2612 2618 [ui.note log.description|description:]
2613 2619 [ui.note log.description|other 1
2614 2620 other 2
2615 2621
2616 2622 other 3]
2617 2623
2618 2624
2619 2625 [log.changeset changeset.public|changeset: 2:97054abb4ab8]
2620 2626 [log.bisect bisect.untested|bisect: untested]
2621 2627 [log.user|user: other@place]
2622 2628 [log.date|date: Wed Jan 14 21:20:00 1970 +0000]
2623 2629 [ui.note log.files|files: c]
2624 2630 [ui.note log.description|description:]
2625 2631 [ui.note log.description|no person]
2626 2632
2627 2633
2628 2634 [log.changeset changeset.public|changeset: 3:10e46f2dcbf4]
2629 2635 [log.bisect bisect.bad|bisect: bad]
2630 2636 [log.user|user: person]
2631 2637 [log.date|date: Fri Jan 16 01:06:40 1970 +0000]
2632 2638 [ui.note log.files|files: c]
2633 2639 [ui.note log.description|description:]
2634 2640 [ui.note log.description|no user, no domain]
2635 2641
2636 2642
2637 2643 [log.changeset changeset.draft|changeset: 4:bbe44766e73d]
2638 2644 [log.bisect bisect.bad|bisect: bad (implicit)]
2639 2645 [log.branch|branch: foo]
2640 2646 [log.user|user: person]
2641 2647 [log.date|date: Sat Jan 17 04:53:20 1970 +0000]
2642 2648 [ui.note log.description|description:]
2643 2649 [ui.note log.description|new branch]
2644 2650
2645 2651
2646 2652 $ hg bisect --reset
2647 2653
2648 2654 Error on syntax:
2649 2655
2650 2656 $ echo 'x = "f' >> t
2651 2657 $ hg log
2652 2658 hg: parse error at t:3: unmatched quotes
2653 2659 [255]
2654 2660
2655 2661 $ hg log -T '{date'
2656 2662 hg: parse error at 1: unterminated template expansion
2657 2663 [255]
2658 2664
2659 2665 Behind the scenes, this will throw TypeError
2660 2666
2661 2667 $ hg log -l 3 --template '{date|obfuscate}\n'
2662 2668 abort: template filter 'obfuscate' is not compatible with keyword 'date'
2663 2669 [255]
2664 2670
2665 2671 Behind the scenes, this will throw a ValueError
2666 2672
2667 2673 $ hg log -l 3 --template 'line: {desc|shortdate}\n'
2668 2674 abort: template filter 'shortdate' is not compatible with keyword 'desc'
2669 2675 [255]
2670 2676
2671 2677 Behind the scenes, this will throw AttributeError
2672 2678
2673 2679 $ hg log -l 3 --template 'line: {date|escape}\n'
2674 2680 abort: template filter 'escape' is not compatible with keyword 'date'
2675 2681 [255]
2676 2682
2677 2683 $ hg log -l 3 --template 'line: {extras|localdate}\n'
2678 2684 hg: parse error: localdate expects a date information
2679 2685 [255]
2680 2686
2681 2687 Behind the scenes, this will throw ValueError
2682 2688
2683 2689 $ hg tip --template '{author|email|date}\n'
2684 2690 hg: parse error: date expects a date information
2685 2691 [255]
2686 2692
2687 2693 $ hg tip -T '{author|email|shortdate}\n'
2688 2694 abort: template filter 'shortdate' is not compatible with keyword 'author'
2689 2695 [255]
2690 2696
2691 2697 $ hg tip -T '{get(extras, "branch")|shortdate}\n'
2692 2698 abort: incompatible use of template filter 'shortdate'
2693 2699 [255]
2694 2700
2695 2701 Error in nested template:
2696 2702
2697 2703 $ hg log -T '{"date'
2698 2704 hg: parse error at 2: unterminated string
2699 2705 [255]
2700 2706
2701 2707 $ hg log -T '{"foo{date|?}"}'
2702 2708 hg: parse error at 11: syntax error
2703 2709 [255]
2704 2710
2705 2711 Thrown an error if a template function doesn't exist
2706 2712
2707 2713 $ hg tip --template '{foo()}\n'
2708 2714 hg: parse error: unknown function 'foo'
2709 2715 [255]
2710 2716
2711 2717 Pass generator object created by template function to filter
2712 2718
2713 2719 $ hg log -l 1 --template '{if(author, author)|user}\n'
2714 2720 test
2715 2721
2716 2722 Test index keyword:
2717 2723
2718 2724 $ hg log -l 2 -T '{index + 10}{files % " {index}:{file}"}\n'
2719 2725 10 0:a 1:b 2:fifth 3:fourth 4:third
2720 2726 11 0:a
2721 2727
2722 2728 $ hg branches -T '{index} {branch}\n'
2723 2729 0 default
2724 2730 1 foo
2725 2731
2726 2732 Test diff function:
2727 2733
2728 2734 $ hg diff -c 8
2729 2735 diff -r 29114dbae42b -r 95c24699272e fourth
2730 2736 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2731 2737 +++ b/fourth Wed Jan 01 10:01:00 2020 +0000
2732 2738 @@ -0,0 +1,1 @@
2733 2739 +second
2734 2740 diff -r 29114dbae42b -r 95c24699272e second
2735 2741 --- a/second Mon Jan 12 13:46:40 1970 +0000
2736 2742 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
2737 2743 @@ -1,1 +0,0 @@
2738 2744 -second
2739 2745 diff -r 29114dbae42b -r 95c24699272e third
2740 2746 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2741 2747 +++ b/third Wed Jan 01 10:01:00 2020 +0000
2742 2748 @@ -0,0 +1,1 @@
2743 2749 +third
2744 2750
2745 2751 $ hg log -r 8 -T "{diff()}"
2746 2752 diff -r 29114dbae42b -r 95c24699272e fourth
2747 2753 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2748 2754 +++ b/fourth Wed Jan 01 10:01:00 2020 +0000
2749 2755 @@ -0,0 +1,1 @@
2750 2756 +second
2751 2757 diff -r 29114dbae42b -r 95c24699272e second
2752 2758 --- a/second Mon Jan 12 13:46:40 1970 +0000
2753 2759 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
2754 2760 @@ -1,1 +0,0 @@
2755 2761 -second
2756 2762 diff -r 29114dbae42b -r 95c24699272e third
2757 2763 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2758 2764 +++ b/third Wed Jan 01 10:01:00 2020 +0000
2759 2765 @@ -0,0 +1,1 @@
2760 2766 +third
2761 2767
2762 2768 $ hg log -r 8 -T "{diff('glob:f*')}"
2763 2769 diff -r 29114dbae42b -r 95c24699272e fourth
2764 2770 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2765 2771 +++ b/fourth Wed Jan 01 10:01:00 2020 +0000
2766 2772 @@ -0,0 +1,1 @@
2767 2773 +second
2768 2774
2769 2775 $ hg log -r 8 -T "{diff('', 'glob:f*')}"
2770 2776 diff -r 29114dbae42b -r 95c24699272e second
2771 2777 --- a/second Mon Jan 12 13:46:40 1970 +0000
2772 2778 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
2773 2779 @@ -1,1 +0,0 @@
2774 2780 -second
2775 2781 diff -r 29114dbae42b -r 95c24699272e third
2776 2782 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2777 2783 +++ b/third Wed Jan 01 10:01:00 2020 +0000
2778 2784 @@ -0,0 +1,1 @@
2779 2785 +third
2780 2786
2781 2787 $ hg log -r 8 -T "{diff('FOURTH'|lower)}"
2782 2788 diff -r 29114dbae42b -r 95c24699272e fourth
2783 2789 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2784 2790 +++ b/fourth Wed Jan 01 10:01:00 2020 +0000
2785 2791 @@ -0,0 +1,1 @@
2786 2792 +second
2787 2793
2788 2794 $ cd ..
2789 2795
2790 2796
2791 2797 latesttag:
2792 2798
2793 2799 $ hg init latesttag
2794 2800 $ cd latesttag
2795 2801
2796 2802 $ echo a > file
2797 2803 $ hg ci -Am a -d '0 0'
2798 2804 adding file
2799 2805
2800 2806 $ echo b >> file
2801 2807 $ hg ci -m b -d '1 0'
2802 2808
2803 2809 $ echo c >> head1
2804 2810 $ hg ci -Am h1c -d '2 0'
2805 2811 adding head1
2806 2812
2807 2813 $ hg update -q 1
2808 2814 $ echo d >> head2
2809 2815 $ hg ci -Am h2d -d '3 0'
2810 2816 adding head2
2811 2817 created new head
2812 2818
2813 2819 $ echo e >> head2
2814 2820 $ hg ci -m h2e -d '4 0'
2815 2821
2816 2822 $ hg merge -q
2817 2823 $ hg ci -m merge -d '5 -3600'
2818 2824
2819 2825 No tag set:
2820 2826
2821 2827 $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n'
2822 2828 5: null+5
2823 2829 4: null+4
2824 2830 3: null+3
2825 2831 2: null+3
2826 2832 1: null+2
2827 2833 0: null+1
2828 2834
2829 2835 One common tag: longest path wins:
2830 2836
2831 2837 $ hg tag -r 1 -m t1 -d '6 0' t1
2832 2838 $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n'
2833 2839 6: t1+4
2834 2840 5: t1+3
2835 2841 4: t1+2
2836 2842 3: t1+1
2837 2843 2: t1+1
2838 2844 1: t1+0
2839 2845 0: null+1
2840 2846
2841 2847 One ancestor tag: more recent wins:
2842 2848
2843 2849 $ hg tag -r 2 -m t2 -d '7 0' t2
2844 2850 $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n'
2845 2851 7: t2+3
2846 2852 6: t2+2
2847 2853 5: t2+1
2848 2854 4: t1+2
2849 2855 3: t1+1
2850 2856 2: t2+0
2851 2857 1: t1+0
2852 2858 0: null+1
2853 2859
2854 2860 Two branch tags: more recent wins:
2855 2861
2856 2862 $ hg tag -r 3 -m t3 -d '8 0' t3
2857 2863 $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n'
2858 2864 8: t3+5
2859 2865 7: t3+4
2860 2866 6: t3+3
2861 2867 5: t3+2
2862 2868 4: t3+1
2863 2869 3: t3+0
2864 2870 2: t2+0
2865 2871 1: t1+0
2866 2872 0: null+1
2867 2873
2868 2874 Merged tag overrides:
2869 2875
2870 2876 $ hg tag -r 5 -m t5 -d '9 0' t5
2871 2877 $ hg tag -r 3 -m at3 -d '10 0' at3
2872 2878 $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n'
2873 2879 10: t5+5
2874 2880 9: t5+4
2875 2881 8: t5+3
2876 2882 7: t5+2
2877 2883 6: t5+1
2878 2884 5: t5+0
2879 2885 4: at3:t3+1
2880 2886 3: at3:t3+0
2881 2887 2: t2+0
2882 2888 1: t1+0
2883 2889 0: null+1
2884 2890
2885 2891 $ hg log --template "{rev}: {latesttag % '{tag}+{distance},{changes} '}\n"
2886 2892 10: t5+5,5
2887 2893 9: t5+4,4
2888 2894 8: t5+3,3
2889 2895 7: t5+2,2
2890 2896 6: t5+1,1
2891 2897 5: t5+0,0
2892 2898 4: at3+1,1 t3+1,1
2893 2899 3: at3+0,0 t3+0,0
2894 2900 2: t2+0,0
2895 2901 1: t1+0,0
2896 2902 0: null+1,1
2897 2903
2898 2904 $ hg log --template "{rev}: {latesttag('re:^t[13]$') % '{tag}, C: {changes}, D: {distance}'}\n"
2899 2905 10: t3, C: 8, D: 7
2900 2906 9: t3, C: 7, D: 6
2901 2907 8: t3, C: 6, D: 5
2902 2908 7: t3, C: 5, D: 4
2903 2909 6: t3, C: 4, D: 3
2904 2910 5: t3, C: 3, D: 2
2905 2911 4: t3, C: 1, D: 1
2906 2912 3: t3, C: 0, D: 0
2907 2913 2: t1, C: 1, D: 1
2908 2914 1: t1, C: 0, D: 0
2909 2915 0: null, C: 1, D: 1
2910 2916
2911 2917 $ cd ..
2912 2918
2913 2919
2914 2920 Style path expansion: issue1948 - ui.style option doesn't work on OSX
2915 2921 if it is a relative path
2916 2922
2917 2923 $ mkdir -p home/styles
2918 2924
2919 2925 $ cat > home/styles/teststyle <<EOF
2920 2926 > changeset = 'test {rev}:{node|short}\n'
2921 2927 > EOF
2922 2928
2923 2929 $ HOME=`pwd`/home; export HOME
2924 2930
2925 2931 $ cat > latesttag/.hg/hgrc <<EOF
2926 2932 > [ui]
2927 2933 > style = ~/styles/teststyle
2928 2934 > EOF
2929 2935
2930 2936 $ hg -R latesttag tip
2931 2937 test 10:9b4a630e5f5f
2932 2938
2933 2939 Test recursive showlist template (issue1989):
2934 2940
2935 2941 $ cat > style1989 <<EOF
2936 2942 > changeset = '{file_mods}{manifest}{extras}'
2937 2943 > file_mod = 'M|{author|person}\n'
2938 2944 > manifest = '{rev},{author}\n'
2939 2945 > extra = '{key}: {author}\n'
2940 2946 > EOF
2941 2947
2942 2948 $ hg -R latesttag log -r tip --style=style1989
2943 2949 M|test
2944 2950 10,test
2945 2951 branch: test
2946 2952
2947 2953 Test new-style inline templating:
2948 2954
2949 2955 $ hg log -R latesttag -r tip --template 'modified files: {file_mods % " {file}\n"}\n'
2950 2956 modified files: .hgtags
2951 2957
2952 2958
2953 2959 $ hg log -R latesttag -r tip -T '{rev % "a"}\n'
2954 2960 hg: parse error: keyword 'rev' is not iterable
2955 2961 [255]
2956 2962 $ hg log -R latesttag -r tip -T '{get(extras, "unknown") % "a"}\n'
2957 2963 hg: parse error: None is not iterable
2958 2964 [255]
2959 2965
2960 2966 Test the sub function of templating for expansion:
2961 2967
2962 2968 $ hg log -R latesttag -r 10 --template '{sub("[0-9]", "x", "{rev}")}\n'
2963 2969 xx
2964 2970
2965 2971 $ hg log -R latesttag -r 10 -T '{sub("[", "x", rev)}\n'
2966 2972 hg: parse error: sub got an invalid pattern: [
2967 2973 [255]
2968 2974 $ hg log -R latesttag -r 10 -T '{sub("[0-9]", r"\1", rev)}\n'
2969 2975 hg: parse error: sub got an invalid replacement: \1
2970 2976 [255]
2971 2977
2972 2978 Test the strip function with chars specified:
2973 2979
2974 2980 $ hg log -R latesttag --template '{desc}\n'
2975 2981 at3
2976 2982 t5
2977 2983 t3
2978 2984 t2
2979 2985 t1
2980 2986 merge
2981 2987 h2e
2982 2988 h2d
2983 2989 h1c
2984 2990 b
2985 2991 a
2986 2992
2987 2993 $ hg log -R latesttag --template '{strip(desc, "te")}\n'
2988 2994 at3
2989 2995 5
2990 2996 3
2991 2997 2
2992 2998 1
2993 2999 merg
2994 3000 h2
2995 3001 h2d
2996 3002 h1c
2997 3003 b
2998 3004 a
2999 3005
3000 3006 Test date format:
3001 3007
3002 3008 $ hg log -R latesttag --template 'date: {date(date, "%y %m %d %S %z")}\n'
3003 3009 date: 70 01 01 10 +0000
3004 3010 date: 70 01 01 09 +0000
3005 3011 date: 70 01 01 08 +0000
3006 3012 date: 70 01 01 07 +0000
3007 3013 date: 70 01 01 06 +0000
3008 3014 date: 70 01 01 05 +0100
3009 3015 date: 70 01 01 04 +0000
3010 3016 date: 70 01 01 03 +0000
3011 3017 date: 70 01 01 02 +0000
3012 3018 date: 70 01 01 01 +0000
3013 3019 date: 70 01 01 00 +0000
3014 3020
3015 3021 Test invalid date:
3016 3022
3017 3023 $ hg log -R latesttag -T '{date(rev)}\n'
3018 3024 hg: parse error: date expects a date information
3019 3025 [255]
3020 3026
3021 3027 Test integer literal:
3022 3028
3023 3029 $ hg debugtemplate -v '{(0)}\n'
3024 3030 (template
3025 3031 (group
3026 3032 ('integer', '0'))
3027 3033 ('string', '\n'))
3028 3034 0
3029 3035 $ hg debugtemplate -v '{(123)}\n'
3030 3036 (template
3031 3037 (group
3032 3038 ('integer', '123'))
3033 3039 ('string', '\n'))
3034 3040 123
3035 3041 $ hg debugtemplate -v '{(-4)}\n'
3036 3042 (template
3037 3043 (group
3038 3044 (negate
3039 3045 ('integer', '4')))
3040 3046 ('string', '\n'))
3041 3047 -4
3042 3048 $ hg debugtemplate '{(-)}\n'
3043 3049 hg: parse error at 3: not a prefix: )
3044 3050 [255]
3045 3051 $ hg debugtemplate '{(-a)}\n'
3046 3052 hg: parse error: negation needs an integer argument
3047 3053 [255]
3048 3054
3049 3055 top-level integer literal is interpreted as symbol (i.e. variable name):
3050 3056
3051 3057 $ hg debugtemplate -D 1=one -v '{1}\n'
3052 3058 (template
3053 3059 ('integer', '1')
3054 3060 ('string', '\n'))
3055 3061 one
3056 3062 $ hg debugtemplate -D 1=one -v '{if("t", "{1}")}\n'
3057 3063 (template
3058 3064 (func
3059 3065 ('symbol', 'if')
3060 3066 (list
3061 3067 ('string', 't')
3062 3068 (template
3063 3069 ('integer', '1'))))
3064 3070 ('string', '\n'))
3065 3071 one
3066 3072 $ hg debugtemplate -D 1=one -v '{1|stringify}\n'
3067 3073 (template
3068 3074 (|
3069 3075 ('integer', '1')
3070 3076 ('symbol', 'stringify'))
3071 3077 ('string', '\n'))
3072 3078 one
3073 3079
3074 3080 unless explicit symbol is expected:
3075 3081
3076 3082 $ hg log -Ra -r0 -T '{desc|1}\n'
3077 3083 hg: parse error: expected a symbol, got 'integer'
3078 3084 [255]
3079 3085 $ hg log -Ra -r0 -T '{1()}\n'
3080 3086 hg: parse error: expected a symbol, got 'integer'
3081 3087 [255]
3082 3088
3083 3089 Test string literal:
3084 3090
3085 3091 $ hg debugtemplate -Ra -r0 -v '{"string with no template fragment"}\n'
3086 3092 (template
3087 3093 ('string', 'string with no template fragment')
3088 3094 ('string', '\n'))
3089 3095 string with no template fragment
3090 3096 $ hg debugtemplate -Ra -r0 -v '{"template: {rev}"}\n'
3091 3097 (template
3092 3098 (template
3093 3099 ('string', 'template: ')
3094 3100 ('symbol', 'rev'))
3095 3101 ('string', '\n'))
3096 3102 template: 0
3097 3103 $ hg debugtemplate -Ra -r0 -v '{r"rawstring: {rev}"}\n'
3098 3104 (template
3099 3105 ('string', 'rawstring: {rev}')
3100 3106 ('string', '\n'))
3101 3107 rawstring: {rev}
3102 3108 $ hg debugtemplate -Ra -r0 -v '{files % r"rawstring: {file}"}\n'
3103 3109 (template
3104 3110 (%
3105 3111 ('symbol', 'files')
3106 3112 ('string', 'rawstring: {file}'))
3107 3113 ('string', '\n'))
3108 3114 rawstring: {file}
3109 3115
3110 3116 Test string escaping:
3111 3117
3112 3118 $ hg log -R latesttag -r 0 --template '>\n<>\\n<{if(rev, "[>\n<>\\n<]")}>\n<>\\n<\n'
3113 3119 >
3114 3120 <>\n<[>
3115 3121 <>\n<]>
3116 3122 <>\n<
3117 3123
3118 3124 $ hg log -R latesttag -r 0 \
3119 3125 > --config ui.logtemplate='>\n<>\\n<{if(rev, "[>\n<>\\n<]")}>\n<>\\n<\n'
3120 3126 >
3121 3127 <>\n<[>
3122 3128 <>\n<]>
3123 3129 <>\n<
3124 3130
3125 3131 $ hg log -R latesttag -r 0 -T esc \
3126 3132 > --config templates.esc='>\n<>\\n<{if(rev, "[>\n<>\\n<]")}>\n<>\\n<\n'
3127 3133 >
3128 3134 <>\n<[>
3129 3135 <>\n<]>
3130 3136 <>\n<
3131 3137
3132 3138 $ cat <<'EOF' > esctmpl
3133 3139 > changeset = '>\n<>\\n<{if(rev, "[>\n<>\\n<]")}>\n<>\\n<\n'
3134 3140 > EOF
3135 3141 $ hg log -R latesttag -r 0 --style ./esctmpl
3136 3142 >
3137 3143 <>\n<[>
3138 3144 <>\n<]>
3139 3145 <>\n<
3140 3146
3141 3147 Test string escaping of quotes:
3142 3148
3143 3149 $ hg log -Ra -r0 -T '{"\""}\n'
3144 3150 "
3145 3151 $ hg log -Ra -r0 -T '{"\\\""}\n'
3146 3152 \"
3147 3153 $ hg log -Ra -r0 -T '{r"\""}\n'
3148 3154 \"
3149 3155 $ hg log -Ra -r0 -T '{r"\\\""}\n'
3150 3156 \\\"
3151 3157
3152 3158
3153 3159 $ hg log -Ra -r0 -T '{"\""}\n'
3154 3160 "
3155 3161 $ hg log -Ra -r0 -T '{"\\\""}\n'
3156 3162 \"
3157 3163 $ hg log -Ra -r0 -T '{r"\""}\n'
3158 3164 \"
3159 3165 $ hg log -Ra -r0 -T '{r"\\\""}\n'
3160 3166 \\\"
3161 3167
3162 3168 Test exception in quoted template. single backslash before quotation mark is
3163 3169 stripped before parsing:
3164 3170
3165 3171 $ cat <<'EOF' > escquotetmpl
3166 3172 > changeset = "\" \\" \\\" \\\\" {files % \"{file}\"}\n"
3167 3173 > EOF
3168 3174 $ cd latesttag
3169 3175 $ hg log -r 2 --style ../escquotetmpl
3170 3176 " \" \" \\" head1
3171 3177
3172 3178 $ hg log -r 2 -T esc --config templates.esc='"{\"valid\"}\n"'
3173 3179 valid
3174 3180 $ hg log -r 2 -T esc --config templates.esc="'"'{\'"'"'valid\'"'"'}\n'"'"
3175 3181 valid
3176 3182
3177 3183 Test compatibility with 2.9.2-3.4 of escaped quoted strings in nested
3178 3184 _evalifliteral() templates (issue4733):
3179 3185
3180 3186 $ hg log -r 2 -T '{if(rev, "\"{rev}")}\n'
3181 3187 "2
3182 3188 $ hg log -r 2 -T '{if(rev, "{if(rev, \"\\\"{rev}\")}")}\n'
3183 3189 "2
3184 3190 $ hg log -r 2 -T '{if(rev, "{if(rev, \"{if(rev, \\\"\\\\\\\"{rev}\\\")}\")}")}\n'
3185 3191 "2
3186 3192
3187 3193 $ hg log -r 2 -T '{if(rev, "\\\"")}\n'
3188 3194 \"
3189 3195 $ hg log -r 2 -T '{if(rev, "{if(rev, \"\\\\\\\"\")}")}\n'
3190 3196 \"
3191 3197 $ hg log -r 2 -T '{if(rev, "{if(rev, \"{if(rev, \\\"\\\\\\\\\\\\\\\"\\\")}\")}")}\n'
3192 3198 \"
3193 3199
3194 3200 $ hg log -r 2 -T '{if(rev, r"\\\"")}\n'
3195 3201 \\\"
3196 3202 $ hg log -r 2 -T '{if(rev, "{if(rev, r\"\\\\\\\"\")}")}\n'
3197 3203 \\\"
3198 3204 $ hg log -r 2 -T '{if(rev, "{if(rev, \"{if(rev, r\\\"\\\\\\\\\\\\\\\"\\\")}\")}")}\n'
3199 3205 \\\"
3200 3206
3201 3207 escaped single quotes and errors:
3202 3208
3203 3209 $ hg log -r 2 -T "{if(rev, '{if(rev, \'foo\')}')}"'\n'
3204 3210 foo
3205 3211 $ hg log -r 2 -T "{if(rev, '{if(rev, r\'foo\')}')}"'\n'
3206 3212 foo
3207 3213 $ hg log -r 2 -T '{if(rev, "{if(rev, \")}")}\n'
3208 3214 hg: parse error at 21: unterminated string
3209 3215 [255]
3210 3216 $ hg log -r 2 -T '{if(rev, \"\\"")}\n'
3211 3217 hg: parse error: trailing \ in string
3212 3218 [255]
3213 3219 $ hg log -r 2 -T '{if(rev, r\"\\"")}\n'
3214 3220 hg: parse error: trailing \ in string
3215 3221 [255]
3216 3222
3217 3223 $ cd ..
3218 3224
3219 3225 Test leading backslashes:
3220 3226
3221 3227 $ cd latesttag
3222 3228 $ hg log -r 2 -T '\{rev} {files % "\{file}"}\n'
3223 3229 {rev} {file}
3224 3230 $ hg log -r 2 -T '\\{rev} {files % "\\{file}"}\n'
3225 3231 \2 \head1
3226 3232 $ hg log -r 2 -T '\\\{rev} {files % "\\\{file}"}\n'
3227 3233 \{rev} \{file}
3228 3234 $ cd ..
3229 3235
3230 3236 Test leading backslashes in "if" expression (issue4714):
3231 3237
3232 3238 $ cd latesttag
3233 3239 $ hg log -r 2 -T '{if("1", "\{rev}")} {if("1", r"\{rev}")}\n'
3234 3240 {rev} \{rev}
3235 3241 $ hg log -r 2 -T '{if("1", "\\{rev}")} {if("1", r"\\{rev}")}\n'
3236 3242 \2 \\{rev}
3237 3243 $ hg log -r 2 -T '{if("1", "\\\{rev}")} {if("1", r"\\\{rev}")}\n'
3238 3244 \{rev} \\\{rev}
3239 3245 $ cd ..
3240 3246
3241 3247 "string-escape"-ed "\x5c\x786e" becomes r"\x6e" (once) or r"n" (twice)
3242 3248
3243 3249 $ hg log -R a -r 0 --template '{if("1", "\x5c\x786e", "NG")}\n'
3244 3250 \x6e
3245 3251 $ hg log -R a -r 0 --template '{if("1", r"\x5c\x786e", "NG")}\n'
3246 3252 \x5c\x786e
3247 3253 $ hg log -R a -r 0 --template '{if("", "NG", "\x5c\x786e")}\n'
3248 3254 \x6e
3249 3255 $ hg log -R a -r 0 --template '{if("", "NG", r"\x5c\x786e")}\n'
3250 3256 \x5c\x786e
3251 3257
3252 3258 $ hg log -R a -r 2 --template '{ifeq("no perso\x6e", desc, "\x5c\x786e", "NG")}\n'
3253 3259 \x6e
3254 3260 $ hg log -R a -r 2 --template '{ifeq(r"no perso\x6e", desc, "NG", r"\x5c\x786e")}\n'
3255 3261 \x5c\x786e
3256 3262 $ hg log -R a -r 2 --template '{ifeq(desc, "no perso\x6e", "\x5c\x786e", "NG")}\n'
3257 3263 \x6e
3258 3264 $ hg log -R a -r 2 --template '{ifeq(desc, r"no perso\x6e", "NG", r"\x5c\x786e")}\n'
3259 3265 \x5c\x786e
3260 3266
3261 3267 $ hg log -R a -r 8 --template '{join(files, "\n")}\n'
3262 3268 fourth
3263 3269 second
3264 3270 third
3265 3271 $ hg log -R a -r 8 --template '{join(files, r"\n")}\n'
3266 3272 fourth\nsecond\nthird
3267 3273
3268 3274 $ hg log -R a -r 2 --template '{rstdoc("1st\n\n2nd", "htm\x6c")}'
3269 3275 <p>
3270 3276 1st
3271 3277 </p>
3272 3278 <p>
3273 3279 2nd
3274 3280 </p>
3275 3281 $ hg log -R a -r 2 --template '{rstdoc(r"1st\n\n2nd", "html")}'
3276 3282 <p>
3277 3283 1st\n\n2nd
3278 3284 </p>
3279 3285 $ hg log -R a -r 2 --template '{rstdoc("1st\n\n2nd", r"htm\x6c")}'
3280 3286 1st
3281 3287
3282 3288 2nd
3283 3289
3284 3290 $ hg log -R a -r 2 --template '{strip(desc, "\x6e")}\n'
3285 3291 o perso
3286 3292 $ hg log -R a -r 2 --template '{strip(desc, r"\x6e")}\n'
3287 3293 no person
3288 3294 $ hg log -R a -r 2 --template '{strip("no perso\x6e", "\x6e")}\n'
3289 3295 o perso
3290 3296 $ hg log -R a -r 2 --template '{strip(r"no perso\x6e", r"\x6e")}\n'
3291 3297 no perso
3292 3298
3293 3299 $ hg log -R a -r 2 --template '{sub("\\x6e", "\x2d", desc)}\n'
3294 3300 -o perso-
3295 3301 $ hg log -R a -r 2 --template '{sub(r"\\x6e", "-", desc)}\n'
3296 3302 no person
3297 3303 $ hg log -R a -r 2 --template '{sub("n", r"\x2d", desc)}\n'
3298 3304 \x2do perso\x2d
3299 3305 $ hg log -R a -r 2 --template '{sub("n", "\x2d", "no perso\x6e")}\n'
3300 3306 -o perso-
3301 3307 $ hg log -R a -r 2 --template '{sub("n", r"\x2d", r"no perso\x6e")}\n'
3302 3308 \x2do perso\x6e
3303 3309
3304 3310 $ hg log -R a -r 8 --template '{files % "{file}\n"}'
3305 3311 fourth
3306 3312 second
3307 3313 third
3308 3314
3309 3315 Test string escaping in nested expression:
3310 3316
3311 3317 $ hg log -R a -r 8 --template '{ifeq(r"\x6e", if("1", "\x5c\x786e"), join(files, "\x5c\x786e"))}\n'
3312 3318 fourth\x6esecond\x6ethird
3313 3319 $ hg log -R a -r 8 --template '{ifeq(if("1", r"\x6e"), "\x5c\x786e", join(files, "\x5c\x786e"))}\n'
3314 3320 fourth\x6esecond\x6ethird
3315 3321
3316 3322 $ hg log -R a -r 8 --template '{join(files, ifeq(branch, "default", "\x5c\x786e"))}\n'
3317 3323 fourth\x6esecond\x6ethird
3318 3324 $ hg log -R a -r 8 --template '{join(files, ifeq(branch, "default", r"\x5c\x786e"))}\n'
3319 3325 fourth\x5c\x786esecond\x5c\x786ethird
3320 3326
3321 3327 $ hg log -R a -r 3:4 --template '{rev}:{sub(if("1", "\x6e"), ifeq(branch, "foo", r"\x5c\x786e", "\x5c\x786e"), desc)}\n'
3322 3328 3:\x6eo user, \x6eo domai\x6e
3323 3329 4:\x5c\x786eew bra\x5c\x786ech
3324 3330
3325 3331 Test quotes in nested expression are evaluated just like a $(command)
3326 3332 substitution in POSIX shells:
3327 3333
3328 3334 $ hg log -R a -r 8 -T '{"{"{rev}:{node|short}"}"}\n'
3329 3335 8:95c24699272e
3330 3336 $ hg log -R a -r 8 -T '{"{"\{{rev}} \"{node|short}\""}"}\n'
3331 3337 {8} "95c24699272e"
3332 3338
3333 3339 Test recursive evaluation:
3334 3340
3335 3341 $ hg init r
3336 3342 $ cd r
3337 3343 $ echo a > a
3338 3344 $ hg ci -Am '{rev}'
3339 3345 adding a
3340 3346 $ hg log -r 0 --template '{if(rev, desc)}\n'
3341 3347 {rev}
3342 3348 $ hg log -r 0 --template '{if(rev, "{author} {rev}")}\n'
3343 3349 test 0
3344 3350
3345 3351 $ hg branch -q 'text.{rev}'
3346 3352 $ echo aa >> aa
3347 3353 $ hg ci -u '{node|short}' -m 'desc to be wrapped desc to be wrapped'
3348 3354
3349 3355 $ hg log -l1 --template '{fill(desc, "20", author, branch)}'
3350 3356 {node|short}desc to
3351 3357 text.{rev}be wrapped
3352 3358 text.{rev}desc to be
3353 3359 text.{rev}wrapped (no-eol)
3354 3360 $ hg log -l1 --template '{fill(desc, "20", "{node|short}:", "text.{rev}:")}'
3355 3361 bcc7ff960b8e:desc to
3356 3362 text.1:be wrapped
3357 3363 text.1:desc to be
3358 3364 text.1:wrapped (no-eol)
3359 3365 $ hg log -l1 -T '{fill(desc, date, "", "")}\n'
3360 3366 hg: parse error: fill expects an integer width
3361 3367 [255]
3362 3368
3363 3369 $ COLUMNS=25 hg log -l1 --template '{fill(desc, termwidth, "{node|short}:", "termwidth.{rev}:")}'
3364 3370 bcc7ff960b8e:desc to be
3365 3371 termwidth.1:wrapped desc
3366 3372 termwidth.1:to be wrapped (no-eol)
3367 3373
3368 3374 $ hg log -l 1 --template '{sub(r"[0-9]", "-", author)}'
3369 3375 {node|short} (no-eol)
3370 3376 $ hg log -l 1 --template '{sub(r"[0-9]", "-", "{node|short}")}'
3371 3377 bcc-ff---b-e (no-eol)
3372 3378
3373 3379 $ cat >> .hg/hgrc <<EOF
3374 3380 > [extensions]
3375 3381 > color=
3376 3382 > [color]
3377 3383 > mode=ansi
3378 3384 > text.{rev} = red
3379 3385 > text.1 = green
3380 3386 > EOF
3381 3387 $ hg log --color=always -l 1 --template '{label(branch, "text\n")}'
3382 3388 \x1b[0;31mtext\x1b[0m (esc)
3383 3389 $ hg log --color=always -l 1 --template '{label("text.{rev}", "text\n")}'
3384 3390 \x1b[0;32mtext\x1b[0m (esc)
3385 3391
3386 3392 color effect can be specified without quoting:
3387 3393
3388 3394 $ hg log --color=always -l 1 --template '{label(red, "text\n")}'
3389 3395 \x1b[0;31mtext\x1b[0m (esc)
3390 3396
3391 3397 color effects can be nested (issue5413)
3392 3398
3393 3399 $ hg debugtemplate --color=always \
3394 3400 > '{label(red, "red{label(magenta, "ma{label(cyan, "cyan")}{label(yellow, "yellow")}genta")}")}\n'
3395 3401 \x1b[0;31mred\x1b[0;35mma\x1b[0;36mcyan\x1b[0m\x1b[0;31m\x1b[0;35m\x1b[0;33myellow\x1b[0m\x1b[0;31m\x1b[0;35mgenta\x1b[0m (esc)
3396 3402
3397 3403 pad() should interact well with color codes (issue5416)
3398 3404
3399 3405 $ hg debugtemplate --color=always \
3400 3406 > '{pad(label(red, "red"), 5, label(cyan, "-"))}\n'
3401 3407 \x1b[0;31mred\x1b[0m\x1b[0;36m-\x1b[0m\x1b[0;36m-\x1b[0m (esc)
3402 3408
3403 3409 label should be no-op if color is disabled:
3404 3410
3405 3411 $ hg log --color=never -l 1 --template '{label(red, "text\n")}'
3406 3412 text
3407 3413 $ hg log --config extensions.color=! -l 1 --template '{label(red, "text\n")}'
3408 3414 text
3409 3415
3410 3416 Test branches inside if statement:
3411 3417
3412 3418 $ hg log -r 0 --template '{if(branches, "yes", "no")}\n'
3413 3419 no
3414 3420
3415 3421 Test dict constructor:
3416 3422
3417 3423 $ hg log -r 0 -T '{dict(y=node|short, x=rev)}\n'
3418 3424 y=f7769ec2ab97 x=0
3419 3425 $ hg log -r 0 -T '{dict(x=rev, y=node|short) % "{key}={value}\n"}'
3420 3426 x=0
3421 3427 y=f7769ec2ab97
3422 3428 $ hg log -r 0 -T '{dict(x=rev, y=node|short)|json}\n'
3423 3429 {"x": 0, "y": "f7769ec2ab97"}
3424 3430 $ hg log -r 0 -T '{dict()|json}\n'
3425 3431 {}
3426 3432
3427 3433 $ hg log -r 0 -T '{dict(rev, node=node|short)}\n'
3428 3434 rev=0 node=f7769ec2ab97
3429 3435 $ hg log -r 0 -T '{dict(rev, node|short)}\n'
3430 3436 rev=0 node=f7769ec2ab97
3431 3437
3432 3438 $ hg log -r 0 -T '{dict(rev, rev=rev)}\n'
3433 3439 hg: parse error: duplicated dict key 'rev' inferred
3434 3440 [255]
3435 3441 $ hg log -r 0 -T '{dict(node, node|short)}\n'
3436 3442 hg: parse error: duplicated dict key 'node' inferred
3437 3443 [255]
3438 3444 $ hg log -r 0 -T '{dict(1 + 2)}'
3439 3445 hg: parse error: dict key cannot be inferred
3440 3446 [255]
3441 3447
3442 3448 $ hg log -r 0 -T '{dict(x=rev, x=node)}'
3443 3449 hg: parse error: dict got multiple values for keyword argument 'x'
3444 3450 [255]
3445 3451
3446 3452 Test get function:
3447 3453
3448 3454 $ hg log -r 0 --template '{get(extras, "branch")}\n'
3449 3455 default
3450 3456 $ hg log -r 0 --template '{get(extras, "br{"anch"}")}\n'
3451 3457 default
3452 3458 $ hg log -r 0 --template '{get(files, "should_fail")}\n'
3453 3459 hg: parse error: get() expects a dict as first argument
3454 3460 [255]
3455 3461
3456 3462 Test json filter applied to hybrid object:
3457 3463
3458 3464 $ hg log -r0 -T '{files|json}\n'
3459 3465 ["a"]
3460 3466 $ hg log -r0 -T '{extras|json}\n'
3461 3467 {"branch": "default"}
3462 3468
3463 3469 Test localdate(date, tz) function:
3464 3470
3465 3471 $ TZ=JST-09 hg log -r0 -T '{date|localdate|isodate}\n'
3466 3472 1970-01-01 09:00 +0900
3467 3473 $ TZ=JST-09 hg log -r0 -T '{localdate(date, "UTC")|isodate}\n'
3468 3474 1970-01-01 00:00 +0000
3469 3475 $ TZ=JST-09 hg log -r0 -T '{localdate(date, "blahUTC")|isodate}\n'
3470 3476 hg: parse error: localdate expects a timezone
3471 3477 [255]
3472 3478 $ TZ=JST-09 hg log -r0 -T '{localdate(date, "+0200")|isodate}\n'
3473 3479 1970-01-01 02:00 +0200
3474 3480 $ TZ=JST-09 hg log -r0 -T '{localdate(date, "0")|isodate}\n'
3475 3481 1970-01-01 00:00 +0000
3476 3482 $ TZ=JST-09 hg log -r0 -T '{localdate(date, 0)|isodate}\n'
3477 3483 1970-01-01 00:00 +0000
3478 3484 $ hg log -r0 -T '{localdate(date, "invalid")|isodate}\n'
3479 3485 hg: parse error: localdate expects a timezone
3480 3486 [255]
3481 3487 $ hg log -r0 -T '{localdate(date, date)|isodate}\n'
3482 3488 hg: parse error: localdate expects a timezone
3483 3489 [255]
3484 3490
3485 3491 Test shortest(node) function:
3486 3492
3487 3493 $ echo b > b
3488 3494 $ hg ci -qAm b
3489 3495 $ hg log --template '{shortest(node)}\n'
3490 3496 e777
3491 3497 bcc7
3492 3498 f776
3493 3499 $ hg log --template '{shortest(node, 10)}\n'
3494 3500 e777603221
3495 3501 bcc7ff960b
3496 3502 f7769ec2ab
3497 3503 $ hg log --template '{node|shortest}\n' -l1
3498 3504 e777
3499 3505
3500 3506 $ hg log -r 0 -T '{shortest(node, "1{"0"}")}\n'
3501 3507 f7769ec2ab
3502 3508 $ hg log -r 0 -T '{shortest(node, "not an int")}\n'
3503 3509 hg: parse error: shortest() expects an integer minlength
3504 3510 [255]
3505 3511
3506 3512 $ hg log -r 'wdir()' -T '{node|shortest}\n'
3507 3513 ffff
3508 3514
3509 3515 $ cd ..
3510 3516
3511 3517 Test shortest(node) with the repo having short hash collision:
3512 3518
3513 3519 $ hg init hashcollision
3514 3520 $ cd hashcollision
3515 3521 $ cat <<EOF >> .hg/hgrc
3516 3522 > [experimental]
3517 3523 > evolution = createmarkers
3518 3524 > EOF
3519 3525 $ echo 0 > a
3520 3526 $ hg ci -qAm 0
3521 3527 $ for i in 17 129 248 242 480 580 617 1057 2857 4025; do
3522 3528 > hg up -q 0
3523 3529 > echo $i > a
3524 3530 > hg ci -qm $i
3525 3531 > done
3526 3532 $ hg up -q null
3527 3533 $ hg log -r0: -T '{rev}:{node}\n'
3528 3534 0:b4e73ffab476aa0ee32ed81ca51e07169844bc6a
3529 3535 1:11424df6dc1dd4ea255eae2b58eaca7831973bbc
3530 3536 2:11407b3f1b9c3e76a79c1ec5373924df096f0499
3531 3537 3:11dd92fe0f39dfdaacdaa5f3997edc533875cfc4
3532 3538 4:10776689e627b465361ad5c296a20a487e153ca4
3533 3539 5:a00be79088084cb3aff086ab799f8790e01a976b
3534 3540 6:a0b0acd79b4498d0052993d35a6a748dd51d13e6
3535 3541 7:a0457b3450b8e1b778f1163b31a435802987fe5d
3536 3542 8:c56256a09cd28e5764f32e8e2810d0f01e2e357a
3537 3543 9:c5623987d205cd6d9d8389bfc40fff9dbb670b48
3538 3544 10:c562ddd9c94164376c20b86b0b4991636a3bf84f
3539 3545 $ hg debugobsolete a00be79088084cb3aff086ab799f8790e01a976b
3540 3546 $ hg debugobsolete c5623987d205cd6d9d8389bfc40fff9dbb670b48
3541 3547 $ hg debugobsolete c562ddd9c94164376c20b86b0b4991636a3bf84f
3542 3548
3543 3549 nodes starting with '11' (we don't have the revision number '11' though)
3544 3550
3545 3551 $ hg log -r 1:3 -T '{rev}:{shortest(node, 0)}\n'
3546 3552 1:1142
3547 3553 2:1140
3548 3554 3:11d
3549 3555
3550 3556 '5:a00' is hidden, but still we have two nodes starting with 'a0'
3551 3557
3552 3558 $ hg log -r 6:7 -T '{rev}:{shortest(node, 0)}\n'
3553 3559 6:a0b
3554 3560 7:a04
3555 3561
3556 3562 node '10' conflicts with the revision number '10' even if it is hidden
3557 3563 (we could exclude hidden revision numbers, but currently we don't)
3558 3564
3559 3565 $ hg log -r 4 -T '{rev}:{shortest(node, 0)}\n'
3560 3566 4:107
3561 3567 $ hg log -r 4 -T '{rev}:{shortest(node, 0)}\n' --hidden
3562 3568 4:107
3563 3569
3564 3570 node 'c562' should be unique if the other 'c562' nodes are hidden
3565 3571 (but we don't try the slow path to filter out hidden nodes for now)
3566 3572
3567 3573 $ hg log -r 8 -T '{rev}:{node|shortest}\n'
3568 3574 8:c5625
3569 3575 $ hg log -r 8:10 -T '{rev}:{node|shortest}\n' --hidden
3570 3576 8:c5625
3571 3577 9:c5623
3572 3578 10:c562d
3573 3579
3574 3580 $ cd ..
3575 3581
3576 3582 Test pad function
3577 3583
3578 3584 $ cd r
3579 3585
3580 3586 $ hg log --template '{pad(rev, 20)} {author|user}\n'
3581 3587 2 test
3582 3588 1 {node|short}
3583 3589 0 test
3584 3590
3585 3591 $ hg log --template '{pad(rev, 20, " ", True)} {author|user}\n'
3586 3592 2 test
3587 3593 1 {node|short}
3588 3594 0 test
3589 3595
3590 3596 $ hg log --template '{pad(rev, 20, "-", False)} {author|user}\n'
3591 3597 2------------------- test
3592 3598 1------------------- {node|short}
3593 3599 0------------------- test
3594 3600
3595 3601 Test template string in pad function
3596 3602
3597 3603 $ hg log -r 0 -T '{pad("\{{rev}}", 10)} {author|user}\n'
3598 3604 {0} test
3599 3605
3600 3606 $ hg log -r 0 -T '{pad(r"\{rev}", 10)} {author|user}\n'
3601 3607 \{rev} test
3602 3608
3603 3609 Test width argument passed to pad function
3604 3610
3605 3611 $ hg log -r 0 -T '{pad(rev, "1{"0"}")} {author|user}\n'
3606 3612 0 test
3607 3613 $ hg log -r 0 -T '{pad(rev, "not an int")}\n'
3608 3614 hg: parse error: pad() expects an integer width
3609 3615 [255]
3610 3616
3611 3617 Test invalid fillchar passed to pad function
3612 3618
3613 3619 $ hg log -r 0 -T '{pad(rev, 10, "")}\n'
3614 3620 hg: parse error: pad() expects a single fill character
3615 3621 [255]
3616 3622 $ hg log -r 0 -T '{pad(rev, 10, "--")}\n'
3617 3623 hg: parse error: pad() expects a single fill character
3618 3624 [255]
3619 3625
3620 3626 Test boolean argument passed to pad function
3621 3627
3622 3628 no crash
3623 3629
3624 3630 $ hg log -r 0 -T '{pad(rev, 10, "-", "f{"oo"}")}\n'
3625 3631 ---------0
3626 3632
3627 3633 string/literal
3628 3634
3629 3635 $ hg log -r 0 -T '{pad(rev, 10, "-", "false")}\n'
3630 3636 ---------0
3631 3637 $ hg log -r 0 -T '{pad(rev, 10, "-", false)}\n'
3632 3638 0---------
3633 3639 $ hg log -r 0 -T '{pad(rev, 10, "-", "")}\n'
3634 3640 0---------
3635 3641
3636 3642 unknown keyword is evaluated to ''
3637 3643
3638 3644 $ hg log -r 0 -T '{pad(rev, 10, "-", unknownkeyword)}\n'
3639 3645 0---------
3640 3646
3641 3647 Test separate function
3642 3648
3643 3649 $ hg log -r 0 -T '{separate("-", "", "a", "b", "", "", "c", "")}\n'
3644 3650 a-b-c
3645 3651 $ hg log -r 0 -T '{separate(" ", "{rev}:{node|short}", author|user, branch)}\n'
3646 3652 0:f7769ec2ab97 test default
3647 3653 $ hg log -r 0 --color=always -T '{separate(" ", "a", label(red, "b"), "c", label(red, ""), "d")}\n'
3648 3654 a \x1b[0;31mb\x1b[0m c d (esc)
3649 3655
3650 3656 Test boolean expression/literal passed to if function
3651 3657
3652 3658 $ hg log -r 0 -T '{if(rev, "rev 0 is True")}\n'
3653 3659 rev 0 is True
3654 3660 $ hg log -r 0 -T '{if(0, "literal 0 is True as well")}\n'
3655 3661 literal 0 is True as well
3656 3662 $ hg log -r 0 -T '{if("", "", "empty string is False")}\n'
3657 3663 empty string is False
3658 3664 $ hg log -r 0 -T '{if(revset(r"0 - 0"), "", "empty list is False")}\n'
3659 3665 empty list is False
3660 3666 $ hg log -r 0 -T '{if(true, "true is True")}\n'
3661 3667 true is True
3662 3668 $ hg log -r 0 -T '{if(false, "", "false is False")}\n'
3663 3669 false is False
3664 3670 $ hg log -r 0 -T '{if("false", "non-empty string is True")}\n'
3665 3671 non-empty string is True
3666 3672
3667 3673 Test ifcontains function
3668 3674
3669 3675 $ hg log --template '{rev} {ifcontains(rev, "2 two 0", "is in the string", "is not")}\n'
3670 3676 2 is in the string
3671 3677 1 is not
3672 3678 0 is in the string
3673 3679
3674 3680 $ hg log -T '{rev} {ifcontains(rev, "2 two{" 0"}", "is in the string", "is not")}\n'
3675 3681 2 is in the string
3676 3682 1 is not
3677 3683 0 is in the string
3678 3684
3679 3685 $ hg log --template '{rev} {ifcontains("a", file_adds, "added a", "did not add a")}\n'
3680 3686 2 did not add a
3681 3687 1 did not add a
3682 3688 0 added a
3683 3689
3684 3690 $ hg log --debug -T '{rev}{ifcontains(1, parents, " is parent of 1")}\n'
3685 3691 2 is parent of 1
3686 3692 1
3687 3693 0
3688 3694
3689 3695 Test revset function
3690 3696
3691 3697 $ hg log --template '{rev} {ifcontains(rev, revset("."), "current rev", "not current rev")}\n'
3692 3698 2 current rev
3693 3699 1 not current rev
3694 3700 0 not current rev
3695 3701
3696 3702 $ hg log --template '{rev} {ifcontains(rev, revset(". + .^"), "match rev", "not match rev")}\n'
3697 3703 2 match rev
3698 3704 1 match rev
3699 3705 0 not match rev
3700 3706
3701 3707 $ hg log --template '{rev} Parents: {revset("parents(%s)", rev)}\n'
3702 3708 2 Parents: 1
3703 3709 1 Parents: 0
3704 3710 0 Parents:
3705 3711
3706 3712 $ cat >> .hg/hgrc <<EOF
3707 3713 > [revsetalias]
3708 3714 > myparents(\$1) = parents(\$1)
3709 3715 > EOF
3710 3716 $ hg log --template '{rev} Parents: {revset("myparents(%s)", rev)}\n'
3711 3717 2 Parents: 1
3712 3718 1 Parents: 0
3713 3719 0 Parents:
3714 3720
3715 3721 $ hg log --template 'Rev: {rev}\n{revset("::%s", rev) % "Ancestor: {revision}\n"}\n'
3716 3722 Rev: 2
3717 3723 Ancestor: 0
3718 3724 Ancestor: 1
3719 3725 Ancestor: 2
3720 3726
3721 3727 Rev: 1
3722 3728 Ancestor: 0
3723 3729 Ancestor: 1
3724 3730
3725 3731 Rev: 0
3726 3732 Ancestor: 0
3727 3733
3728 3734 $ hg log --template '{revset("TIP"|lower)}\n' -l1
3729 3735 2
3730 3736
3731 3737 $ hg log -T '{revset("%s", "t{"ip"}")}\n' -l1
3732 3738 2
3733 3739
3734 3740 a list template is evaluated for each item of revset/parents
3735 3741
3736 3742 $ hg log -T '{rev} p: {revset("p1(%s)", rev) % "{rev}:{node|short}"}\n'
3737 3743 2 p: 1:bcc7ff960b8e
3738 3744 1 p: 0:f7769ec2ab97
3739 3745 0 p:
3740 3746
3741 3747 $ hg log --debug -T '{rev} p:{parents % " {rev}:{node|short}"}\n'
3742 3748 2 p: 1:bcc7ff960b8e -1:000000000000
3743 3749 1 p: 0:f7769ec2ab97 -1:000000000000
3744 3750 0 p: -1:000000000000 -1:000000000000
3745 3751
3746 3752 therefore, 'revcache' should be recreated for each rev
3747 3753
3748 3754 $ hg log -T '{rev} {file_adds}\np {revset("p1(%s)", rev) % "{file_adds}"}\n'
3749 3755 2 aa b
3750 3756 p
3751 3757 1
3752 3758 p a
3753 3759 0 a
3754 3760 p
3755 3761
3756 3762 $ hg log --debug -T '{rev} {file_adds}\np {parents % "{file_adds}"}\n'
3757 3763 2 aa b
3758 3764 p
3759 3765 1
3760 3766 p a
3761 3767 0 a
3762 3768 p
3763 3769
3764 3770 a revset item must be evaluated as an integer revision, not an offset from tip
3765 3771
3766 3772 $ hg log -l 1 -T '{revset("null") % "{rev}:{node|short}"}\n'
3767 3773 -1:000000000000
3768 3774 $ hg log -l 1 -T '{revset("%s", "null") % "{rev}:{node|short}"}\n'
3769 3775 -1:000000000000
3770 3776
3771 3777 join() should pick '{rev}' from revset items:
3772 3778
3773 3779 $ hg log -R ../a -T '{join(revset("parents(%d)", rev), ", ")}\n' -r6
3774 3780 4, 5
3775 3781
3776 3782 on the other hand, parents are formatted as '{rev}:{node|formatnode}' by
3777 3783 default. join() should agree with the default formatting:
3778 3784
3779 3785 $ hg log -R ../a -T '{join(parents, ", ")}\n' -r6
3780 3786 5:13207e5a10d9, 4:bbe44766e73d
3781 3787
3782 3788 $ hg log -R ../a -T '{join(parents, ",\n")}\n' -r6 --debug
3783 3789 5:13207e5a10d9fd28ec424934298e176197f2c67f,
3784 3790 4:bbe44766e73d5f11ed2177f1838de10c53ef3e74
3785 3791
3786 3792 Test files function
3787 3793
3788 3794 $ hg log -T "{rev}\n{join(files('*'), '\n')}\n"
3789 3795 2
3790 3796 a
3791 3797 aa
3792 3798 b
3793 3799 1
3794 3800 a
3795 3801 0
3796 3802 a
3797 3803
3798 3804 $ hg log -T "{rev}\n{join(files('aa'), '\n')}\n"
3799 3805 2
3800 3806 aa
3801 3807 1
3802 3808
3803 3809 0
3804 3810
3805 3811
3806 3812 Test relpath function
3807 3813
3808 3814 $ hg log -r0 -T '{files % "{file|relpath}\n"}'
3809 3815 a
3810 3816 $ cd ..
3811 3817 $ hg log -R r -r0 -T '{files % "{file|relpath}\n"}'
3812 3818 r/a
3813 3819 $ cd r
3814 3820
3815 3821 Test active bookmark templating
3816 3822
3817 3823 $ hg book foo
3818 3824 $ hg book bar
3819 3825 $ hg log --template "{rev} {bookmarks % '{bookmark}{ifeq(bookmark, active, \"*\")} '}\n"
3820 3826 2 bar* foo
3821 3827 1
3822 3828 0
3823 3829 $ hg log --template "{rev} {activebookmark}\n"
3824 3830 2 bar
3825 3831 1
3826 3832 0
3827 3833 $ hg bookmarks --inactive bar
3828 3834 $ hg log --template "{rev} {activebookmark}\n"
3829 3835 2
3830 3836 1
3831 3837 0
3832 3838 $ hg book -r1 baz
3833 3839 $ hg log --template "{rev} {join(bookmarks, ' ')}\n"
3834 3840 2 bar foo
3835 3841 1 baz
3836 3842 0
3837 3843 $ hg log --template "{rev} {ifcontains('foo', bookmarks, 't', 'f')}\n"
3838 3844 2 t
3839 3845 1 f
3840 3846 0 f
3841 3847
3842 3848 Test namespaces dict
3843 3849
3844 3850 $ hg log -T '{rev}{namespaces % " {namespace}={join(names, ",")}"}\n'
3845 3851 2 bookmarks=bar,foo tags=tip branches=text.{rev}
3846 3852 1 bookmarks=baz tags= branches=text.{rev}
3847 3853 0 bookmarks= tags= branches=default
3848 3854 $ hg log -r2 -T '{namespaces % "{namespace}: {names}\n"}'
3849 3855 bookmarks: bar foo
3850 3856 tags: tip
3851 3857 branches: text.{rev}
3852 3858 $ hg log -r2 -T '{namespaces % "{namespace}:\n{names % " {name}\n"}"}'
3853 3859 bookmarks:
3854 3860 bar
3855 3861 foo
3856 3862 tags:
3857 3863 tip
3858 3864 branches:
3859 3865 text.{rev}
3860 3866 $ hg log -r2 -T '{get(namespaces, "bookmarks") % "{name}\n"}'
3861 3867 bar
3862 3868 foo
3863 3869
3864 3870 Test stringify on sub expressions
3865 3871
3866 3872 $ cd ..
3867 3873 $ hg log -R a -r 8 --template '{join(files, if("1", if("1", ", ")))}\n'
3868 3874 fourth, second, third
3869 3875 $ hg log -R a -r 8 --template '{strip(if("1", if("1", "-abc-")), if("1", if("1", "-")))}\n'
3870 3876 abc
3871 3877
3872 3878 Test splitlines
3873 3879
3874 3880 $ hg log -Gv -R a --template "{splitlines(desc) % 'foo {line}\n'}"
3875 3881 @ foo Modify, add, remove, rename
3876 3882 |
3877 3883 o foo future
3878 3884 |
3879 3885 o foo third
3880 3886 |
3881 3887 o foo second
3882 3888
3883 3889 o foo merge
3884 3890 |\
3885 3891 | o foo new head
3886 3892 | |
3887 3893 o | foo new branch
3888 3894 |/
3889 3895 o foo no user, no domain
3890 3896 |
3891 3897 o foo no person
3892 3898 |
3893 3899 o foo other 1
3894 3900 | foo other 2
3895 3901 | foo
3896 3902 | foo other 3
3897 3903 o foo line 1
3898 3904 foo line 2
3899 3905
3900 3906 $ hg log -R a -r0 -T '{desc|splitlines}\n'
3901 3907 line 1 line 2
3902 3908 $ hg log -R a -r0 -T '{join(desc|splitlines, "|")}\n'
3903 3909 line 1|line 2
3904 3910
3905 3911 Test startswith
3906 3912 $ hg log -Gv -R a --template "{startswith(desc)}"
3907 3913 hg: parse error: startswith expects two arguments
3908 3914 [255]
3909 3915
3910 3916 $ hg log -Gv -R a --template "{startswith('line', desc)}"
3911 3917 @
3912 3918 |
3913 3919 o
3914 3920 |
3915 3921 o
3916 3922 |
3917 3923 o
3918 3924
3919 3925 o
3920 3926 |\
3921 3927 | o
3922 3928 | |
3923 3929 o |
3924 3930 |/
3925 3931 o
3926 3932 |
3927 3933 o
3928 3934 |
3929 3935 o
3930 3936 |
3931 3937 o line 1
3932 3938 line 2
3933 3939
3934 3940 Test bad template with better error message
3935 3941
3936 3942 $ hg log -Gv -R a --template '{desc|user()}'
3937 3943 hg: parse error: expected a symbol, got 'func'
3938 3944 [255]
3939 3945
3940 3946 Test word function (including index out of bounds graceful failure)
3941 3947
3942 3948 $ hg log -Gv -R a --template "{word('1', desc)}"
3943 3949 @ add,
3944 3950 |
3945 3951 o
3946 3952 |
3947 3953 o
3948 3954 |
3949 3955 o
3950 3956
3951 3957 o
3952 3958 |\
3953 3959 | o head
3954 3960 | |
3955 3961 o | branch
3956 3962 |/
3957 3963 o user,
3958 3964 |
3959 3965 o person
3960 3966 |
3961 3967 o 1
3962 3968 |
3963 3969 o 1
3964 3970
3965 3971
3966 3972 Test word third parameter used as splitter
3967 3973
3968 3974 $ hg log -Gv -R a --template "{word('0', desc, 'o')}"
3969 3975 @ M
3970 3976 |
3971 3977 o future
3972 3978 |
3973 3979 o third
3974 3980 |
3975 3981 o sec
3976 3982
3977 3983 o merge
3978 3984 |\
3979 3985 | o new head
3980 3986 | |
3981 3987 o | new branch
3982 3988 |/
3983 3989 o n
3984 3990 |
3985 3991 o n
3986 3992 |
3987 3993 o
3988 3994 |
3989 3995 o line 1
3990 3996 line 2
3991 3997
3992 3998 Test word error messages for not enough and too many arguments
3993 3999
3994 4000 $ hg log -Gv -R a --template "{word('0')}"
3995 4001 hg: parse error: word expects two or three arguments, got 1
3996 4002 [255]
3997 4003
3998 4004 $ hg log -Gv -R a --template "{word('0', desc, 'o', 'h', 'b', 'o', 'y')}"
3999 4005 hg: parse error: word expects two or three arguments, got 7
4000 4006 [255]
4001 4007
4002 4008 Test word for integer literal
4003 4009
4004 4010 $ hg log -R a --template "{word(2, desc)}\n" -r0
4005 4011 line
4006 4012
4007 4013 Test word for invalid numbers
4008 4014
4009 4015 $ hg log -Gv -R a --template "{word('a', desc)}"
4010 4016 hg: parse error: word expects an integer index
4011 4017 [255]
4012 4018
4013 4019 Test word for out of range
4014 4020
4015 4021 $ hg log -R a --template "{word(10000, desc)}"
4016 4022 $ hg log -R a --template "{word(-10000, desc)}"
4017 4023
4018 4024 Test indent and not adding to empty lines
4019 4025
4020 4026 $ hg log -T "-----\n{indent(desc, '>> ', ' > ')}\n" -r 0:1 -R a
4021 4027 -----
4022 4028 > line 1
4023 4029 >> line 2
4024 4030 -----
4025 4031 > other 1
4026 4032 >> other 2
4027 4033
4028 4034 >> other 3
4029 4035
4030 4036 Test with non-strings like dates
4031 4037
4032 4038 $ hg log -T "{indent(date, ' ')}\n" -r 2:3 -R a
4033 4039 1200000.00
4034 4040 1300000.00
4035 4041
4036 4042 Test broken string escapes:
4037 4043
4038 4044 $ hg log -T "bogus\\" -R a
4039 4045 hg: parse error: trailing \ in string
4040 4046 [255]
4041 4047 $ hg log -T "\\xy" -R a
4042 4048 hg: parse error: invalid \x escape
4043 4049 [255]
4044 4050
4045 4051 json filter should escape HTML tags so that the output can be embedded in hgweb:
4046 4052
4047 4053 $ hg log -T "{'<foo@example.org>'|json}\n" -R a -l1
4048 4054 "\u003cfoo@example.org\u003e"
4049 4055
4050 4056 Templater supports aliases of symbol and func() styles:
4051 4057
4052 4058 $ hg clone -q a aliases
4053 4059 $ cd aliases
4054 4060 $ cat <<EOF >> .hg/hgrc
4055 4061 > [templatealias]
4056 4062 > r = rev
4057 4063 > rn = "{r}:{node|short}"
4058 4064 > status(c, files) = files % "{c} {file}\n"
4059 4065 > utcdate(d) = localdate(d, "UTC")
4060 4066 > EOF
4061 4067
4062 4068 $ hg debugtemplate -vr0 '{rn} {utcdate(date)|isodate}\n'
4063 4069 (template
4064 4070 ('symbol', 'rn')
4065 4071 ('string', ' ')
4066 4072 (|
4067 4073 (func
4068 4074 ('symbol', 'utcdate')
4069 4075 ('symbol', 'date'))
4070 4076 ('symbol', 'isodate'))
4071 4077 ('string', '\n'))
4072 4078 * expanded:
4073 4079 (template
4074 4080 (template
4075 4081 ('symbol', 'rev')
4076 4082 ('string', ':')
4077 4083 (|
4078 4084 ('symbol', 'node')
4079 4085 ('symbol', 'short')))
4080 4086 ('string', ' ')
4081 4087 (|
4082 4088 (func
4083 4089 ('symbol', 'localdate')
4084 4090 (list
4085 4091 ('symbol', 'date')
4086 4092 ('string', 'UTC')))
4087 4093 ('symbol', 'isodate'))
4088 4094 ('string', '\n'))
4089 4095 0:1e4e1b8f71e0 1970-01-12 13:46 +0000
4090 4096
4091 4097 $ hg debugtemplate -vr0 '{status("A", file_adds)}'
4092 4098 (template
4093 4099 (func
4094 4100 ('symbol', 'status')
4095 4101 (list
4096 4102 ('string', 'A')
4097 4103 ('symbol', 'file_adds'))))
4098 4104 * expanded:
4099 4105 (template
4100 4106 (%
4101 4107 ('symbol', 'file_adds')
4102 4108 (template
4103 4109 ('string', 'A')
4104 4110 ('string', ' ')
4105 4111 ('symbol', 'file')
4106 4112 ('string', '\n'))))
4107 4113 A a
4108 4114
4109 4115 A unary function alias can be called as a filter:
4110 4116
4111 4117 $ hg debugtemplate -vr0 '{date|utcdate|isodate}\n'
4112 4118 (template
4113 4119 (|
4114 4120 (|
4115 4121 ('symbol', 'date')
4116 4122 ('symbol', 'utcdate'))
4117 4123 ('symbol', 'isodate'))
4118 4124 ('string', '\n'))
4119 4125 * expanded:
4120 4126 (template
4121 4127 (|
4122 4128 (func
4123 4129 ('symbol', 'localdate')
4124 4130 (list
4125 4131 ('symbol', 'date')
4126 4132 ('string', 'UTC')))
4127 4133 ('symbol', 'isodate'))
4128 4134 ('string', '\n'))
4129 4135 1970-01-12 13:46 +0000
4130 4136
4131 4137 Aliases should be applied only to command arguments and templates in hgrc.
4132 4138 Otherwise, our stock styles and web templates could be corrupted:
4133 4139
4134 4140 $ hg log -r0 -T '{rn} {utcdate(date)|isodate}\n'
4135 4141 0:1e4e1b8f71e0 1970-01-12 13:46 +0000
4136 4142
4137 4143 $ hg log -r0 --config ui.logtemplate='"{rn} {utcdate(date)|isodate}\n"'
4138 4144 0:1e4e1b8f71e0 1970-01-12 13:46 +0000
4139 4145
4140 4146 $ cat <<EOF > tmpl
4141 4147 > changeset = 'nothing expanded:{rn}\n'
4142 4148 > EOF
4143 4149 $ hg log -r0 --style ./tmpl
4144 4150 nothing expanded:
4145 4151
4146 4152 Aliases in formatter:
4147 4153
4148 4154 $ hg branches -T '{pad(branch, 7)} {rn}\n'
4149 4155 default 6:d41e714fe50d
4150 4156 foo 4:bbe44766e73d
4151 4157
4152 4158 Aliases should honor HGPLAIN:
4153 4159
4154 4160 $ HGPLAIN= hg log -r0 -T 'nothing expanded:{rn}\n'
4155 4161 nothing expanded:
4156 4162 $ HGPLAINEXCEPT=templatealias hg log -r0 -T '{rn}\n'
4157 4163 0:1e4e1b8f71e0
4158 4164
4159 4165 Unparsable alias:
4160 4166
4161 4167 $ hg debugtemplate --config templatealias.bad='x(' -v '{bad}'
4162 4168 (template
4163 4169 ('symbol', 'bad'))
4164 4170 abort: bad definition of template alias "bad": at 2: not a prefix: end
4165 4171 [255]
4166 4172 $ hg log --config templatealias.bad='x(' -T '{bad}'
4167 4173 abort: bad definition of template alias "bad": at 2: not a prefix: end
4168 4174 [255]
4169 4175
4170 4176 $ cd ..
4171 4177
4172 4178 Set up repository for non-ascii encoding tests:
4173 4179
4174 4180 $ hg init nonascii
4175 4181 $ cd nonascii
4176 4182 $ python <<EOF
4177 4183 > open('latin1', 'w').write('\xe9')
4178 4184 > open('utf-8', 'w').write('\xc3\xa9')
4179 4185 > EOF
4180 4186 $ HGENCODING=utf-8 hg branch -q `cat utf-8`
4181 4187 $ HGENCODING=utf-8 hg ci -qAm "non-ascii branch: `cat utf-8`" utf-8
4182 4188
4183 4189 json filter should try round-trip conversion to utf-8:
4184 4190
4185 4191 $ HGENCODING=ascii hg log -T "{branch|json}\n" -r0
4186 4192 "\u00e9"
4187 4193 $ HGENCODING=ascii hg log -T "{desc|json}\n" -r0
4188 4194 "non-ascii branch: \u00e9"
4189 4195
4190 4196 json filter takes input as utf-8b:
4191 4197
4192 4198 $ HGENCODING=ascii hg log -T "{'`cat utf-8`'|json}\n" -l1
4193 4199 "\u00e9"
4194 4200 $ HGENCODING=ascii hg log -T "{'`cat latin1`'|json}\n" -l1
4195 4201 "\udce9"
4196 4202
4197 4203 utf8 filter:
4198 4204
4199 4205 $ HGENCODING=ascii hg log -T "round-trip: {branch|utf8|hex}\n" -r0
4200 4206 round-trip: c3a9
4201 4207 $ HGENCODING=latin1 hg log -T "decoded: {'`cat latin1`'|utf8|hex}\n" -l1
4202 4208 decoded: c3a9
4203 4209 $ HGENCODING=ascii hg log -T "replaced: {'`cat latin1`'|utf8|hex}\n" -l1
4204 4210 abort: decoding near * (glob)
4205 4211 [255]
4206 4212 $ hg log -T "invalid type: {rev|utf8}\n" -r0
4207 4213 abort: template filter 'utf8' is not compatible with keyword 'rev'
4208 4214 [255]
4209 4215
4210 4216 pad width:
4211 4217
4212 4218 $ HGENCODING=utf-8 hg debugtemplate "{pad('`cat utf-8`', 2, '-')}\n"
4213 4219 \xc3\xa9- (esc)
4214 4220
4215 4221 $ cd ..
4216 4222
4217 4223 Test that template function in extension is registered as expected
4218 4224
4219 4225 $ cd a
4220 4226
4221 4227 $ cat <<EOF > $TESTTMP/customfunc.py
4222 4228 > from mercurial import registrar
4223 4229 >
4224 4230 > templatefunc = registrar.templatefunc()
4225 4231 >
4226 4232 > @templatefunc('custom()')
4227 4233 > def custom(context, mapping, args):
4228 4234 > return 'custom'
4229 4235 > EOF
4230 4236 $ cat <<EOF > .hg/hgrc
4231 4237 > [extensions]
4232 4238 > customfunc = $TESTTMP/customfunc.py
4233 4239 > EOF
4234 4240
4235 4241 $ hg log -r . -T "{custom()}\n" --config customfunc.enabled=true
4236 4242 custom
4237 4243
4238 4244 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now