tests: extract test-template-keywords.t from test-command-template.t
authorYuya Nishihara <yuya@tcha.org>
Sat, 16 Jun 2018 14:14:52 +0900
changeset 38441 da4508cdef37
parent 38440 6a8ed5c7e112
child 38442 550b7d110f45
tests: extract test-template-keywords.t from test-command-template.t
contrib/python3-whitelist
tests/test-command-template.t
tests/test-template-keywords.t
--- a/contrib/python3-whitelist	Sat Jun 16 14:10:12 2018 +0900
+++ b/contrib/python3-whitelist	Sat Jun 16 14:14:52 2018 +0900
@@ -490,6 +490,7 @@
 test-tag.t
 test-tags.t
 test-template-functions.t
+test-template-keywords.t
 test-template-map.t
 test-transplant.t
 test-treemanifest.t
--- a/tests/test-command-template.t	Sat Jun 16 14:10:12 2018 +0900
+++ b/tests/test-command-template.t	Sat Jun 16 14:14:52 2018 +0900
@@ -210,18 +210,6 @@
   8 t
   7 f
 
-Working-directory revision has special identifiers, though they are still
-experimental:
-
-  $ hg log -r 'wdir()' -T '{rev}:{node}\n'
-  2147483647:ffffffffffffffffffffffffffffffffffffffff
-
-Some keywords are invalid for working-directory revision, but they should
-never cause crash:
-
-  $ hg log -r 'wdir()' -T '{manifest}\n'
-  
-
 Internal resources shouldn't be exposed (issue5699):
 
   $ hg log -r. -T '{cache}{ctx}{repo}{revcache}{templ}{ui}'
@@ -284,650 +272,10 @@
   $ hg log --style ./issue4758 -r tip
   8 tip
 
-Check that {phase} works correctly on parents:
+Set up phase:
 
-  $ cat << EOF > parentphase
-  > changeset_debug = '{rev} ({phase}):{parents}\n'
-  > parent = ' {rev} ({phase})'
-  > EOF
   $ hg phase -r 5 --public
   $ hg phase -r 7 --secret --force
