##// END OF EJS Templates
templates: define a {onelinesummary} keyword...
templates: define a {onelinesummary} keyword It is sometimes useful to be able to use the configured `command-template.oneline-summary` in higher-level templates. For example, I would like to use it in an internal template that lists commits in a "review unit" (kind of a pull request). This patch adds support for that. We may want to define a way of formatting a context using a command-specific override (from `command-templates.oneline-summary.<command>`), but that will have to be a template function instead. I don't plan to do that, but I'm mentioning it now in case reviewers would prefer that we use a no-arg function (i.e. `{onelinesummary()}`) already today to prepare for that. Differential Revision: https://phab.mercurial-scm.org/D9314

File last commit:

r46472:dbc57472 default
r46472:dbc57472 default
Show More
test-template-keywords.t
1404 lines | 32.2 KiB | text/troff | Tads3Lexer
/ tests / test-template-keywords.t
Yuya Nishihara
tests: extract test-template-keywords.t from test-command-template.t
r38455 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
Yuya Nishihara
log: have changesetformatter fill in wdir() rev and node (BC)...
r39831 $ hg log -r 'wdir()' -Tjson --debug
[
{
"added": [],
"bookmarks": [],
"branch": "default",
"date": [0, 0],
"desc": "",
"extra": {"branch": "default"},
Yuya Nishihara
log: fill in pseudo rev and node as wdir() manifest identifiers...
r39832 "manifest": "ffffffffffffffffffffffffffffffffffffffff",
Yuya Nishihara
log: have changesetformatter fill in wdir() rev and node (BC)...
r39831 "modified": [],
"node": "ffffffffffffffffffffffffffffffffffffffff",
"parents": ["95c24699272ef57d062b8bccc32c878bf841784a"],
"phase": "draft",
"removed": [],
"rev": 2147483647,
"tags": [],
"user": "test"
}
]
Yuya Nishihara
tests: extract test-template-keywords.t from test-command-template.t
r38455 $ hg log -r 'wdir()' -T '{manifest}\n'
Yuya Nishihara
log: fill in pseudo rev and node as wdir() manifest identifiers...
r39832 2147483647:ffffffffffff
Yuya Nishihara
tests: extract test-template-keywords.t from test-command-template.t
r38455
Jordi Gutiérrez Hermoso
templatekw: make negrev return empty for wdir() and nullrev...
r41875 However, for negrev, we refuse to output anything (as well as for null)
$ hg log -r 'wdir() + null' -T 'bla{negrev}nk\n'
blank
blank
Yuya Nishihara
formatter: populate ctx from repo and node value...
r39659 Changectx-derived keywords are disabled within {manifest} as {node} changes:
$ hg log -r0 -T 'outer:{p1node} {manifest % "inner:{p1node}"}\n'
outer:0000000000000000000000000000000000000000 inner:
Yuya Nishihara
tests: extract test-template-keywords.t from test-command-template.t
r38455 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)
Martin von Zweigbergk
templates: define a {onelinesummary} keyword...
r46472 Test {onelinesummary}
$ hg log -G -T '{onelinesummary}'
@ 8:95c24699272e tip "third"
|
o 7:29114dbae42b "second"
o 6:d41e714fe50d "merge"
|\
| o 5:13207e5a10d9 "new head"
| |
o | 4:bbe44766e73d "new branch"
|/
o 3:10e46f2dcbf4 "no user, no domain"
|
o 2:97054abb4ab8 "no person"
|
o 1:b608e9d1a3f0 "other 1"
|
o 0:1e4e1b8f71e0 "line 1"
$ hg log -T '{onelinesummary}' -r 0 \
> --config command-templates.oneline-summary='{rev} - {desc}'
0 - line 1 (no-eol)
Yuya Nishihara
tests: extract test-template-keywords.t from test-command-template.t
r38455
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 \
Yuya Nishihara
templatekw: copy {author} to {user} and document {author} as an alias...
r38983 > p1rev p2rev p1node p2node user; do
Yuya Nishihara
tests: extract test-template-keywords.t from test-command-template.t
r38455 > 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
Yuya Nishihara
templatekw: copy {author} to {user} and document {author} as an alias...
r38983 user: test
user: User Name <user@hostname>
user: person
user: person
user: person
user: person
user: other@place
user: A. N. Other <other@place>
user: User Name <user@hostname>
user--verbose: test
user--verbose: User Name <user@hostname>
user--verbose: person
user--verbose: person
user--verbose: person
user--verbose: person
user--verbose: other@place
user--verbose: A. N. Other <other@place>
user--verbose: User Name <user@hostname>
user--debug: test
user--debug: User Name <user@hostname>
user--debug: person
user--debug: person
user--debug: person
user--debug: person
user--debug: other@place
user--debug: A. N. Other <other@place>
user--debug: User Name <user@hostname>
Yuya Nishihara
tests: extract test-template-keywords.t from test-command-template.t
r38455
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"
Yuya Nishihara
templatekw: alias {file} of files list to {path}...
r39403 Test files list:
$ hg log -l1 -T '{join(file_mods, " ")}\n'
third
$ hg log -l1 -T '{file_mods % "{file}\n"}'
third
$ hg log -l1 -T '{file_mods % "{path}\n"}'
third
$ hg log -l1 -T '{join(files, " ")}\n'
a b fifth fourth third
$ hg log -l1 -T '{files % "{file}\n"}'
a
b
fifth
fourth
third
$ hg log -l1 -T '{files % "{path}\n"}'
a
b
fifth
fourth
third
Martin von Zweigbergk
tests: add test for {file_mods}, {file_adds}, {file_dels} on merge commit...
r42567 Test files lists on merge commit:
$ hg co '.^' -q
$ touch c
$ hg add c
$ hg ci -qm 'add file'
$ hg merge 10 -q
$ hg ci -m 'merge'
$ hg log -l1 -T '{files}\n'
Valentin Gatien-Baron
commit: improve the files field of changelog for merges...
r42840
Martin von Zweigbergk
tests: add test for {file_mods}, {file_adds}, {file_dels} on merge commit...
r42567 $ hg log -l1 -T '{file_mods}\n'
Martin von Zweigbergk
templatekw: make {file_*} compare to both merge parents (issue4292)...
r42597
Martin von Zweigbergk
tests: add test for {file_mods}, {file_adds}, {file_dels} on merge commit...
r42567 $ hg log -l1 -T '{file_adds}\n'
Martin von Zweigbergk
templatekw: make {file_*} compare to both merge parents (issue4292)...
r42597
Martin von Zweigbergk
tests: add test for {file_mods}, {file_adds}, {file_dels} on merge commit...
r42567 $ hg log -l1 -T '{file_dels}\n'
Valentin Gatien-Baron
commit: improve the files field of changelog for merges...
r42840
Martin von Zweigbergk
tests: add test for {file_mods}, {file_adds}, {file_dels} on merge commit...
r42567
Yuya Nishihara
templatekw: alias {name} of file copies dict to {path}...
r39404 Test file copies dict:
$ hg log -r8 -T '{join(file_copies, " ")}\n'
fourth (second)
$ hg log -r8 -T '{file_copies % "{name} <- {source}\n"}'
fourth <- second
$ hg log -r8 -T '{file_copies % "{path} <- {source}\n"}'
fourth <- second
$ hg log -r8 -T '{join(file_copies_switch, " ")}\n'
$ hg log -r8 -C -T '{join(file_copies_switch, " ")}\n'
fourth (second)
$ hg log -r8 -C -T '{file_copies_switch % "{name} <- {source}\n"}'
fourth <- second
$ hg log -r8 -C -T '{file_copies_switch % "{path} <- {source}\n"}'
fourth <- second
Yuya Nishihara
templatekw: add {size} keyword as an example of fctx-based keyword...
r39623 Test file attributes:
Martin von Zweigbergk
tests: add test for {file_mods}, {file_adds}, {file_dels} on merge commit...
r42567 $ hg log -r10 -T '{files % "{status} {pad(size, 3, left=True)} {path}\n"}'
Yuya Nishihara
templatekw: add experimental {status} keyword...
r39636 R a
A 0 b
A 7 fifth
R fourth
M 13 third
Test file status including clean ones:
$ hg log -r9 -T '{files("**") % "{status} {path}\n"}'
A a
C fourth
C third
Yuya Nishihara
templatekw: add {size} keyword as an example of fctx-based keyword...
r39623
Yuya Nishihara
tests: extract test-template-keywords.t from test-command-template.t
r38455 Test index keyword:
Martin von Zweigbergk
tests: add test for {file_mods}, {file_adds}, {file_dels} on merge commit...
r42567 $ hg log -r 10:9 -T '{index + 10}{files % " {index}:{file}"}\n'
Yuya Nishihara
tests: extract test-template-keywords.t from test-command-template.t
r38455 10 0:a 1:b 2:fifth 3:fourth 4:third
11 0:a
$ hg branches -T '{index} {branch}\n'
0 default
1 foo
Yuya Nishihara
templatekw: add p1/p2 keywords which switches the current ctx...
r40510 p1/p2 keywords:
$ hg log -r4:7 -GT '{rev} p1:{p1} p2:{p2} p1.rev:{p1.rev} p2.node:{p2.node}\n'
o 7 p1:-1:000000000000 p2:-1:000000000000 p1.rev:-1 p2.node:0000000000000000000000000000000000000000
o 6 p1:5:13207e5a10d9 p2:4:bbe44766e73d p1.rev:5 p2.node:bbe44766e73d5f11ed2177f1838de10c53ef3e74
|\
| o 5 p1:3:10e46f2dcbf4 p2:-1:000000000000 p1.rev:3 p2.node:0000000000000000000000000000000000000000
| |
| ~
o 4 p1:3:10e46f2dcbf4 p2:-1:000000000000 p1.rev:3 p2.node:0000000000000000000000000000000000000000
|
~
TODO: no idea what should be displayed as a JSON representation
$ hg log -r6 -T 'p1:{p1|json}\np2:{p2|json}\n'
p1:{}
p2:{}
Yuya Nishihara
tests: extract test-template-keywords.t from test-command-template.t
r38455 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
Yuya Nishihara
test-template-keywords: add test for {latesttag} of wdir() revision...
r41335 Tags of working-directory parents (issue6055):
$ hg update -q 3
$ echo a > head3
$ hg ci -qAm h3a
$ hg merge -q 2
$ hg log -Gr'::wdir()' -T "{rev}: {latesttag % '{tag}+{distance},{changes} '}\n"
Yuya Nishihara
templatekw: fix crash on multiple latesttags resolution at wdir (issue6055)...
r41336 o 2147483647: at3+2,3 t3+2,3
|\
| @ 12: at3+1,1 t3+1,1
| |
| o 3: at3+0,0 t3+0,0
| |
@ | 2: t2+0,0
|/
o 1: t1+0,0
|
o 0: null+1,1
Yuya Nishihara
test-template-keywords: add test for {latesttag} of wdir() revision...
r41335
$ hg ci -m merge
$ hg log -Gr'::.' -T "{rev}: {latesttag % '{tag}+{distance},{changes} '}\n"
@ 13: at3+2,3 t3+2,3
|\
| o 12: at3+1,1 t3+1,1
| |
| o 3: at3+0,0 t3+0,0
| |
o | 2: t2+0,0
|/
o 1: t1+0,0
|
o 0: null+1,1
Yuya Nishihara
tests: extract test-template-keywords.t from test-command-template.t
r38455 $ 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 ..