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