-  $ hg log --debug -G --style ./parentphase
-  @  8 (secret): 7 (secret) -1 (public)
-  |
-  o  7 (secret): -1 (public) -1 (public)
-  
-  o    6 (draft): 5 (public) 4 (draft)
-  |\
-  | o  5 (public): 3 (public) -1 (public)
-  | |
-  o |  4 (draft): 3 (public) -1 (public)
-  |/
-  o  3 (public): 2 (public) -1 (public)
-  |
-  o  2 (public): 1 (public) -1 (public)
-  |
-  o  1 (public): 0 (public) -1 (public)
-  |
-  o  0 (public): -1 (public) -1 (public)
-  
-
-Keys work:
-
-  $ for key in author branch branches date desc file_adds file_dels file_mods \
-  >         file_copies file_copies_switch files \
-  >         manifest node parents rev tags diffstat extras \
-  >         p1rev p2rev p1node p2node; do
-  >     for mode in '' --verbose --debug; do
-  >         hg log $mode --template "$key$mode: {$key}\n"
-  >     done
-  > done
-  author: test
-  author: User Name <user@hostname>
-  author: person
-  author: person
-  author: person
-  author: person
-  author: other@place
-  author: A. N. Other <other@place>
-  author: User Name <user@hostname>
-  author--verbose: test
-  author--verbose: User Name <user@hostname>
-  author--verbose: person
-  author--verbose: person
-  author--verbose: person
-  author--verbose: person
-  author--verbose: other@place
-  author--verbose: A. N. Other <other@place>
-  author--verbose: User Name <user@hostname>
-  author--debug: test
-  author--debug: User Name <user@hostname>
-  author--debug: person
-  author--debug: person
-  author--debug: person
-  author--debug: person
-  author--debug: other@place
-  author--debug: A. N. Other <other@place>
-  author--debug: User Name <user@hostname>
-  branch: default
-  branch: default
-  branch: default
-  branch: default
-  branch: foo
-  branch: default
-  branch: default
-  branch: default
-  branch: default
-  branch--verbose: default
-  branch--verbose: default
-  branch--verbose: default
-  branch--verbose: default
-  branch--verbose: foo
-  branch--verbose: default
-  branch--verbose: default
-  branch--verbose: default
-  branch--verbose: default
-  branch--debug: default
-  branch--debug: default
-  branch--debug: default
-  branch--debug: default
-  branch--debug: foo
-  branch--debug: default
-  branch--debug: default
-  branch--debug: default
-  branch--debug: default
-  branches: 
-  branches: 
-  branches: 
-  branches: 
-  branches: foo
-  branches: 
-  branches: 
-  branches: 
-  branches: 
-  branches--verbose: 
-  branches--verbose: 
-  branches--verbose: 
-  branches--verbose: 
-  branches--verbose: foo
-  branches--verbose: 
-  branches--verbose: 
-  branches--verbose: 
-  branches--verbose: 
-  branches--debug: 
-  branches--debug: 
-  branches--debug: 
-  branches--debug: 
-  branches--debug: foo
-  branches--debug: 
-  branches--debug: 
-  branches--debug: 
-  branches--debug: 
-  date: 1577872860.00
-  date: 1000000.00
-  date: 1500001.00
-  date: 1500000.00
-  date: 1400000.00
-  date: 1300000.00
-  date: 1200000.00
-  date: 1100000.00
-  date: 1000000.00
-  date--verbose: 1577872860.00
-  date--verbose: 1000000.00
-  date--verbose: 1500001.00
-  date--verbose: 1500000.00
-  date--verbose: 1400000.00
-  date--verbose: 1300000.00
-  date--verbose: 1200000.00
-  date--verbose: 1100000.00
-  date--verbose: 1000000.00
-  date--debug: 1577872860.00
-  date--debug: 1000000.00
-  date--debug: 1500001.00
-  date--debug: 1500000.00
-  date--debug: 1400000.00
-  date--debug: 1300000.00
-  date--debug: 1200000.00
-  date--debug: 1100000.00
-  date--debug: 1000000.00
-  desc: third
-  desc: second
-  desc: merge
-  desc: new head
-  desc: new branch
-  desc: no user, no domain
-  desc: no person
-  desc: other 1
-  other 2
-  
-  other 3
-  desc: line 1
-  line 2
-  desc--verbose: third
-  desc--verbose: second
-  desc--verbose: merge
-  desc--verbose: new head
-  desc--verbose: new branch
-  desc--verbose: no user, no domain
-  desc--verbose: no person
-  desc--verbose: other 1
-  other 2
-  
-  other 3
-  desc--verbose: line 1
-  line 2
-  desc--debug: third
-  desc--debug: second
-  desc--debug: merge
-  desc--debug: new head
-  desc--debug: new branch
-  desc--debug: no user, no domain
-  desc--debug: no person
-  desc--debug: other 1
-  other 2
-  
-  other 3
-  desc--debug: line 1
-  line 2
-  file_adds: fourth third
-  file_adds: second
-  file_adds: 
-  file_adds: d
-  file_adds: 
-  file_adds: 
-  file_adds: c
-  file_adds: b
-  file_adds: a
-  file_adds--verbose: fourth third
-  file_adds--verbose: second
-  file_adds--verbose: 
-  file_adds--verbose: d
-  file_adds--verbose: 
-  file_adds--verbose: 
-  file_adds--verbose: c
-  file_adds--verbose: b
-  file_adds--verbose: a
-  file_adds--debug: fourth third
-  file_adds--debug: second
-  file_adds--debug: 
-  file_adds--debug: d
-  file_adds--debug: 
-  file_adds--debug: 
-  file_adds--debug: c
-  file_adds--debug: b
-  file_adds--debug: a
-  file_dels: second
-  file_dels: 
-  file_dels: 
-  file_dels: 
-  file_dels: 
-  file_dels: 
-  file_dels: 
-  file_dels: 
-  file_dels: 
-  file_dels--verbose: second
-  file_dels--verbose: 
-  file_dels--verbose: 
-  file_dels--verbose: 
-  file_dels--verbose: 
-  file_dels--verbose: 
-  file_dels--verbose: 
-  file_dels--verbose: 
-  file_dels--verbose: 
-  file_dels--debug: second
-  file_dels--debug: 
-  file_dels--debug: 
-  file_dels--debug: 
-  file_dels--debug: 
-  file_dels--debug: 
-  file_dels--debug: 
-  file_dels--debug: 
-  file_dels--debug: 
-  file_mods: 
-  file_mods: 
-  file_mods: 
-  file_mods: 
-  file_mods: 
-  file_mods: c
-  file_mods: 
-  file_mods: 
-  file_mods: 
-  file_mods--verbose: 
-  file_mods--verbose: 
-  file_mods--verbose: 
-  file_mods--verbose: 
-  file_mods--verbose: 
-  file_mods--verbose: c
-  file_mods--verbose: 
-  file_mods--verbose: 
-  file_mods--verbose: 
-  file_mods--debug: 
-  file_mods--debug: 
-  file_mods--debug: 
-  file_mods--debug: 
-  file_mods--debug: 
-  file_mods--debug: c
-  file_mods--debug: 
-  file_mods--debug: 
-  file_mods--debug: 
-  file_copies: fourth (second)
-  file_copies: 
-  file_copies: 
-  file_copies: 
-  file_copies: 
-  file_copies: 
-  file_copies: 
-  file_copies: 
-  file_copies: 
-  file_copies--verbose: fourth (second)
-  file_copies--verbose: 
-  file_copies--verbose: 
-  file_copies--verbose: 
-  file_copies--verbose: 
-  file_copies--verbose: 
-  file_copies--verbose: 
-  file_copies--verbose: 
-  file_copies--verbose: 
-  file_copies--debug: fourth (second)
-  file_copies--debug: 
-  file_copies--debug: 
-  file_copies--debug: 
-  file_copies--debug: 
-  file_copies--debug: 
-  file_copies--debug: 
-  file_copies--debug: 
-  file_copies--debug: 
-  file_copies_switch: 
-  file_copies_switch: 
-  file_copies_switch: 
-  file_copies_switch: 
-  file_copies_switch: 
-  file_copies_switch: 
-  file_copies_switch: 
-  file_copies_switch: 
-  file_copies_switch: 
-  file_copies_switch--verbose: 
-  file_copies_switch--verbose: 
-  file_copies_switch--verbose: 
-  file_copies_switch--verbose: 
-  file_copies_switch--verbose: 
-  file_copies_switch--verbose: 
-  file_copies_switch--verbose: 
-  file_copies_switch--verbose: 
-  file_copies_switch--verbose: 
-  file_copies_switch--debug: 
-  file_copies_switch--debug: 
-  file_copies_switch--debug: 
-  file_copies_switch--debug: 
-  file_copies_switch--debug: 
-  file_copies_switch--debug: 
-  file_copies_switch--debug: 
-  file_copies_switch--debug: 
-  file_copies_switch--debug: 
-  files: fourth second third
-  files: second
-  files: 
-  files: d
-  files: 
-  files: c
-  files: c
-  files: b
-  files: a
-  files--verbose: fourth second third
-  files--verbose: second
-  files--verbose: 
-  files--verbose: d
-  files--verbose: 
-  files--verbose: c
-  files--verbose: c
-  files--verbose: b
-  files--verbose: a
-  files--debug: fourth second third
-  files--debug: second
-  files--debug: 
-  files--debug: d
-  files--debug: 
-  files--debug: c
-  files--debug: c
-  files--debug: b
-  files--debug: a
-  manifest: 6:94961b75a2da
-  manifest: 5:f2dbc354b94e
-  manifest: 4:4dc3def4f9b4
-  manifest: 4:4dc3def4f9b4
-  manifest: 3:cb5a1327723b
-  manifest: 3:cb5a1327723b
-  manifest: 2:6e0e82995c35
-  manifest: 1:4e8d705b1e53
-  manifest: 0:a0c8bcbbb45c
-  manifest--verbose: 6:94961b75a2da
-  manifest--verbose: 5:f2dbc354b94e
-  manifest--verbose: 4:4dc3def4f9b4
-  manifest--verbose: 4:4dc3def4f9b4
-  manifest--verbose: 3:cb5a1327723b
-  manifest--verbose: 3:cb5a1327723b
-  manifest--verbose: 2:6e0e82995c35
-  manifest--verbose: 1:4e8d705b1e53
-  manifest--verbose: 0:a0c8bcbbb45c
-  manifest--debug: 6:94961b75a2da554b4df6fb599e5bfc7d48de0c64
-  manifest--debug: 5:f2dbc354b94e5ec0b4f10680ee0cee816101d0bf
-  manifest--debug: 4:4dc3def4f9b4c6e8de820f6ee74737f91e96a216
-  manifest--debug: 4:4dc3def4f9b4c6e8de820f6ee74737f91e96a216
-  manifest--debug: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
-  manifest--debug: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
-  manifest--debug: 2:6e0e82995c35d0d57a52aca8da4e56139e06b4b1
-  manifest--debug: 1:4e8d705b1e53e3f9375e0e60dc7b525d8211fe55
-  manifest--debug: 0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0
-  node: 95c24699272ef57d062b8bccc32c878bf841784a
-  node: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
-  node: d41e714fe50d9e4a5f11b4d595d543481b5f980b
-  node: 13207e5a10d9fd28ec424934298e176197f2c67f
-  node: bbe44766e73d5f11ed2177f1838de10c53ef3e74
-  node: 10e46f2dcbf4823578cf180f33ecf0b957964c47
-  node: 97054abb4ab824450e9164180baf491ae0078465
-  node: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
-  node: 1e4e1b8f71e05681d422154f5421e385fec3454f
-  node--verbose: 95c24699272ef57d062b8bccc32c878bf841784a
-  node--verbose: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
-  node--verbose: d41e714fe50d9e4a5f11b4d595d543481b5f980b
-  node--verbose: 13207e5a10d9fd28ec424934298e176197f2c67f
-  node--verbose: bbe44766e73d5f11ed2177f1838de10c53ef3e74
-  node--verbose: 10e46f2dcbf4823578cf180f33ecf0b957964c47
-  node--verbose: 97054abb4ab824450e9164180baf491ae0078465
-  node--verbose: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
-  node--verbose: 1e4e1b8f71e05681d422154f5421e385fec3454f
-  node--debug: 95c24699272ef57d062b8bccc32c878bf841784a
-  node--debug: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
-  node--debug: d41e714fe50d9e4a5f11b4d595d543481b5f980b
-  node--debug: 13207e5a10d9fd28ec424934298e176197f2c67f
-  node--debug: bbe44766e73d5f11ed2177f1838de10c53ef3e74
-  node--debug: 10e46f2dcbf4823578cf180f33ecf0b957964c47
-  node--debug: 97054abb4ab824450e9164180baf491ae0078465
-  node--debug: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
-  node--debug: 1e4e1b8f71e05681d422154f5421e385fec3454f
-  parents: 
-  parents: -1:000000000000 
-  parents: 5:13207e5a10d9 4:bbe44766e73d 
-  parents: 3:10e46f2dcbf4 
-  parents: 
-  parents: 
-  parents: 
-  parents: 
-  parents: 
-  parents--verbose: 
-  parents--verbose: -1:000000000000 
-  parents--verbose: 5:13207e5a10d9 4:bbe44766e73d 
-  parents--verbose: 3:10e46f2dcbf4 
-  parents--verbose: 
-  parents--verbose: 
-  parents--verbose: 
-  parents--verbose: 
-  parents--verbose: 
-  parents--debug: 7:29114dbae42b9f078cf2714dbe3a86bba8ec7453 -1:0000000000000000000000000000000000000000 
-  parents--debug: -1:0000000000000000000000000000000000000000 -1:0000000000000000000000000000000000000000 
-  parents--debug: 5:13207e5a10d9fd28ec424934298e176197f2c67f 4:bbe44766e73d5f11ed2177f1838de10c53ef3e74 
-  parents--debug: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47 -1:0000000000000000000000000000000000000000 
-  parents--debug: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47 -1:0000000000000000000000000000000000000000 
-  parents--debug: 2:97054abb4ab824450e9164180baf491ae0078465 -1:0000000000000000000000000000000000000000 
-  parents--debug: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965 -1:0000000000000000000000000000000000000000 
-  parents--debug: 0:1e4e1b8f71e05681d422154f5421e385fec3454f -1:0000000000000000000000000000000000000000 
-  parents--debug: -1:0000000000000000000000000000000000000000 -1:0000000000000000000000000000000000000000 
-  rev: 8
-  rev: 7
-  rev: 6
-  rev: 5
-  rev: 4
-  rev: 3
-  rev: 2
-  rev: 1
-  rev: 0
-  rev--verbose: 8
-  rev--verbose: 7
-  rev--verbose: 6
-  rev--verbose: 5
-  rev--verbose: 4
-  rev--verbose: 3
-  rev--verbose: 2
-  rev--verbose: 1
-  rev--verbose: 0
-  rev--debug: 8
-  rev--debug: 7
-  rev--debug: 6
-  rev--debug: 5
-  rev--debug: 4
-  rev--debug: 3
-  rev--debug: 2
-  rev--debug: 1
-  rev--debug: 0
-  tags: tip
-  tags: 
-  tags: 
-  tags: 
-  tags: 
-  tags: 
-  tags: 
-  tags: 
-  tags: 
-  tags--verbose: tip
-  tags--verbose: 
-  tags--verbose: 
-  tags--verbose: 
-  tags--verbose: 
-  tags--verbose: 
-  tags--verbose: 
-  tags--verbose: 
-  tags--verbose: 
-  tags--debug: tip
-  tags--debug: 
-  tags--debug: 
-  tags--debug: 
-  tags--debug: 
-  tags--debug: 
-  tags--debug: 
-  tags--debug: 
-  tags--debug: 
-  diffstat: 3: +2/-1
-  diffstat: 1: +1/-0
-  diffstat: 0: +0/-0
-  diffstat: 1: +1/-0
-  diffstat: 0: +0/-0
-  diffstat: 1: +1/-0
-  diffstat: 1: +4/-0
-  diffstat: 1: +2/-0
-  diffstat: 1: +1/-0
-  diffstat--verbose: 3: +2/-1
-  diffstat--verbose: 1: +1/-0
-  diffstat--verbose: 0: +0/-0
-  diffstat--verbose: 1: +1/-0
-  diffstat--verbose: 0: +0/-0
-  diffstat--verbose: 1: +1/-0
-  diffstat--verbose: 1: +4/-0
-  diffstat--verbose: 1: +2/-0
-  diffstat--verbose: 1: +1/-0
-  diffstat--debug: 3: +2/-1
-  diffstat--debug: 1: +1/-0
-  diffstat--debug: 0: +0/-0
-  diffstat--debug: 1: +1/-0
-  diffstat--debug: 0: +0/-0
-  diffstat--debug: 1: +1/-0
-  diffstat--debug: 1: +4/-0
-  diffstat--debug: 1: +2/-0
-  diffstat--debug: 1: +1/-0
-  extras: branch=default
-  extras: branch=default
-  extras: branch=default
-  extras: branch=default
-  extras: branch=foo
-  extras: branch=default
-  extras: branch=default
-  extras: branch=default
-  extras: branch=default
-  extras--verbose: branch=default
-  extras--verbose: branch=default
-  extras--verbose: branch=default
-  extras--verbose: branch=default
-  extras--verbose: branch=foo
-  extras--verbose: branch=default
-  extras--verbose: branch=default
-  extras--verbose: branch=default
-  extras--verbose: branch=default
-  extras--debug: branch=default
-  extras--debug: branch=default
-  extras--debug: branch=default
-  extras--debug: branch=default
-  extras--debug: branch=foo
-  extras--debug: branch=default
-  extras--debug: branch=default
-  extras--debug: branch=default
-  extras--debug: branch=default
-  p1rev: 7
-  p1rev: -1
-  p1rev: 5
-  p1rev: 3
-  p1rev: 3
-  p1rev: 2
-  p1rev: 1
-  p1rev: 0
-  p1rev: -1
-  p1rev--verbose: 7
-  p1rev--verbose: -1
-  p1rev--verbose: 5
-  p1rev--verbose: 3
-  p1rev--verbose: 3
-  p1rev--verbose: 2
-  p1rev--verbose: 1
-  p1rev--verbose: 0
-  p1rev--verbose: -1
-  p1rev--debug: 7
-  p1rev--debug: -1
-  p1rev--debug: 5
-  p1rev--debug: 3
-  p1rev--debug: 3
-  p1rev--debug: 2
-  p1rev--debug: 1
-  p1rev--debug: 0
-  p1rev--debug: -1
-  p2rev: -1
-  p2rev: -1
-  p2rev: 4
-  p2rev: -1
-  p2rev: -1
-  p2rev: -1
-  p2rev: -1
-  p2rev: -1
-  p2rev: -1
-  p2rev--verbose: -1
-  p2rev--verbose: -1
-  p2rev--verbose: 4
-  p2rev--verbose: -1
-  p2rev--verbose: -1
-  p2rev--verbose: -1
-  p2rev--verbose: -1
-  p2rev--verbose: -1
-  p2rev--verbose: -1
-  p2rev--debug: -1
-  p2rev--debug: -1
-  p2rev--debug: 4
-  p2rev--debug: -1
-  p2rev--debug: -1
-  p2rev--debug: -1
-  p2rev--debug: -1
-  p2rev--debug: -1
-  p2rev--debug: -1
-  p1node: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
-  p1node: 0000000000000000000000000000000000000000
-  p1node: 13207e5a10d9fd28ec424934298e176197f2c67f
-  p1node: 10e46f2dcbf4823578cf180f33ecf0b957964c47
-  p1node: 10e46f2dcbf4823578cf180f33ecf0b957964c47
-  p1node: 97054abb4ab824450e9164180baf491ae0078465
-  p1node: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
-  p1node: 1e4e1b8f71e05681d422154f5421e385fec3454f
-  p1node: 0000000000000000000000000000000000000000
-  p1node--verbose: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
-  p1node--verbose: 0000000000000000000000000000000000000000
-  p1node--verbose: 13207e5a10d9fd28ec424934298e176197f2c67f
-  p1node--verbose: 10e46f2dcbf4823578cf180f33ecf0b957964c47
-  p1node--verbose: 10e46f2dcbf4823578cf180f33ecf0b957964c47
-  p1node--verbose: 97054abb4ab824450e9164180baf491ae0078465
-  p1node--verbose: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
-  p1node--verbose: 1e4e1b8f71e05681d422154f5421e385fec3454f
-  p1node--verbose: 0000000000000000000000000000000000000000
-  p1node--debug: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
-  p1node--debug: 0000000000000000000000000000000000000000
-  p1node--debug: 13207e5a10d9fd28ec424934298e176197f2c67f
-  p1node--debug: 10e46f2dcbf4823578cf180f33ecf0b957964c47
-  p1node--debug: 10e46f2dcbf4823578cf180f33ecf0b957964c47
-  p1node--debug: 97054abb4ab824450e9164180baf491ae0078465
-  p1node--debug: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
-  p1node--debug: 1e4e1b8f71e05681d422154f5421e385fec3454f
-  p1node--debug: 0000000000000000000000000000000000000000
-  p2node: 0000000000000000000000000000000000000000
-  p2node: 0000000000000000000000000000000000000000
-  p2node: bbe44766e73d5f11ed2177f1838de10c53ef3e74
-  p2node: 0000000000000000000000000000000000000000
-  p2node: 0000000000000000000000000000000000000000
-  p2node: 0000000000000000000000000000000000000000
-  p2node: 0000000000000000000000000000000000000000
-  p2node: 0000000000000000000000000000000000000000
-  p2node: 0000000000000000000000000000000000000000
-  p2node--verbose: 0000000000000000000000000000000000000000
-  p2node--verbose: 0000000000000000000000000000000000000000
-  p2node--verbose: bbe44766e73d5f11ed2177f1838de10c53ef3e74
-  p2node--verbose: 0000000000000000000000000000000000000000
-  p2node--verbose: 0000000000000000000000000000000000000000
-  p2node--verbose: 0000000000000000000000000000000000000000
-  p2node--verbose: 0000000000000000000000000000000000000000
-  p2node--verbose: 0000000000000000000000000000000000000000
-  p2node--verbose: 0000000000000000000000000000000000000000
-  p2node--debug: 0000000000000000000000000000000000000000
-  p2node--debug: 0000000000000000000000000000000000000000
-  p2node--debug: bbe44766e73d5f11ed2177f1838de10c53ef3e74
-  p2node--debug: 0000000000000000000000000000000000000000
-  p2node--debug: 0000000000000000000000000000000000000000
-  p2node--debug: 0000000000000000000000000000000000000000
-  p2node--debug: 0000000000000000000000000000000000000000
-  p2node--debug: 0000000000000000000000000000000000000000
-  p2node--debug: 0000000000000000000000000000000000000000
 
 Add a dummy commit to make up for the instability of the above:
 
@@ -1053,31 +401,9 @@
   hg: parse error: unknown function 'foo'
   [255]
 
-Test index keyword:
-
-  $ hg log -l 2 -T '{index + 10}{files % " {index}:{file}"}\n'
-  10 0:a 1:b 2:fifth 3:fourth 4:third
-  11 0:a
-
-  $ hg branches -T '{index} {branch}\n'
-  0 default
-  1 foo
-
-ui verbosity:
-
-  $ hg log -l1 -T '{verbosity}\n'
-  
-  $ hg log -l1 -T '{verbosity}\n' --debug
-  debug
-  $ hg log -l1 -T '{verbosity}\n' --quiet
-  quiet
-  $ hg log -l1 -T '{verbosity}\n' --verbose
-  verbose
-
   $ cd ..
 
-
-latesttag:
+Set up latesttag repository:
 
   $ hg init latesttag
   $ cd latesttag
@@ -1105,165 +431,12 @@
   $ hg merge -q
   $ hg ci -m merge -d '5 -3600'
 
-No tag set:
-
-  $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n'
-  @    5: null+5
-  |\
-  | o  4: null+4
-  | |
-  | o  3: null+3
-  | |
-  o |  2: null+3
-  |/
-  o  1: null+2
-  |
-  o  0: null+1
-  
-
-One common tag: longest path wins for {latesttagdistance}:
-
   $ hg tag -r 1 -m t1 -d '6 0' t1
-  $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n'
-  @  6: t1+4
-  |
-  o    5: t1+3
-  |\
-  | o  4: t1+2
-  | |
-  | o  3: t1+1
-  | |
-  o |  2: t1+1
-  |/
-  o  1: t1+0
-  |
-  o  0: null+1
-  
-
-One ancestor tag: closest wins:
-
   $ hg tag -r 2 -m t2 -d '7 0' t2
-  $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n'
-  @  7: t2+3
-  |
-  o  6: t2+2
-  |
-  o    5: t2+1
-  |\
-  | o  4: t1+2
-  | |
-  | o  3: t1+1
-  | |
-  o |  2: t2+0
-  |/
-  o  1: t1+0
-  |
-  o  0: null+1
-  
-
-Two branch tags: more recent wins if same number of changes:
-
   $ hg tag -r 3 -m t3 -d '8 0' t3
-  $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n'
-  @  8: t3+5
-  |
-  o  7: t3+4
-  |
-  o  6: t3+3
-  |
-  o    5: t3+2
-  |\
-  | o  4: t3+1
-  | |
-  | o  3: t3+0
-  | |
-  o |  2: t2+0
-  |/
-  o  1: t1+0
-  |
-  o  0: null+1
-  
-
-Two branch tags: fewest changes wins:
-
   $ hg tag -r 4 -m t4 -d '4 0' t4 # older than t2, but should not matter
-  $ hg log -G --template "{rev}: {latesttag % '{tag}+{distance},{changes} '}\n"
-  @  9: t4+5,6
-  |
-  o  8: t4+4,5
-  |
-  o  7: t4+3,4
-  |
-  o  6: t4+2,3
-  |
-  o    5: t4+1,2
-  |\
-  | o  4: t4+0,0
-  | |
-  | o  3: t3+0,0
-  | |
-  o |  2: t2+0,0
-  |/
-  o  1: t1+0,0
-  |
-  o  0: null+1,1
-  
-
-Merged tag overrides:
-
   $ hg tag -r 5 -m t5 -d '9 0' t5
   $ hg tag -r 3 -m at3 -d '10 0' at3
-  $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n'
-  @  11: t5+6
-  |
-  o  10: t5+5
-  |
-  o  9: t5+4
-  |
-  o  8: t5+3
-  |
-  o  7: t5+2
-  |
-  o  6: t5+1
-  |
-  o    5: t5+0
-  |\
-  | o  4: t4+0
-  | |
-  | o  3: at3:t3+0
-  | |
-  o |  2: t2+0
-  |/
-  o  1: t1+0
-  |
-  o  0: null+1
-  
-
-  $ hg log -G --template "{rev}: {latesttag % '{tag}+{distance},{changes} '}\n"
-  @  11: t5+6,6
-  |
-  o  10: t5+5,5
-  |
-  o  9: t5+4,4
-  |
-  o  8: t5+3,3
-  |
-  o  7: t5+2,2
-  |
-  o  6: t5+1,1
-  |
-  o    5: t5+0,0
-  |\
-  | o  4: t4+0,0
-  | |
-  | o  3: at3+0,0 t3+0,0
-  | |
-  o |  2: t2+0,0
-  |/
-  o  1: t1+0,0
-  |
-  o  0: null+1,1
-  
 
   $ cd ..
 
@@ -1725,11 +898,6 @@
   hg: parse error: fill expects an integer width
   [255]
 
-  $ COLUMNS=25 hg log -l1 --template '{fill(desc, termwidth, "{node|short}:", "termwidth.{rev}:")}'
-  bcc7ff960b8e:desc to be
-  termwidth.1:wrapped desc
-  termwidth.1:to be wrapped (no-eol)
-
   $ hg log -l 1 --template '{sub(r"[0-9]", "-", author)}'
   {node|short} (no-eol)
   $ hg log -l 1 --template '{sub(r"[0-9]", "-", "{node|short}")}'
@@ -1748,97 +916,6 @@
   $ hg log --color=always -l 1 --template '{label("text.{rev}", "text\n")}'
   \x1b[0;32mtext\x1b[0m (esc)
 
-Just one more commit:
-
-  $ echo b > b
-  $ hg ci -qAm b
-
-Test 'originalnode'
-
-  $ hg log -r 1 -T '{revset("null") % "{node|short} {originalnode|short}"}\n'
-  000000000000 bcc7ff960b8e
-  $ hg log -r 0 -T '{manifest % "{node} {originalnode}"}\n'
-  a0c8bcbbb45c63b90b70ad007bf38961f64f2af0 f7769ec2ab975ad19684098ad1ffd9b81ecc71a1
-
-Test active bookmark templating
-
-  $ hg book foo
-  $ hg book bar
-  $ hg log --template "{rev} {bookmarks % '{bookmark}{ifeq(bookmark, active, \"*\")} '}\n"
-  2 bar* foo 
-  1 
-  0 
-  $ hg log --template "{rev} {activebookmark}\n"
-  2 bar
-  1 
-  0 
-  $ hg bookmarks --inactive bar
-  $ hg log --template "{rev} {activebookmark}\n"
-  2 
-  1 
-  0 
-  $ hg book -r1 baz
-  $ hg log --template "{rev} {join(bookmarks, ' ')}\n"
-  2 bar foo
-  1 baz
-  0 
-  $ hg log --template "{rev} {ifcontains('foo', bookmarks, 't', 'f')}\n"
-  2 t
-  1 f
-  0 f
-
-Test namespaces dict
-
-  $ hg --config extensions.revnamesext=$TESTDIR/revnamesext.py log -T '{rev}\n{namespaces % " {namespace} color={colorname} builtin={builtin}\n  {join(names, ",")}\n"}\n'
-  2
-   bookmarks color=bookmark builtin=True
-    bar,foo
-   tags color=tag builtin=True
-    tip
-   branches color=branch builtin=True
-    text.{rev}
-   revnames color=revname builtin=False
-    r2
-  
-  1
-   bookmarks color=bookmark builtin=True
-    baz
-   tags color=tag builtin=True
-    
-   branches color=branch builtin=True
-    text.{rev}
-   revnames color=revname builtin=False
-    r1
-  
-  0
-   bookmarks color=bookmark builtin=True
-    
-   tags color=tag builtin=True
-    
-   branches color=branch builtin=True
-    default
-   revnames color=revname builtin=False
-    r0
-  
-  $ hg log -r2 -T '{namespaces % "{namespace}: {names}\n"}'
-  bookmarks: bar foo
-  tags: tip
-  branches: text.{rev}
-  $ hg log -r2 -T '{namespaces % "{namespace}:\n{names % " {name}\n"}"}'
-  bookmarks:
-   bar
-   foo
-  tags:
-   tip
-  branches:
-   text.{rev}
-  $ hg log -r2 -T '{get(namespaces, "bookmarks") % "{name}\n"}'
-  bar
-  foo
-  $ hg log -r2 -T '{namespaces.bookmarks % "{bookmark}\n"}'
-  bar
-  foo
-
   $ cd ..
 
 Test bad template with better error message
@@ -2006,155 +1083,3 @@
   custom
 
   $ cd ..
-
-Test 'graphwidth' in 'hg log' on various topologies. The key here is that the
-printed graphwidths 3, 5, 7, etc. should all line up in their respective
-columns. We don't care about other aspects of the graph rendering here.
-
-  $ hg init graphwidth
-  $ cd graphwidth
-
-  $ wrappabletext="a a a a a a a a a a a a"
-
-  $ printf "first\n" > file
-  $ hg add file
-  $ hg commit -m "$wrappabletext"
-
-  $ printf "first\nsecond\n" > file
-  $ hg commit -m "$wrappabletext"
-
-  $ hg checkout 0
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ printf "third\nfirst\n" > file
-  $ hg commit -m "$wrappabletext"
-  created new head
-
-  $ hg merge
-  merging file
-  0 files updated, 1 files merged, 0 files removed, 0 files unresolved
-  (branch merge, don't forget to commit)
-
-  $ hg log --graph -T "{graphwidth}"
-  @  3
-  |
-  | @  5
-  |/
-  o  3
-  
-  $ hg commit -m "$wrappabletext"
-
-  $ hg log --graph -T "{graphwidth}"
-  @    5
-  |\
-  | o  5
-  | |
-  o |  5
-  |/
-  o  3
-  
-
-  $ hg checkout 0
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ printf "third\nfirst\nsecond\n" > file
-  $ hg commit -m "$wrappabletext"
-  created new head
-
-  $ hg log --graph -T "{graphwidth}"
-  @  3
-  |
-  | o    7
-  | |\
-  +---o  7
-  | |
-  | o  5
-  |/
-  o  3
-  
-
-  $ hg log --graph -T "{graphwidth}" -r 3
-  o    5
-  |\
-  ~ ~
-
-  $ hg log --graph -T "{graphwidth}" -r 1
-  o  3
-  |
-  ~
-
-  $ hg merge
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  (branch merge, don't forget to commit)
-  $ hg commit -m "$wrappabletext"
-
-  $ printf "seventh\n" >> file
-  $ hg commit -m "$wrappabletext"
-
-  $ hg log --graph -T "{graphwidth}"
-  @  3
-  |
-  o    5
-  |\
-  | o  5
-  | |
-  o |    7
-  |\ \
-  | o |  7
-  | |/
-  o /  5
-  |/
-  o  3
-  
-
-The point of graphwidth is to allow wrapping that accounts for the space taken
-by the graph.
-
-  $ COLUMNS=10 hg log --graph -T "{fill(desc, termwidth - graphwidth)}"
-  @  a a a a
-  |  a a a a
-  |  a a a a
-  o    a a a
-  |\   a a a
-  | |  a a a
-  | |  a a a
-  | o  a a a
-  | |  a a a
-  | |  a a a
-  | |  a a a
-  o |    a a
-  |\ \   a a
-  | | |  a a
-  | | |  a a
-  | | |  a a
-  | | |  a a
-  | o |  a a
-  | |/   a a
-  | |    a a
-  | |    a a
-  | |    a a
-  | |    a a
-  o |  a a a
-  |/   a a a
-  |    a a a
-  |    a a a
-  o  a a a a
-     a a a a
-     a a a a
-
-Something tricky happens when there are elided nodes; the next drawn row of
-edges can be more than one column wider, but the graph width only increases by
-one column. The remaining columns are added in between the nodes.
-
-  $ hg log --graph -T "{graphwidth}" -r "0|2|4|5"
-  o    5
-  |\
-  | \
-  | :\
-  o : :  7
-  :/ /
-  : o  5
-  :/
-  o  3
-  
-
-  $ cd ..
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-template-keywords.t	Sat Jun 16 14:14:52 2018 +0900
@@ -0,0 +1,1195 @@
+Test template keywords
+======================
+
+  $ hg init a
+  $ cd a
+  $ echo a > a
+  $ hg add a
+  $ echo line 1 > b
+  $ echo line 2 >> b
+  $ hg commit -l b -d '1000000 0' -u 'User Name <user@hostname>'
+
+  $ hg add b
+  $ echo other 1 > c
+  $ echo other 2 >> c
+  $ echo >> c
+  $ echo other 3 >> c
+  $ hg commit -l c -d '1100000 0' -u 'A. N. Other <other@place>'
+
+  $ hg add c
+  $ hg commit -m 'no person' -d '1200000 0' -u 'other@place'
+  $ echo c >> c
+  $ hg commit -m 'no user, no domain' -d '1300000 0' -u 'person'
+
+  $ echo foo > .hg/branch
+  $ hg commit -m 'new branch' -d '1400000 0' -u 'person'
+
+  $ hg co -q 3
+  $ echo other 4 >> d
+  $ hg add d
+  $ hg commit -m 'new head' -d '1500000 0' -u 'person'
+
+  $ hg merge -q foo
+  $ hg commit -m 'merge' -d '1500001 0' -u 'person'
+
+Second branch starting at nullrev:
+
+  $ hg update null
+  0 files updated, 0 files merged, 4 files removed, 0 files unresolved
+  $ echo second > second
+  $ hg add second
+  $ hg commit -m second -d '1000000 0' -u 'User Name <user@hostname>'
+  created new head
+
+  $ echo third > third
+  $ hg add third
+  $ hg mv second fourth
+  $ hg commit -m third -d "2020-01-01 10:01"
+
+Working-directory revision has special identifiers, though they are still
+experimental:
+
+  $ hg log -r 'wdir()' -T '{rev}:{node}\n'
+  2147483647:ffffffffffffffffffffffffffffffffffffffff
+
+Some keywords are invalid for working-directory revision, but they should
+never cause crash:
+
+  $ hg log -r 'wdir()' -T '{manifest}\n'
+  
+
+Check that {phase} works correctly on parents:
+
+  $ cat << EOF > parentphase
+  > changeset_debug = '{rev} ({phase}):{parents}\n'
+  > parent = ' {rev} ({phase})'
+  > EOF
+  $ hg phase -r 5 --public
+  $ hg phase -r 7 --secret --force
+  $ hg log --debug -G --style ./parentphase
+  @  8 (secret): 7 (secret) -1 (public)
+  |
+  o  7 (secret): -1 (public) -1 (public)
+  
+  o    6 (draft): 5 (public) 4 (draft)
+  |\
+  | o  5 (public): 3 (public) -1 (public)
+  | |
+  o |  4 (draft): 3 (public) -1 (public)
+  |/
+  o  3 (public): 2 (public) -1 (public)
+  |
+  o  2 (public): 1 (public) -1 (public)
+  |
+  o  1 (public): 0 (public) -1 (public)
+  |
+  o  0 (public): -1 (public) -1 (public)
+  
+
+Keys work:
+
+  $ for key in author branch branches date desc file_adds file_dels file_mods \
+  >         file_copies file_copies_switch files \
+  >         manifest node parents rev tags diffstat extras \
+  >         p1rev p2rev p1node p2node; do
+  >     for mode in '' --verbose --debug; do
+  >         hg log $mode --template "$key$mode: {$key}\n"
+  >     done
+  > done
+  author: test
+  author: User Name <user@hostname>
+  author: person
+  author: person
+  author: person
+  author: person
+  author: other@place
+  author: A. N. Other <other@place>
+  author: User Name <user@hostname>
+  author--verbose: test
+  author--verbose: User Name <user@hostname>
+  author--verbose: person
+  author--verbose: person
+  author--verbose: person
+  author--verbose: person
+  author--verbose: other@place
+  author--verbose: A. N. Other <other@place>
+  author--verbose: User Name <user@hostname>
+  author--debug: test
+  author--debug: User Name <user@hostname>
+  author--debug: person
+  author--debug: person
+  author--debug: person
+  author--debug: person
+  author--debug: other@place
+  author--debug: A. N. Other <other@place>
+  author--debug: User Name <user@hostname>
+  branch: default
+  branch: default
+  branch: default
+  branch: default
+  branch: foo
+  branch: default
+  branch: default
+  branch: default
+  branch: default
+  branch--verbose: default
+  branch--verbose: default
+  branch--verbose: default
+  branch--verbose: default
+  branch--verbose: foo
+  branch--verbose: default
+  branch--verbose: default
+  branch--verbose: default
+  branch--verbose: default
+  branch--debug: default
+  branch--debug: default
+  branch--debug: default
+  branch--debug: default
+  branch--debug: foo
+  branch--debug: default
+  branch--debug: default
+  branch--debug: default
+  branch--debug: default
+  branches: 
+  branches: 
+  branches: 
+  branches: 
+  branches: foo
+  branches: 
+  branches: 
+  branches: 
+  branches: 
+  branches--verbose: 
+  branches--verbose: 
+  branches--verbose: 
+  branches--verbose: 
+  branches--verbose: foo
+  branches--verbose: 
+  branches--verbose: 
+  branches--verbose: 
+  branches--verbose: 
+  branches--debug: 
+  branches--debug: 
+  branches--debug: 
+  branches--debug: 
+  branches--debug: foo
+  branches--debug: 
+  branches--debug: 
+  branches--debug: 
+  branches--debug: 
+  date: 1577872860.00
+  date: 1000000.00
+  date: 1500001.00
+  date: 1500000.00
+  date: 1400000.00
+  date: 1300000.00
+  date: 1200000.00
+  date: 1100000.00
+  date: 1000000.00
+  date--verbose: 1577872860.00
+  date--verbose: 1000000.00
+  date--verbose: 1500001.00
+  date--verbose: 1500000.00
+  date--verbose: 1400000.00
+  date--verbose: 1300000.00
+  date--verbose: 1200000.00
+  date--verbose: 1100000.00
+  date--verbose: 1000000.00
+  date--debug: 1577872860.00
+  date--debug: 1000000.00
+  date--debug: 1500001.00
+  date--debug: 1500000.00
+  date--debug: 1400000.00
+  date--debug: 1300000.00
+  date--debug: 1200000.00
+  date--debug: 1100000.00
+  date--debug: 1000000.00
+  desc: third
+  desc: second
+  desc: merge
+  desc: new head
+  desc: new branch
+  desc: no user, no domain
+  desc: no person
+  desc: other 1
+  other 2
+  
+  other 3
+  desc: line 1
+  line 2
+  desc--verbose: third
+  desc--verbose: second
+  desc--verbose: merge
+  desc--verbose: new head
+  desc--verbose: new branch
+  desc--verbose: no user, no domain
+  desc--verbose: no person
+  desc--verbose: other 1
+  other 2
+  
+  other 3
+  desc--verbose: line 1
+  line 2
+  desc--debug: third
+  desc--debug: second
+  desc--debug: merge
+  desc--debug: new head
+  desc--debug: new branch
+  desc--debug: no user, no domain
+  desc--debug: no person
+  desc--debug: other 1
+  other 2
+  
+  other 3
+  desc--debug: line 1
+  line 2
+  file_adds: fourth third
+  file_adds: second
+  file_adds: 
+  file_adds: d
+  file_adds: 
+  file_adds: 
+  file_adds: c
+  file_adds: b
+  file_adds: a
+  file_adds--verbose: fourth third
+  file_adds--verbose: second
+  file_adds--verbose: 
+  file_adds--verbose: d
+  file_adds--verbose: 
+  file_adds--verbose: 
+  file_adds--verbose: c
+  file_adds--verbose: b
+  file_adds--verbose: a
+  file_adds--debug: fourth third
+  file_adds--debug: second
+  file_adds--debug: 
+  file_adds--debug: d
+  file_adds--debug: 
+  file_adds--debug: 
+  file_adds--debug: c
+  file_adds--debug: b
+  file_adds--debug: a
+  file_dels: second
+  file_dels: 
+  file_dels: 
+  file_dels: 
+  file_dels: 
+  file_dels: 
+  file_dels: 
+  file_dels: 
+  file_dels: 
+  file_dels--verbose: second
+  file_dels--verbose: 
+  file_dels--verbose: 
+  file_dels--verbose: 
+  file_dels--verbose: 
+  file_dels--verbose: 
+  file_dels--verbose: 
+  file_dels--verbose: 
+  file_dels--verbose: 
+  file_dels--debug: second
+  file_dels--debug: 
+  file_dels--debug: 
+  file_dels--debug: 
+  file_dels--debug: 
+  file_dels--debug: 
+  file_dels--debug: 
+  file_dels--debug: 
+  file_dels--debug: 
+  file_mods: 
+  file_mods: 
+  file_mods: 
+  file_mods: 
+  file_mods: 
+  file_mods: c
+  file_mods: 
+  file_mods: 
+  file_mods: 
+  file_mods--verbose: 
+  file_mods--verbose: 
+  file_mods--verbose: 
+  file_mods--verbose: 
+  file_mods--verbose: 
+  file_mods--verbose: c
+  file_mods--verbose: 
+  file_mods--verbose: 
+  file_mods--verbose: 
+  file_mods--debug: 
+  file_mods--debug: 
+  file_mods--debug: 
+  file_mods--debug: 
+  file_mods--debug: 
+  file_mods--debug: c
+  file_mods--debug: 
+  file_mods--debug: 
+  file_mods--debug: 
+  file_copies: fourth (second)
+  file_copies: 
+  file_copies: 
+  file_copies: 
+  file_copies: 
+  file_copies: 
+  file_copies: 
+  file_copies: 
+  file_copies: 
+  file_copies--verbose: fourth (second)
+  file_copies--verbose: 
+  file_copies--verbose: 
+  file_copies--verbose: 
+  file_copies--verbose: 
+  file_copies--verbose: 
+  file_copies--verbose: 
+  file_copies--verbose: 
+  file_copies--verbose: 
+  file_copies--debug: fourth (second)
+  file_copies--debug: 
+  file_copies--debug: 
+  file_copies--debug: 
+  file_copies--debug: 
+  file_copies--debug: 
+  file_copies--debug: 
+  file_copies--debug: 
+  file_copies--debug: 
+  file_copies_switch: 
+  file_copies_switch: 
+  file_copies_switch: 
+  file_copies_switch: 
+  file_copies_switch: 
+  file_copies_switch: 
+  file_copies_switch: 
+  file_copies_switch: 
+  file_copies_switch: 
+  file_copies_switch--verbose: 
+  file_copies_switch--verbose: 
+  file_copies_switch--verbose: 
+  file_copies_switch--verbose: 
+  file_copies_switch--verbose: 
+  file_copies_switch--verbose: 
+  file_copies_switch--verbose: 
+  file_copies_switch--verbose: 
+  file_copies_switch--verbose: 
+  file_copies_switch--debug: 
+  file_copies_switch--debug: 
+  file_copies_switch--debug: 
+  file_copies_switch--debug: 
+  file_copies_switch--debug: 
+  file_copies_switch--debug: 
+  file_copies_switch--debug: 
+  file_copies_switch--debug: 
+  file_copies_switch--debug: 
+  files: fourth second third
+  files: second
+  files: 
+  files: d
+  files: 
+  files: c
+  files: c
+  files: b
+  files: a
+  files--verbose: fourth second third
+  files--verbose: second
+  files--verbose: 
+  files--verbose: d
+  files--verbose: 
+  files--verbose: c
+  files--verbose: c
+  files--verbose: b
+  files--verbose: a
+  files--debug: fourth second third
+  files--debug: second
+  files--debug: 
+  files--debug: d
+  files--debug: 
+  files--debug: c
+  files--debug: c
+  files--debug: b
+  files--debug: a
+  manifest: 6:94961b75a2da
+  manifest: 5:f2dbc354b94e
+  manifest: 4:4dc3def4f9b4
+  manifest: 4:4dc3def4f9b4
+  manifest: 3:cb5a1327723b
+  manifest: 3:cb5a1327723b
+  manifest: 2:6e0e82995c35
+  manifest: 1:4e8d705b1e53
+  manifest: 0:a0c8bcbbb45c
+  manifest--verbose: 6:94961b75a2da
+  manifest--verbose: 5:f2dbc354b94e
+  manifest--verbose: 4:4dc3def4f9b4
+  manifest--verbose: 4:4dc3def4f9b4
+  manifest--verbose: 3:cb5a1327723b
+  manifest--verbose: 3:cb5a1327723b
+  manifest--verbose: 2:6e0e82995c35
+  manifest--verbose: 1:4e8d705b1e53
+  manifest--verbose: 0:a0c8bcbbb45c
+  manifest--debug: 6:94961b75a2da554b4df6fb599e5bfc7d48de0c64
+  manifest--debug: 5:f2dbc354b94e5ec0b4f10680ee0cee816101d0bf
+  manifest--debug: 4:4dc3def4f9b4c6e8de820f6ee74737f91e96a216
+  manifest--debug: 4:4dc3def4f9b4c6e8de820f6ee74737f91e96a216
+  manifest--debug: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
+  manifest--debug: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
+  manifest--debug: 2:6e0e82995c35d0d57a52aca8da4e56139e06b4b1
+  manifest--debug: 1:4e8d705b1e53e3f9375e0e60dc7b525d8211fe55
+  manifest--debug: 0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0
+  node: 95c24699272ef57d062b8bccc32c878bf841784a
+  node: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
+  node: d41e714fe50d9e4a5f11b4d595d543481b5f980b
+  node: 13207e5a10d9fd28ec424934298e176197f2c67f
+  node: bbe44766e73d5f11ed2177f1838de10c53ef3e74
+  node: 10e46f2dcbf4823578cf180f33ecf0b957964c47
+  node: 97054abb4ab824450e9164180baf491ae0078465
+  node: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
+  node: 1e4e1b8f71e05681d422154f5421e385fec3454f
+  node--verbose: 95c24699272ef57d062b8bccc32c878bf841784a
+  node--verbose: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
+  node--verbose: d41e714fe50d9e4a5f11b4d595d543481b5f980b
+  node--verbose: 13207e5a10d9fd28ec424934298e176197f2c67f
+  node--verbose: bbe44766e73d5f11ed2177f1838de10c53ef3e74
+  node--verbose: 10e46f2dcbf4823578cf180f33ecf0b957964c47
+  node--verbose: 97054abb4ab824450e9164180baf491ae0078465
+  node--verbose: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
+  node--verbose: 1e4e1b8f71e05681d422154f5421e385fec3454f
+  node--debug: 95c24699272ef57d062b8bccc32c878bf841784a
+  node--debug: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
+  node--debug: d41e714fe50d9e4a5f11b4d595d543481b5f980b
+  node--debug: 13207e5a10d9fd28ec424934298e176197f2c67f
+  node--debug: bbe44766e73d5f11ed2177f1838de10c53ef3e74
+  node--debug: 10e46f2dcbf4823578cf180f33ecf0b957964c47
+  node--debug: 97054abb4ab824450e9164180baf491ae0078465
+  node--debug: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
+  node--debug: 1e4e1b8f71e05681d422154f5421e385fec3454f
+  parents: 
+  parents: -1:000000000000 
+  parents: 5:13207e5a10d9 4:bbe44766e73d 
+  parents: 3:10e46f2dcbf4 
+  parents: 
+  parents: 
+  parents: 
+  parents: 
+  parents: 
+  parents--verbose: 
+  parents--verbose: -1:000000000000 
+  parents--verbose: 5:13207e5a10d9 4:bbe44766e73d 
+  parents--verbose: 3:10e46f2dcbf4 
+  parents--verbose: 
+  parents--verbose: 
+  parents--verbose: 
+  parents--verbose: 
+  parents--verbose: 
+  parents--debug: 7:29114dbae42b9f078cf2714dbe3a86bba8ec7453 -1:0000000000000000000000000000000000000000 
+  parents--debug: -1:0000000000000000000000000000000000000000 -1:0000000000000000000000000000000000000000 
+  parents--debug: 5:13207e5a10d9fd28ec424934298e176197f2c67f 4:bbe44766e73d5f11ed2177f1838de10c53ef3e74 
+  parents--debug: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47 -1:0000000000000000000000000000000000000000 
+  parents--debug: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47 -1:0000000000000000000000000000000000000000 
+  parents--debug: 2:97054abb4ab824450e9164180baf491ae0078465 -1:0000000000000000000000000000000000000000 
+  parents--debug: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965 -1:0000000000000000000000000000000000000000 
+  parents--debug: 0:1e4e1b8f71e05681d422154f5421e385fec3454f -1:0000000000000000000000000000000000000000 
+  parents--debug: -1:0000000000000000000000000000000000000000 -1:0000000000000000000000000000000000000000 
+  rev: 8
+  rev: 7
+  rev: 6
+  rev: 5
+  rev: 4
+  rev: 3
+  rev: 2
+  rev: 1
+  rev: 0
+  rev--verbose: 8
+  rev--verbose: 7
+  rev--verbose: 6
+  rev--verbose: 5
+  rev--verbose: 4
+  rev--verbose: 3
+  rev--verbose: 2
+  rev--verbose: 1
+  rev--verbose: 0
+  rev--debug: 8
+  rev--debug: 7
+  rev--debug: 6
+  rev--debug: 5
+  rev--debug: 4
+  rev--debug: 3
+  rev--debug: 2
+  rev--debug: 1
+  rev--debug: 0
+  tags: tip
+  tags: 
+  tags: 
+  tags: 
+  tags: 
+  tags: 
+  tags: 
+  tags: 
+  tags: 
+  tags--verbose: tip
+  tags--verbose: 
+  tags--verbose: 
+  tags--verbose: 
+  tags--verbose: 
+  tags--verbose: 
+  tags--verbose: 
+  tags--verbose: 
+  tags--verbose: 
+  tags--debug: tip
+  tags--debug: 
+  tags--debug: 
+  tags--debug: 
+  tags--debug: 
+  tags--debug: 
+  tags--debug: 
+  tags--debug: 
+  tags--debug: 
+  diffstat: 3: +2/-1
+  diffstat: 1: +1/-0
+  diffstat: 0: +0/-0
+  diffstat: 1: +1/-0
+  diffstat: 0: +0/-0
+  diffstat: 1: +1/-0
+  diffstat: 1: +4/-0
+  diffstat: 1: +2/-0
+  diffstat: 1: +1/-0
+  diffstat--verbose: 3: +2/-1
+  diffstat--verbose: 1: +1/-0
+  diffstat--verbose: 0: +0/-0
+  diffstat--verbose: 1: +1/-0
+  diffstat--verbose: 0: +0/-0
+  diffstat--verbose: 1: +1/-0
+  diffstat--verbose: 1: +4/-0
+  diffstat--verbose: 1: +2/-0
+  diffstat--verbose: 1: +1/-0
+  diffstat--debug: 3: +2/-1
+  diffstat--debug: 1: +1/-0
+  diffstat--debug: 0: +0/-0
+  diffstat--debug: 1: +1/-0
+  diffstat--debug: 0: +0/-0
+  diffstat--debug: 1: +1/-0
+  diffstat--debug: 1: +4/-0
+  diffstat--debug: 1: +2/-0
+  diffstat--debug: 1: +1/-0
+  extras: branch=default
+  extras: branch=default
+  extras: branch=default
+  extras: branch=default
+  extras: branch=foo
+  extras: branch=default
+  extras: branch=default
+  extras: branch=default
+  extras: branch=default
+  extras--verbose: branch=default
+  extras--verbose: branch=default
+  extras--verbose: branch=default
+  extras--verbose: branch=default
+  extras--verbose: branch=foo
+  extras--verbose: branch=default
+  extras--verbose: branch=default
+  extras--verbose: branch=default
+  extras--verbose: branch=default
+  extras--debug: branch=default
+  extras--debug: branch=default
+  extras--debug: branch=default
+  extras--debug: branch=default
+  extras--debug: branch=foo
+  extras--debug: branch=default
+  extras--debug: branch=default
+  extras--debug: branch=default
+  extras--debug: branch=default
+  p1rev: 7
+  p1rev: -1
+  p1rev: 5
+  p1rev: 3
+  p1rev: 3
+  p1rev: 2
+  p1rev: 1
+  p1rev: 0
+  p1rev: -1
+  p1rev--verbose: 7
+  p1rev--verbose: -1
+  p1rev--verbose: 5
+  p1rev--verbose: 3
+  p1rev--verbose: 3
+  p1rev--verbose: 2
+  p1rev--verbose: 1
+  p1rev--verbose: 0
+  p1rev--verbose: -1
+  p1rev--debug: 7
+  p1rev--debug: -1
+  p1rev--debug: 5
+  p1rev--debug: 3
+  p1rev--debug: 3
+  p1rev--debug: 2
+  p1rev--debug: 1
+  p1rev--debug: 0
+  p1rev--debug: -1
+  p2rev: -1
+  p2rev: -1
+  p2rev: 4
+  p2rev: -1
+  p2rev: -1
+  p2rev: -1
+  p2rev: -1
+  p2rev: -1
+  p2rev: -1
+  p2rev--verbose: -1
+  p2rev--verbose: -1
+  p2rev--verbose: 4
+  p2rev--verbose: -1
+  p2rev--verbose: -1
+  p2rev--verbose: -1
+  p2rev--verbose: -1
+  p2rev--verbose: -1
+  p2rev--verbose: -1
+  p2rev--debug: -1
+  p2rev--debug: -1
+  p2rev--debug: 4
+  p2rev--debug: -1
+  p2rev--debug: -1
+  p2rev--debug: -1
+  p2rev--debug: -1
+  p2rev--debug: -1
+  p2rev--debug: -1
+  p1node: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
+  p1node: 0000000000000000000000000000000000000000
+  p1node: 13207e5a10d9fd28ec424934298e176197f2c67f
+  p1node: 10e46f2dcbf4823578cf180f33ecf0b957964c47
+  p1node: 10e46f2dcbf4823578cf180f33ecf0b957964c47
+  p1node: 97054abb4ab824450e9164180baf491ae0078465
+  p1node: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
+  p1node: 1e4e1b8f71e05681d422154f5421e385fec3454f
+  p1node: 0000000000000000000000000000000000000000
+  p1node--verbose: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
+  p1node--verbose: 0000000000000000000000000000000000000000
+  p1node--verbose: 13207e5a10d9fd28ec424934298e176197f2c67f
+  p1node--verbose: 10e46f2dcbf4823578cf180f33ecf0b957964c47
+  p1node--verbose: 10e46f2dcbf4823578cf180f33ecf0b957964c47
+  p1node--verbose: 97054abb4ab824450e9164180baf491ae0078465
+  p1node--verbose: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
+  p1node--verbose: 1e4e1b8f71e05681d422154f5421e385fec3454f
+  p1node--verbose: 0000000000000000000000000000000000000000
+  p1node--debug: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
+  p1node--debug: 0000000000000000000000000000000000000000
+  p1node--debug: 13207e5a10d9fd28ec424934298e176197f2c67f
+  p1node--debug: 10e46f2dcbf4823578cf180f33ecf0b957964c47
+  p1node--debug: 10e46f2dcbf4823578cf180f33ecf0b957964c47
+  p1node--debug: 97054abb4ab824450e9164180baf491ae0078465
+  p1node--debug: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
+  p1node--debug: 1e4e1b8f71e05681d422154f5421e385fec3454f
+  p1node--debug: 0000000000000000000000000000000000000000
+  p2node: 0000000000000000000000000000000000000000
+  p2node: 0000000000000000000000000000000000000000
+  p2node: bbe44766e73d5f11ed2177f1838de10c53ef3e74
+  p2node: 0000000000000000000000000000000000000000
+  p2node: 0000000000000000000000000000000000000000
+  p2node: 0000000000000000000000000000000000000000
+  p2node: 0000000000000000000000000000000000000000
+  p2node: 0000000000000000000000000000000000000000
+  p2node: 0000000000000000000000000000000000000000
+  p2node--verbose: 0000000000000000000000000000000000000000
+  p2node--verbose: 0000000000000000000000000000000000000000
+  p2node--verbose: bbe44766e73d5f11ed2177f1838de10c53ef3e74
+  p2node--verbose: 0000000000000000000000000000000000000000
+  p2node--verbose: 0000000000000000000000000000000000000000
+  p2node--verbose: 0000000000000000000000000000000000000000
+  p2node--verbose: 0000000000000000000000000000000000000000
+  p2node--verbose: 0000000000000000000000000000000000000000
+  p2node--verbose: 0000000000000000000000000000000000000000
+  p2node--debug: 0000000000000000000000000000000000000000
+  p2node--debug: 0000000000000000000000000000000000000000
+  p2node--debug: bbe44766e73d5f11ed2177f1838de10c53ef3e74
+  p2node--debug: 0000000000000000000000000000000000000000
+  p2node--debug: 0000000000000000000000000000000000000000
+  p2node--debug: 0000000000000000000000000000000000000000
+  p2node--debug: 0000000000000000000000000000000000000000
+  p2node--debug: 0000000000000000000000000000000000000000
+  p2node--debug: 0000000000000000000000000000000000000000
+
+Add a dummy commit to make up for the instability of the above:
+
+  $ echo a > a
+  $ hg add a
+  $ hg ci -m future
+
+Add a commit that does all possible modifications at once
+
+  $ echo modify >> third
+  $ touch b
+  $ hg add b
+  $ hg mv fourth fifth
+  $ hg rm a
+  $ hg ci -m "Modify, add, remove, rename"
+
+Test index keyword:
+
+  $ hg log -l 2 -T '{index + 10}{files % " {index}:{file}"}\n'
+  10 0:a 1:b 2:fifth 3:fourth 4:third
+  11 0:a
+
+  $ hg branches -T '{index} {branch}\n'
+  0 default
+  1 foo
+
+ui verbosity:
+
+  $ hg log -l1 -T '{verbosity}\n'
+  
+  $ hg log -l1 -T '{verbosity}\n' --debug
+  debug
+  $ hg log -l1 -T '{verbosity}\n' --quiet
+  quiet
+  $ hg log -l1 -T '{verbosity}\n' --verbose
+  verbose
+
+  $ cd ..
+
+latesttag:
+
+  $ hg init latesttag
+  $ cd latesttag
+
+  $ echo a > file
+  $ hg ci -Am a -d '0 0'
+  adding file
+
+  $ echo b >> file
+  $ hg ci -m b -d '1 0'
+
+  $ echo c >> head1
+  $ hg ci -Am h1c -d '2 0'
+  adding head1
+
+  $ hg update -q 1
+  $ echo d >> head2
+  $ hg ci -Am h2d -d '3 0'
+  adding head2
+  created new head
+
+  $ echo e >> head2
+  $ hg ci -m h2e -d '4 0'
+
+  $ hg merge -q
+  $ hg ci -m merge -d '5 -3600'
+
+No tag set:
+
+  $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n'
+  @    5: null+5
+  |\
+  | o  4: null+4
+  | |
+  | o  3: null+3
+  | |
+  o |  2: null+3
+  |/
+  o  1: null+2
+  |
+  o  0: null+1
+  
+
+One common tag: longest path wins for {latesttagdistance}:
+
+  $ hg tag -r 1 -m t1 -d '6 0' t1
+  $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n'
+  @  6: t1+4
+  |
+  o    5: t1+3
+  |\
+  | o  4: t1+2
+  | |
+  | o  3: t1+1
+  | |
+  o |  2: t1+1
+  |/
+  o  1: t1+0
+  |
+  o  0: null+1
+  
+
+One ancestor tag: closest wins:
+
+  $ hg tag -r 2 -m t2 -d '7 0' t2
+  $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n'
+  @  7: t2+3
+  |
+  o  6: t2+2
+  |
+  o    5: t2+1
+  |\
+  | o  4: t1+2
+  | |
+  | o  3: t1+1
+  | |
+  o |  2: t2+0
+  |/
+  o  1: t1+0
+  |
+  o  0: null+1
+  
+
+Two branch tags: more recent wins if same number of changes:
+
+  $ hg tag -r 3 -m t3 -d '8 0' t3
+  $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n'
+  @  8: t3+5
+  |
+  o  7: t3+4
+  |
+  o  6: t3+3
+  |
+  o    5: t3+2
+  |\
+  | o  4: t3+1
+  | |
+  | o  3: t3+0
+  | |
+  o |  2: t2+0
+  |/
+  o  1: t1+0
+  |
+  o  0: null+1
+  
+
+Two branch tags: fewest changes wins:
+
+  $ hg tag -r 4 -m t4 -d '4 0' t4 # older than t2, but should not matter
+  $ hg log -G --template "{rev}: {latesttag % '{tag}+{distance},{changes} '}\n"
+  @  9: t4+5,6
+  |
+  o  8: t4+4,5
+  |
+  o  7: t4+3,4
+  |
+  o  6: t4+2,3
+  |
+  o    5: t4+1,2
+  |\
+  | o  4: t4+0,0
+  | |
+  | o  3: t3+0,0
+  | |
+  o |  2: t2+0,0
+  |/
+  o  1: t1+0,0
+  |
+  o  0: null+1,1
+  
+
+Merged tag overrides:
+
+  $ hg tag -r 5 -m t5 -d '9 0' t5
+  $ hg tag -r 3 -m at3 -d '10 0' at3
+  $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n'
+  @  11: t5+6
+  |
+  o  10: t5+5
+  |
+  o  9: t5+4
+  |
+  o  8: t5+3
+  |
+  o  7: t5+2
+  |
+  o  6: t5+1
+  |
+  o    5: t5+0
+  |\
+  | o  4: t4+0
+  | |
+  | o  3: at3:t3+0
+  | |
+  o |  2: t2+0
+  |/
+  o  1: t1+0
+  |
+  o  0: null+1
+  
+
+  $ hg log -G --template "{rev}: {latesttag % '{tag}+{distance},{changes} '}\n"
+  @  11: t5+6,6
+  |
+  o  10: t5+5,5
+  |
+  o  9: t5+4,4
+  |
+  o  8: t5+3,3
+  |
+  o  7: t5+2,2
+  |
+  o  6: t5+1,1
+  |
+  o    5: t5+0,0
+  |\
+  | o  4: t4+0,0
+  | |
+  | o  3: at3+0,0 t3+0,0
+  | |
+  o |  2: t2+0,0
+  |/
+  o  1: t1+0,0
+  |
+  o  0: null+1,1
+  
+
+  $ cd ..
+
+Set up repository containing template fragments in commit metadata:
+
+  $ hg init r
+  $ cd r
+  $ echo a > a
+  $ hg ci -Am '{rev}'
+  adding a
+
+  $ hg branch -q 'text.{rev}'
+  $ echo aa >> aa
+  $ hg ci -u '{node|short}' -m 'desc to be wrapped desc to be wrapped'
+
+Test termwidth:
+
+  $ COLUMNS=25 hg log -l1 --template '{fill(desc, termwidth, "{node|short}:", "termwidth.{rev}:")}'
+  bcc7ff960b8e:desc to be
+  termwidth.1:wrapped desc
+  termwidth.1:to be wrapped (no-eol)
+
+Just one more commit:
+
+  $ echo b > b
+  $ hg ci -qAm b
+
+Test 'originalnode'
+
+  $ hg log -r 1 -T '{revset("null") % "{node|short} {originalnode|short}"}\n'
+  000000000000 bcc7ff960b8e
+  $ hg log -r 0 -T '{manifest % "{node} {originalnode}"}\n'
+  a0c8bcbbb45c63b90b70ad007bf38961f64f2af0 f7769ec2ab975ad19684098ad1ffd9b81ecc71a1
+
+Test active bookmark templating
+
+  $ hg book foo
+  $ hg book bar
+  $ hg log --template "{rev} {bookmarks % '{bookmark}{ifeq(bookmark, active, \"*\")} '}\n"
+  2 bar* foo 
+  1 
+  0 
+  $ hg log --template "{rev} {activebookmark}\n"
+  2 bar
+  1 
+  0 
+  $ hg bookmarks --inactive bar
+  $ hg log --template "{rev} {activebookmark}\n"
+  2 
+  1 
+  0 
+  $ hg book -r1 baz
+  $ hg log --template "{rev} {join(bookmarks, ' ')}\n"
+  2 bar foo
+  1 baz
+  0 
+  $ hg log --template "{rev} {ifcontains('foo', bookmarks, 't', 'f')}\n"
+  2 t
+  1 f
+  0 f
+
+Test namespaces dict
+
+  $ hg --config extensions.revnamesext=$TESTDIR/revnamesext.py log -T '{rev}\n{namespaces % " {namespace} color={colorname} builtin={builtin}\n  {join(names, ",")}\n"}\n'
+  2
+   bookmarks color=bookmark builtin=True
+    bar,foo
+   tags color=tag builtin=True
+    tip
+   branches color=branch builtin=True
+    text.{rev}
+   revnames color=revname builtin=False
+    r2
+  
+  1
+   bookmarks color=bookmark builtin=True
+    baz
+   tags color=tag builtin=True
+    
+   branches color=branch builtin=True
+    text.{rev}
+   revnames color=revname builtin=False
+    r1
+  
+  0
+   bookmarks color=bookmark builtin=True
+    
+   tags color=tag builtin=True
+    
+   branches color=branch builtin=True
+    default
+   revnames color=revname builtin=False
+    r0
+  
+  $ hg log -r2 -T '{namespaces % "{namespace}: {names}\n"}'
+  bookmarks: bar foo
+  tags: tip
+  branches: text.{rev}
+  $ hg log -r2 -T '{namespaces % "{namespace}:\n{names % " {name}\n"}"}'
+  bookmarks:
+   bar
+   foo
+  tags:
+   tip
+  branches:
+   text.{rev}
+  $ hg log -r2 -T '{get(namespaces, "bookmarks") % "{name}\n"}'
+  bar
+  foo
+  $ hg log -r2 -T '{namespaces.bookmarks % "{bookmark}\n"}'
+  bar
+  foo
+
+  $ cd ..
+
+Test 'graphwidth' in 'hg log' on various topologies. The key here is that the
+printed graphwidths 3, 5, 7, etc. should all line up in their respective
+columns. We don't care about other aspects of the graph rendering here.
+
+  $ hg init graphwidth
+  $ cd graphwidth
+
+  $ wrappabletext="a a a a a a a a a a a a"
+
+  $ printf "first\n" > file
+  $ hg add file
+  $ hg commit -m "$wrappabletext"
+
+  $ printf "first\nsecond\n" > file
+  $ hg commit -m "$wrappabletext"
+
+  $ hg checkout 0
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ printf "third\nfirst\n" > file
+  $ hg commit -m "$wrappabletext"
+  created new head
+
+  $ hg merge
+  merging file
+  0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+
+  $ hg log --graph -T "{graphwidth}"
+  @  3
+  |
+  | @  5
+  |/
+  o  3
+  
+  $ hg commit -m "$wrappabletext"
+
+  $ hg log --graph -T "{graphwidth}"
+  @    5
+  |\
+  | o  5
+  | |
+  o |  5
+  |/
+  o  3
+  
+
+  $ hg checkout 0
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ printf "third\nfirst\nsecond\n" > file
+  $ hg commit -m "$wrappabletext"
+  created new head
+
+  $ hg log --graph -T "{graphwidth}"
+  @  3
+  |
+  | o    7
+  | |\
+  +---o  7
+  | |
+  | o  5
+  |/
+  o  3
+  
+
+  $ hg log --graph -T "{graphwidth}" -r 3
+  o    5
+  |\
+  ~ ~
+
+  $ hg log --graph -T "{graphwidth}" -r 1
+  o  3
+  |
+  ~
+
+  $ hg merge
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  $ hg commit -m "$wrappabletext"
+
+  $ printf "seventh\n" >> file
+  $ hg commit -m "$wrappabletext"
+
+  $ hg log --graph -T "{graphwidth}"
+  @  3
+  |
+  o    5
+  |\
+  | o  5
+  | |
+  o |    7
+  |\ \
+  | o |  7
+  | |/
+  o /  5
+  |/
+  o  3
+  
+
+The point of graphwidth is to allow wrapping that accounts for the space taken
+by the graph.
+
+  $ COLUMNS=10 hg log --graph -T "{fill(desc, termwidth - graphwidth)}"
+  @  a a a a
+  |  a a a a
+  |  a a a a
+  o    a a a
+  |\   a a a
+  | |  a a a
+  | |  a a a
+  | o  a a a
+  | |  a a a
+  | |  a a a
+  | |  a a a
+  o |    a a
+  |\ \   a a
+  | | |  a a
+  | | |  a a
+  | | |  a a
+  | | |  a a
+  | o |  a a
+  | |/   a a
+  | |    a a
+  | |    a a
+  | |    a a
+  | |    a a
+  o |  a a a
+  |/   a a a
+  |    a a a
+  |    a a a
+  o  a a a a
+     a a a a
+     a a a a
+
+Something tricky happens when there are elided nodes; the next drawn row of
+edges can be more than one column wider, but the graph width only increases by
+one column. The remaining columns are added in between the nodes.
+
+  $ hg log --graph -T "{graphwidth}" -r "0|2|4|5"
+  o    5
+  |\
+  | \
+  | :\
+  o : :  7
+  :/ /
+  : o  5
+  :/
+  o  3
+  
+
+  $ cd ..