##// END OF EJS Templates
py3: mark all string literals in test-command-template.t as bytes...
py3: mark all string literals in test-command-template.t as bytes # skip-blame because just b'' prefixes

File last commit:

r36522:b075f454 default
r36566:086fc71f default
Show More
test-command-template.t
4789 lines | 119.2 KiB | text/troff | Tads3Lexer
/ tests / test-command-template.t
Adrian Buehlmann
tests: unify test-command-template
r12283 $ 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'
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 Test arithmetic operators have the right precedence:
FUJIWARA Katsunori
tests: use basic format code "%Y" instead of "%s" for test portability...
r30237 $ hg log -l 1 -T '{date(date, "%Y") + 5 * 10} {date(date, "%Y") - 2 * 3}\n'
2020 1964
$ hg log -l 1 -T '{date(date, "%Y") * 5 + 10} {date(date, "%Y") * 3 - 2}\n'
9860 5908
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115
Test division:
$ hg debugtemplate -r0 -v '{5 / 2} {mod(5, 2)}\n'
(template
(/
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (integer '5')
(integer '2'))
(string ' ')
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 (func
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (symbol 'mod')
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 (list
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (integer '5')
(integer '2')))
(string '\n'))
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 2 1
$ hg debugtemplate -r0 -v '{5 / -2} {mod(5, -2)}\n'
(template
(/
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (integer '5')
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 (negate
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (integer '2')))
(string ' ')
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 (func
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (symbol 'mod')
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 (list
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (integer '5')
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 (negate
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (integer '2'))))
(string '\n'))
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 -3 -1
$ hg debugtemplate -r0 -v '{-5 / 2} {mod(-5, 2)}\n'
(template
(/
(negate
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (integer '5'))
(integer '2'))
(string ' ')
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 (func
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (symbol 'mod')
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 (list
(negate
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (integer '5'))
(integer '2')))
(string '\n'))
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 -3 1
$ hg debugtemplate -r0 -v '{-5 / -2} {mod(-5, -2)}\n'
(template
(/
(negate
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (integer '5'))
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 (negate
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (integer '2')))
(string ' ')
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 (func
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (symbol 'mod')
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 (list
(negate
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (integer '5'))
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 (negate
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (integer '2'))))
(string '\n'))
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 2 -1
Filters bind closer than arithmetic:
$ hg debugtemplate -r0 -v '{revset(".")|count - 1}\n'
(template
(-
(|
(func
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (symbol 'revset')
(string '.'))
(symbol 'count'))
(integer '1'))
(string '\n'))
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 0
But negate binds closer still:
$ hg debugtemplate -r0 -v '{1-3|stringify}\n'
(template
(-
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (integer '1')
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 (|
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (integer '3')
(symbol 'stringify')))
(string '\n'))
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 hg: parse error: arithmetic only defined on integers
[255]
$ hg debugtemplate -r0 -v '{-3|stringify}\n'
(template
(|
(negate
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (integer '3'))
(symbol 'stringify'))
(string '\n'))
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 -3
Yuya Nishihara
templater: adjust binding strength of '%' and '|' operators (BC)...
r34330 Filters bind as close as map operator:
$ hg debugtemplate -r0 -v '{desc|splitlines % "{line}\n"}'
(template
(%
(|
(symbol 'desc')
(symbol 'splitlines'))
(template
(symbol 'line')
(string '\n'))))
line 1
line 2
Yuya Nishihara
templater: add parsing rule for key-value pair...
r31885 Keyword arguments:
$ hg debugtemplate -r0 -v '{foo=bar|baz}'
(template
(keyvalue
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (symbol 'foo')
Yuya Nishihara
templater: add parsing rule for key-value pair...
r31885 (|
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (symbol 'bar')
(symbol 'baz'))))
Yuya Nishihara
templater: add parsing rule for key-value pair...
r31885 hg: parse error: can't use a key-value pair in this context
[255]
Yuya Nishihara
templater: port pad() to take keyword arguments...
r31887 $ hg debugtemplate '{pad("foo", width=10, left=true)}\n'
foo
Yuya Nishihara
templater: add support for keyword arguments...
r31886 Call function which takes named arguments by filter syntax:
$ hg debugtemplate '{" "|separate}'
$ hg debugtemplate '{("not", "an", "argument", "list")|separate}'
hg: parse error: unknown method 'list'
[255]
Adrian Buehlmann
tests: unify test-command-template
r12283 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"
Matt Mackall
templatekw: add default styles for hybrid types (issue3887)...
r18970 $ hg log --template '{join(file_copies, ",\n")}\n' -r .
fourth (second)
Matt Mackall
commands: add -T alternative to --template
r20665 $ hg log -T '{file_copies % "{source} -> {name}\n"}' -r .
Matt Mackall
templater: properly handle file_copies with %
r18715 second -> fourth
Yuya Nishihara
templater: implement _hybrid.__contains__ so that ifcontains can accept dict...
r24240 $ hg log -T '{rev} {ifcontains("fourth", file_copies, "t", "f")}\n' -r .:7
8 t
7 f
Matt Mackall
templater: properly handle file_copies with %
r18715
Yuya Nishihara
templatekw: make {rev} return wdirrev instead of None...
r25740 Working-directory revision has special identifiers, though they are still
experimental:
$ hg log -r 'wdir()' -T '{rev}:{node}\n'
2147483647:ffffffffffffffffffffffffffffffffffffffff
Yuya Nishihara
templatekw: apply manifest template only if ctx.manifestnode() exists...
r25736 Some keywords are invalid for working-directory revision, but they should
never cause crash:
$ hg log -r 'wdir()' -T '{manifest}\n'
Yuya Nishihara
templater: move repo, ui and cache to per-engine resources
r35485 Internal resources shouldn't be exposed (issue5699):
Yuya Nishihara
templater: look up symbols/resources as if they were separated (issue5699)...
r35486 $ hg log -r. -T '{cache}{ctx}{repo}{revcache}{templ}{ui}'
Never crash on internal resource not available:
$ hg --cwd .. debugtemplate '{"c0bebeef"|shortest}\n'
abort: template resource not available: ctx
[255]
Yuya Nishihara
templater: move repo, ui and cache to per-engine resources
r35485
Yuya Nishihara
templatekw: add 'requires' flag to switch to exception-safe interface...
r36463 $ hg config -T '{author}'
Martin Geisler
templater: handle SyntaxError when parsing ui.logtemplate...
r16678 Quoting for ui.logtemplate
$ hg tip --config "ui.logtemplate={rev}\n"
8
$ hg tip --config "ui.logtemplate='{rev}\n'"
8
$ hg tip --config 'ui.logtemplate="{rev}\n"'
8
Yuya Nishihara
templater: do not strip non-quote characters from template config...
r28687 $ hg tip --config 'ui.logtemplate=n{rev}\n'
n8
Martin Geisler
templater: handle SyntaxError when parsing ui.logtemplate...
r16678
Adrian Buehlmann
tests: unify test-command-template
r12283 Make sure user/global hgrc does not affect tests
$ echo '[ui]' > .hg/hgrc
$ echo 'logtemplate =' >> .hg/hgrc
$ echo 'style =' >> .hg/hgrc
Matt Mackall
templating: make -T much more flexible...
r20668 Add some simple styles to settings
Yuya Nishihara
formatter: load templates section like a map file...
r32875 $ cat <<'EOF' >> .hg/hgrc
> [templates]
> simple = "{rev}\n"
> simple2 = {rev}\n
> rev = "should not precede {rev} keyword\n"
> EOF
Matt Mackall
templating: make -T much more flexible...
r20668
$ hg log -l1 -Tsimple
8
$ hg log -l1 -Tsimple2
8
Yuya Nishihara
formatter: load templates section like a map file...
r32875 $ hg log -l1 -Trev
should not precede 8 keyword
$ hg log -l1 -T '{simple}'
8
Map file shouldn't see user templates:
$ cat <<EOF > tmpl
> changeset = 'nothing expanded:{simple}\n'
> EOF
$ hg log -l1 --style ./tmpl
nothing expanded:
Matt Mackall
templating: make -T much more flexible...
r20668
Test templates and style maps in files:
$ echo "{rev}" > tmpl
$ hg log -l1 -T./tmpl
8
$ hg log -l1 -Tblah/blah
blah/blah (no-eol)
$ printf 'changeset = "{rev}\\n"\n' > map-simple
$ hg log -l1 -T./map-simple
8
Yuya Nishihara
templater: load aliases from [templatealias] section in map file...
r34716 a map file may have [templates] and [templatealias] sections:
Yuya Nishihara
templater: load template fragments from [templates] section in map file...
r34715
$ cat <<'EOF' > map-simple
> [templates]
Yuya Nishihara
templater: load aliases from [templatealias] section in map file...
r34716 > changeset = "{a}\n"
> [templatealias]
> a = rev
Yuya Nishihara
templater: load template fragments from [templates] section in map file...
r34715 > EOF
$ hg log -l1 -T./map-simple
8
so it can be included in hgrc
$ cat <<'EOF' > myhgrc
> %include map-simple
> [templates]
> foo = "{changeset}"
> EOF
$ HGRCPATH=./myhgrc hg log -l1 -Tfoo
8
Yuya Nishihara
templater: load aliases from [templatealias] section in map file...
r34716 $ HGRCPATH=./myhgrc hg log -l1 -T'{a}\n'
8
Yuya Nishihara
templater: load template fragments from [templates] section in map file...
r34715
Matt Mackall
templater: add template path to __base__ search...
r29848 Test template map inheritance
$ echo "__base__ = map-cmdline.default" > map-simple
$ printf 'cset = "changeset: ***{rev}***\\n"\n' >> map-simple
$ hg log -l1 -T./map-simple
changeset: ***8***
tag: tip
user: test
date: Wed Jan 01 10:01:00 2020 +0000
summary: third
Yuya Nishihara
changeset_templater: backport separator template from formatter...
r32951 Test docheader, docfooter and separator in template map
$ cat <<'EOF' > map-myjson
> docheader = '\{\n'
> docfooter = '\n}\n'
> separator = ',\n'
> changeset = ' {dict(rev, node|short)|json}'
> EOF
$ hg log -l2 -T./map-myjson
{
{"node": "95c24699272e", "rev": 8},
{"node": "29114dbae42b", "rev": 7}
}
Yuya Nishihara
changeset_templater: backport parts map of [templates] section from formatter
r32953 Test docheader, docfooter and separator in [templates] section
$ cat <<'EOF' >> .hg/hgrc
> [templates]
> myjson = ' {dict(rev, node|short)|json}'
> myjson:docheader = '\{\n'
> myjson:docfooter = '\n}\n'
> myjson:separator = ',\n'
> :docheader = 'should not be selected as a docheader for literal templates\n'
> EOF
$ hg log -l2 -Tmyjson
{
{"node": "95c24699272e", "rev": 8},
{"node": "29114dbae42b", "rev": 7}
}
$ hg log -l1 -T'{rev}\n'
8
Yuya Nishihara
templater: fix precedence of --style and --template options...
r22582 Template should precede style option
$ hg log -l1 --style default -T '{rev}\n'
8
Jordi Gutiérrez Hermoso
test-command-template: add a short description of a temporary snippet...
r24852 Add a commit with empty description, to ensure that the templates
Jordi Gutiérrez Hermoso
test-command-template: minor clarification in comment
r24930 below will omit the description line.
Adrian Buehlmann
tests: unify test-command-template
r12283
Yuya Nishihara
templates-default: do not show description or summary if empty...
r24637 $ echo c >> c
$ hg add c
$ hg commit -qm ' '
Jordi Gutiérrez Hermoso
template-phases: do not show description or summary if empty...
r24853 Default style is like normal output. Phases style should be the same
as default style, except for extra phase lines.
Jordi Gutiérrez Hermoso
test-command-template: add a short description of a temporary snippet...
r24852
Adrian Buehlmann
tests: unify test-command-template
r12283 $ hg log > log.out
$ hg log --style default > style.out
$ cmp log.out style.out || diff -u log.out style.out
Jordi Gutiérrez Hermoso
template-phases: do not show description or summary if empty...
r24853 $ hg log -T phases > phases.out
Danek Duvall
tests: work around differing hunk headers between GNU and Solaris diff...
r25862 $ diff -U 0 log.out phases.out | egrep -v '^---|^\+\+\+|^@@'
Jordi Gutiérrez Hermoso
template-phases: do not show description or summary if empty...
r24853 +phase: draft
+phase: draft
+phase: draft
+phase: draft
+phase: draft
+phase: draft
+phase: draft
+phase: draft
+phase: draft
+phase: draft
Adrian Buehlmann
tests: unify test-command-template
r12283
$ hg log -v > log.out
$ hg log -v --style default > style.out
$ cmp log.out style.out || diff -u log.out style.out
Jordi Gutiérrez Hermoso
template-phases: do not show description or summary if empty...
r24853 $ hg log -v -T phases > phases.out
Danek Duvall
tests: work around differing hunk headers between GNU and Solaris diff...
r25862 $ diff -U 0 log.out phases.out | egrep -v '^---|^\+\+\+|^@@'
Jordi Gutiérrez Hermoso
template-phases: do not show description or summary if empty...
r24853 +phase: draft
+phase: draft
+phase: draft
+phase: draft
+phase: draft
+phase: draft
+phase: draft
+phase: draft
+phase: draft
+phase: draft
Adrian Buehlmann
tests: unify test-command-template
r12283
Yuya Nishihara
templates: fix "log -q" output of default style...
r24304 $ hg log -q > log.out
$ hg log -q --style default > style.out
$ cmp log.out style.out || diff -u log.out style.out
Jordi Gutiérrez Hermoso
template-phases: do not show description or summary if empty...
r24853 $ hg log -q -T phases > phases.out
$ cmp log.out phases.out || diff -u log.out phases.out
Yuya Nishihara
templates: fix "log -q" output of default style...
r24304
Adrian Buehlmann
tests: unify test-command-template
r12283 $ hg log --debug > log.out
$ hg log --debug --style default > style.out
$ cmp log.out style.out || diff -u log.out style.out
Jordi Gutiérrez Hermoso
template-phases: do not show description or summary if empty...
r24853 $ hg log --debug -T phases > phases.out
$ cmp log.out phases.out || diff -u log.out phases.out
Adrian Buehlmann
tests: unify test-command-template
r12283
Yuya Nishihara
changeset_printer: display wdirrev/wdirnode values for workingctx...
r25762 Default style of working-directory revision should also be the same (but
date may change while running tests):
$ hg log -r 'wdir()' | sed 's|^date:.*|date:|' > log.out
$ hg log -r 'wdir()' --style default | sed 's|^date:.*|date:|' > style.out
$ cmp log.out style.out || diff -u log.out style.out
$ hg log -r 'wdir()' -v | sed 's|^date:.*|date:|' > log.out
$ hg log -r 'wdir()' -v --style default | sed 's|^date:.*|date:|' > style.out
$ cmp log.out style.out || diff -u log.out style.out
$ hg log -r 'wdir()' -q > log.out
$ hg log -r 'wdir()' -q --style default > style.out
$ cmp log.out style.out || diff -u log.out style.out
$ hg log -r 'wdir()' --debug | sed 's|^date:.*|date:|' > log.out
$ hg log -r 'wdir()' --debug --style default \
> | sed 's|^date:.*|date:|' > style.out
$ cmp log.out style.out || diff -u log.out style.out
Jordi Gutiérrez Hermoso
log: rewrite default template to use labels (issue2866)...
r22766 Default style should also preserve color information (issue2866):
$ cp $HGRCPATH $HGRCPATH-bak
$ cat <<EOF >> $HGRCPATH
> [extensions]
> color=
> EOF
$ hg --color=debug log > log.out
$ hg --color=debug log --style default > style.out
$ cmp log.out style.out || diff -u log.out style.out
Jordi Gutiérrez Hermoso
template-phases: do not show description or summary if empty...
r24853 $ hg --color=debug log -T phases > phases.out
Danek Duvall
tests: work around differing hunk headers between GNU and Solaris diff...
r25862 $ diff -U 0 log.out phases.out | egrep -v '^---|^\+\+\+|^@@'
Jordi Gutiérrez Hermoso
template-phases: do not show description or summary if empty...
r24853 +[log.phase|phase: draft]
+[log.phase|phase: draft]
+[log.phase|phase: draft]
+[log.phase|phase: draft]
+[log.phase|phase: draft]
+[log.phase|phase: draft]
+[log.phase|phase: draft]
+[log.phase|phase: draft]
+[log.phase|phase: draft]
+[log.phase|phase: draft]
Jordi Gutiérrez Hermoso
log: rewrite default template to use labels (issue2866)...
r22766 $ hg --color=debug -v log > log.out
$ hg --color=debug -v log --style default > style.out
$ cmp log.out style.out || diff -u log.out style.out
Jordi Gutiérrez Hermoso
template-phases: do not show description or summary if empty...
r24853 $ hg --color=debug -v log -T phases > phases.out
Danek Duvall
tests: work around differing hunk headers between GNU and Solaris diff...
r25862 $ diff -U 0 log.out phases.out | egrep -v '^---|^\+\+\+|^@@'
Jordi Gutiérrez Hermoso
template-phases: do not show description or summary if empty...
r24853 +[log.phase|phase: draft]
+[log.phase|phase: draft]
+[log.phase|phase: draft]
+[log.phase|phase: draft]
+[log.phase|phase: draft]
+[log.phase|phase: draft]
+[log.phase|phase: draft]
+[log.phase|phase: draft]
+[log.phase|phase: draft]
+[log.phase|phase: draft]
Yuya Nishihara
templates: fix "log -q" output of default style...
r24304 $ hg --color=debug -q log > log.out
$ hg --color=debug -q log --style default > style.out
$ cmp log.out style.out || diff -u log.out style.out
Jordi Gutiérrez Hermoso
template-phases: do not show description or summary if empty...
r24853 $ hg --color=debug -q log -T phases > phases.out
$ cmp log.out phases.out || diff -u log.out phases.out
Jordi Gutiérrez Hermoso
log: rewrite default template to use labels (issue2866)...
r22766 $ hg --color=debug --debug log > log.out
$ hg --color=debug --debug log --style default > style.out
$ cmp log.out style.out || diff -u log.out style.out
Jordi Gutiérrez Hermoso
template-phases: do not show description or summary if empty...
r24853 $ hg --color=debug --debug log -T phases > phases.out
$ cmp log.out phases.out || diff -u log.out phases.out
Jordi Gutiérrez Hermoso
log: rewrite default template to use labels (issue2866)...
r22766
$ mv $HGRCPATH-bak $HGRCPATH
Jordi Gutiérrez Hermoso
test-command-template: add a short description of a temporary snippet...
r24852 Remove commit with empty commit message, so as to not pollute further
tests.
Yuya Nishihara
templates-default: do not show description or summary if empty...
r24637 $ hg --config extensions.strip= strip -q .
Adrian Buehlmann
tests: unify test-command-template
r12283 Revision with no copies (used to print a traceback):
$ hg tip -v --template '\n'
Compact style works:
Matt Mackall
templating: make -T much more flexible...
r20668 $ hg log -Tcompact
Adrian Buehlmann
tests: unify test-command-template
r12283 8[tip] 95c24699272e 2020-01-01 10:01 +0000 test
third
7:-1 29114dbae42b 1970-01-12 13:46 +0000 user
second
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 6:5,4 d41e714fe50d 1970-01-18 08:40 +0000 person
Adrian Buehlmann
tests: unify test-command-template
r12283 merge
5:3 13207e5a10d9 1970-01-18 08:40 +0000 person
new head
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 4 bbe44766e73d 1970-01-17 04:53 +0000 person
Adrian Buehlmann
tests: unify test-command-template
r12283 new branch
3 10e46f2dcbf4 1970-01-16 01:06 +0000 person
no user, no domain
2 97054abb4ab8 1970-01-14 21:20 +0000 other
no person
1 b608e9d1a3f0 1970-01-13 17:33 +0000 other
other 1
0 1e4e1b8f71e0 1970-01-12 13:46 +0000 user
line 1
$ hg log -v --style compact
8[tip] 95c24699272e 2020-01-01 10:01 +0000 test
third
7:-1 29114dbae42b 1970-01-12 13:46 +0000 User Name <user@hostname>
second
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 6:5,4 d41e714fe50d 1970-01-18 08:40 +0000 person
Adrian Buehlmann
tests: unify test-command-template
r12283 merge
5:3 13207e5a10d9 1970-01-18 08:40 +0000 person
new head
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 4 bbe44766e73d 1970-01-17 04:53 +0000 person
Adrian Buehlmann
tests: unify test-command-template
r12283 new branch
3 10e46f2dcbf4 1970-01-16 01:06 +0000 person
no user, no domain
2 97054abb4ab8 1970-01-14 21:20 +0000 other@place
no person
1 b608e9d1a3f0 1970-01-13 17:33 +0000 A. N. Other <other@place>
other 1
other 2
other 3
0 1e4e1b8f71e0 1970-01-12 13:46 +0000 User Name <user@hostname>
line 1
line 2
$ hg log --debug --style compact
8[tip]:7,-1 95c24699272e 2020-01-01 10:01 +0000 test
third
7:-1,-1 29114dbae42b 1970-01-12 13:46 +0000 User Name <user@hostname>
second
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 6:5,4 d41e714fe50d 1970-01-18 08:40 +0000 person
Adrian Buehlmann
tests: unify test-command-template
r12283 merge
5:3,-1 13207e5a10d9 1970-01-18 08:40 +0000 person
new head
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 4:3,-1 bbe44766e73d 1970-01-17 04:53 +0000 person
Adrian Buehlmann
tests: unify test-command-template
r12283 new branch
3:2,-1 10e46f2dcbf4 1970-01-16 01:06 +0000 person
no user, no domain
2:1,-1 97054abb4ab8 1970-01-14 21:20 +0000 other@place
no person
1:0,-1 b608e9d1a3f0 1970-01-13 17:33 +0000 A. N. Other <other@place>
other 1
other 2
other 3
0:-1,-1 1e4e1b8f71e0 1970-01-12 13:46 +0000 User Name <user@hostname>
line 1
line 2
Test xml styles:
Matt Mackall
templater: add new docheader/footer components for XML (issue4135)...
r26222 $ hg log --style xml -r 'not all()'
<?xml version="1.0"?>
<log>
</log>
Adrian Buehlmann
tests: unify test-command-template
r12283 $ hg log --style xml
<?xml version="1.0"?>
<log>
<logentry revision="8" node="95c24699272ef57d062b8bccc32c878bf841784a">
<tag>tip</tag>
<author email="test">test</author>
<date>2020-01-01T10:01:00+00:00</date>
<msg xml:space="preserve">third</msg>
</logentry>
<logentry revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453">
<parent revision="-1" node="0000000000000000000000000000000000000000" />
<author email="user@hostname">User Name</author>
<date>1970-01-12T13:46:40+00:00</date>
<msg xml:space="preserve">second</msg>
</logentry>
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 <logentry revision="6" node="d41e714fe50d9e4a5f11b4d595d543481b5f980b">
Adrian Buehlmann
tests: unify test-command-template
r12283 <parent revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f" />
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 <parent revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74" />
Adrian Buehlmann
tests: unify test-command-template
r12283 <author email="person">person</author>
<date>1970-01-18T08:40:01+00:00</date>
<msg xml:space="preserve">merge</msg>
</logentry>
<logentry revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f">
<parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
<author email="person">person</author>
<date>1970-01-18T08:40:00+00:00</date>
<msg xml:space="preserve">new head</msg>
</logentry>
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 <logentry revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74">
Adrian Buehlmann
tests: unify test-command-template
r12283 <branch>foo</branch>
<author email="person">person</author>
<date>1970-01-17T04:53:20+00:00</date>
<msg xml:space="preserve">new branch</msg>
</logentry>
<logentry revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47">
<author email="person">person</author>
<date>1970-01-16T01:06:40+00:00</date>
<msg xml:space="preserve">no user, no domain</msg>
</logentry>
<logentry revision="2" node="97054abb4ab824450e9164180baf491ae0078465">
<author email="other@place">other</author>
<date>1970-01-14T21:20:00+00:00</date>
<msg xml:space="preserve">no person</msg>
</logentry>
<logentry revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965">
<author email="other@place">A. N. Other</author>
<date>1970-01-13T17:33:20+00:00</date>
<msg xml:space="preserve">other 1
other 2
other 3</msg>
</logentry>
<logentry revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f">
<author email="user@hostname">User Name</author>
<date>1970-01-12T13:46:40+00:00</date>
<msg xml:space="preserve">line 1
line 2</msg>
</logentry>
</log>
$ hg log -v --style xml
<?xml version="1.0"?>
<log>
<logentry revision="8" node="95c24699272ef57d062b8bccc32c878bf841784a">
<tag>tip</tag>
<author email="test">test</author>
<date>2020-01-01T10:01:00+00:00</date>
<msg xml:space="preserve">third</msg>
<paths>
<path action="A">fourth</path>
<path action="A">third</path>
<path action="R">second</path>
</paths>
<copies>
<copy source="second">fourth</copy>
</copies>
</logentry>
<logentry revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453">
<parent revision="-1" node="0000000000000000000000000000000000000000" />
<author email="user@hostname">User Name</author>
<date>1970-01-12T13:46:40+00:00</date>
<msg xml:space="preserve">second</msg>
<paths>
<path action="A">second</path>
</paths>
</logentry>
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 <logentry revision="6" node="d41e714fe50d9e4a5f11b4d595d543481b5f980b">
Adrian Buehlmann
tests: unify test-command-template
r12283 <parent revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f" />
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 <parent revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74" />
Adrian Buehlmann
tests: unify test-command-template
r12283 <author email="person">person</author>
<date>1970-01-18T08:40:01+00:00</date>
<msg xml:space="preserve">merge</msg>
<paths>
</paths>
</logentry>
<logentry revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f">
<parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
<author email="person">person</author>
<date>1970-01-18T08:40:00+00:00</date>
<msg xml:space="preserve">new head</msg>
<paths>
<path action="A">d</path>
</paths>
</logentry>
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 <logentry revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74">
Adrian Buehlmann
tests: unify test-command-template
r12283 <branch>foo</branch>
<author email="person">person</author>
<date>1970-01-17T04:53:20+00:00</date>
<msg xml:space="preserve">new branch</msg>
<paths>
</paths>
</logentry>
<logentry revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47">
<author email="person">person</author>
<date>1970-01-16T01:06:40+00:00</date>
<msg xml:space="preserve">no user, no domain</msg>
<paths>
<path action="M">c</path>
</paths>
</logentry>
<logentry revision="2" node="97054abb4ab824450e9164180baf491ae0078465">
<author email="other@place">other</author>
<date>1970-01-14T21:20:00+00:00</date>
<msg xml:space="preserve">no person</msg>
<paths>
<path action="A">c</path>
</paths>
</logentry>
<logentry revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965">
<author email="other@place">A. N. Other</author>
<date>1970-01-13T17:33:20+00:00</date>
<msg xml:space="preserve">other 1
other 2
other 3</msg>
<paths>
<path action="A">b</path>
</paths>
</logentry>
<logentry revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f">
<author email="user@hostname">User Name</author>
<date>1970-01-12T13:46:40+00:00</date>
<msg xml:space="preserve">line 1
line 2</msg>
<paths>
<path action="A">a</path>
</paths>
</logentry>
</log>
$ hg log --debug --style xml
<?xml version="1.0"?>
<log>
<logentry revision="8" node="95c24699272ef57d062b8bccc32c878bf841784a">
<tag>tip</tag>
<parent revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453" />
<parent revision="-1" node="0000000000000000000000000000000000000000" />
<author email="test">test</author>
<date>2020-01-01T10:01:00+00:00</date>
<msg xml:space="preserve">third</msg>
<paths>
<path action="A">fourth</path>
<path action="A">third</path>
<path action="R">second</path>
</paths>
<copies>
<copy source="second">fourth</copy>
</copies>
<extra key="branch">default</extra>
</logentry>
<logentry revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453">
<parent revision="-1" node="0000000000000000000000000000000000000000" />
<parent revision="-1" node="0000000000000000000000000000000000000000" />
<author email="user@hostname">User Name</author>
<date>1970-01-12T13:46:40+00:00</date>
<msg xml:space="preserve">second</msg>
<paths>
<path action="A">second</path>
</paths>
<extra key="branch">default</extra>
</logentry>
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 <logentry revision="6" node="d41e714fe50d9e4a5f11b4d595d543481b5f980b">
Adrian Buehlmann
tests: unify test-command-template
r12283 <parent revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f" />
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 <parent revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74" />
Adrian Buehlmann
tests: unify test-command-template
r12283 <author email="person">person</author>
<date>1970-01-18T08:40:01+00:00</date>
<msg xml:space="preserve">merge</msg>
<paths>
</paths>
<extra key="branch">default</extra>
</logentry>
<logentry revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f">
<parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
<parent revision="-1" node="0000000000000000000000000000000000000000" />
<author email="person">person</author>
<date>1970-01-18T08:40:00+00:00</date>
<msg xml:space="preserve">new head</msg>
<paths>
<path action="A">d</path>
</paths>
<extra key="branch">default</extra>
</logentry>
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 <logentry revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74">
Adrian Buehlmann
tests: unify test-command-template
r12283 <branch>foo</branch>
<parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
<parent revision="-1" node="0000000000000000000000000000000000000000" />
<author email="person">person</author>
<date>1970-01-17T04:53:20+00:00</date>
<msg xml:space="preserve">new branch</msg>
<paths>
</paths>
<extra key="branch">foo</extra>
</logentry>
<logentry revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47">
<parent revision="2" node="97054abb4ab824450e9164180baf491ae0078465" />
<parent revision="-1" node="0000000000000000000000000000000000000000" />
<author email="person">person</author>
<date>1970-01-16T01:06:40+00:00</date>
<msg xml:space="preserve">no user, no domain</msg>
<paths>
<path action="M">c</path>
</paths>
<extra key="branch">default</extra>
</logentry>
<logentry revision="2" node="97054abb4ab824450e9164180baf491ae0078465">
<parent revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965" />
<parent revision="-1" node="0000000000000000000000000000000000000000" />
<author email="other@place">other</author>
<date>1970-01-14T21:20:00+00:00</date>
<msg xml:space="preserve">no person</msg>
<paths>
<path action="A">c</path>
</paths>
<extra key="branch">default</extra>
</logentry>
<logentry revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965">
<parent revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f" />
<parent revision="-1" node="0000000000000000000000000000000000000000" />
<author email="other@place">A. N. Other</author>
<date>1970-01-13T17:33:20+00:00</date>
<msg xml:space="preserve">other 1
other 2
other 3</msg>
<paths>
<path action="A">b</path>
</paths>
<extra key="branch">default</extra>
</logentry>
<logentry revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f">
<parent revision="-1" node="0000000000000000000000000000000000000000" />
<parent revision="-1" node="0000000000000000000000000000000000000000" />
<author email="user@hostname">User Name</author>
<date>1970-01-12T13:46:40+00:00</date>
<msg xml:space="preserve">line 1
line 2</msg>
<paths>
<path action="A">a</path>
</paths>
<extra key="branch">default</extra>
</logentry>
</log>
Matt Mackall
cmdutil: add json style to log-like commands...
r22427 Test JSON style:
$ hg log -k nosuch -Tjson
[]
$ hg log -qr . -Tjson
[
{
"rev": 8,
"node": "95c24699272ef57d062b8bccc32c878bf841784a"
}
]
$ hg log -vpr . -Tjson --stat
[
{
"rev": 8,
"node": "95c24699272ef57d062b8bccc32c878bf841784a",
"branch": "default",
"phase": "draft",
"user": "test",
"date": [1577872860, 0],
"desc": "third",
"bookmarks": [],
"tags": ["tip"],
"parents": ["29114dbae42b9f078cf2714dbe3a86bba8ec7453"],
"files": ["fourth", "second", "third"],
"diffstat": " fourth | 1 +\n second | 1 -\n third | 1 +\n 3 files changed, 2 insertions(+), 1 deletions(-)\n",
"diff": "diff -r 29114dbae42b -r 95c24699272e fourth\n--- /dev/null\tThu Jan 01 00:00:00 1970 +0000\n+++ b/fourth\tWed Jan 01 10:01:00 2020 +0000\n@@ -0,0 +1,1 @@\n+second\ndiff -r 29114dbae42b -r 95c24699272e second\n--- a/second\tMon Jan 12 13:46:40 1970 +0000\n+++ /dev/null\tThu Jan 01 00:00:00 1970 +0000\n@@ -1,1 +0,0 @@\n-second\ndiff -r 29114dbae42b -r 95c24699272e third\n--- /dev/null\tThu Jan 01 00:00:00 1970 +0000\n+++ b/third\tWed Jan 01 10:01:00 2020 +0000\n@@ -0,0 +1,1 @@\n+third\n"
}
]
Siddharth Agarwal
jsonchangeset: don't honor whitespace and format-changing diffopts...
r23453 honor --git but not format-breaking diffopts
$ hg --config diff.noprefix=True log --git -vpr . -Tjson
[
{
"rev": 8,
"node": "95c24699272ef57d062b8bccc32c878bf841784a",
"branch": "default",
"phase": "draft",
"user": "test",
"date": [1577872860, 0],
"desc": "third",
"bookmarks": [],
"tags": ["tip"],
"parents": ["29114dbae42b9f078cf2714dbe3a86bba8ec7453"],
"files": ["fourth", "second", "third"],
"diff": "diff --git a/second b/fourth\nrename from second\nrename to fourth\ndiff --git a/third b/third\nnew file mode 100644\n--- /dev/null\n+++ b/third\n@@ -0,0 +1,1 @@\n+third\n"
}
]
Matt Mackall
cmdutil: add json style to log-like commands...
r22427 $ hg log -T json
[
{
"rev": 8,
"node": "95c24699272ef57d062b8bccc32c878bf841784a",
"branch": "default",
"phase": "draft",
"user": "test",
"date": [1577872860, 0],
"desc": "third",
"bookmarks": [],
"tags": ["tip"],
"parents": ["29114dbae42b9f078cf2714dbe3a86bba8ec7453"]
},
{
"rev": 7,
"node": "29114dbae42b9f078cf2714dbe3a86bba8ec7453",
"branch": "default",
"phase": "draft",
"user": "User Name <user@hostname>",
"date": [1000000, 0],
"desc": "second",
"bookmarks": [],
"tags": [],
"parents": ["0000000000000000000000000000000000000000"]
},
{
"rev": 6,
"node": "d41e714fe50d9e4a5f11b4d595d543481b5f980b",
"branch": "default",
"phase": "draft",
"user": "person",
"date": [1500001, 0],
"desc": "merge",
"bookmarks": [],
"tags": [],
"parents": ["13207e5a10d9fd28ec424934298e176197f2c67f", "bbe44766e73d5f11ed2177f1838de10c53ef3e74"]
},
{
"rev": 5,
"node": "13207e5a10d9fd28ec424934298e176197f2c67f",
"branch": "default",
"phase": "draft",
"user": "person",
"date": [1500000, 0],
"desc": "new head",
"bookmarks": [],
"tags": [],
"parents": ["10e46f2dcbf4823578cf180f33ecf0b957964c47"]
},
{
"rev": 4,
"node": "bbe44766e73d5f11ed2177f1838de10c53ef3e74",
"branch": "foo",
"phase": "draft",
"user": "person",
"date": [1400000, 0],
"desc": "new branch",
"bookmarks": [],
"tags": [],
"parents": ["10e46f2dcbf4823578cf180f33ecf0b957964c47"]
},
{
"rev": 3,
"node": "10e46f2dcbf4823578cf180f33ecf0b957964c47",
"branch": "default",
"phase": "draft",
"user": "person",
"date": [1300000, 0],
"desc": "no user, no domain",
"bookmarks": [],
"tags": [],
"parents": ["97054abb4ab824450e9164180baf491ae0078465"]
},
{
"rev": 2,
"node": "97054abb4ab824450e9164180baf491ae0078465",
"branch": "default",
"phase": "draft",
"user": "other@place",
"date": [1200000, 0],
"desc": "no person",
"bookmarks": [],
"tags": [],
"parents": ["b608e9d1a3f0273ccf70fb85fd6866b3482bf965"]
},
{
"rev": 1,
"node": "b608e9d1a3f0273ccf70fb85fd6866b3482bf965",
"branch": "default",
"phase": "draft",
"user": "A. N. Other <other@place>",
"date": [1100000, 0],
"desc": "other 1\nother 2\n\nother 3",
"bookmarks": [],
"tags": [],
"parents": ["1e4e1b8f71e05681d422154f5421e385fec3454f"]
},
{
"rev": 0,
"node": "1e4e1b8f71e05681d422154f5421e385fec3454f",
"branch": "default",
"phase": "draft",
"user": "User Name <user@hostname>",
"date": [1000000, 0],
"desc": "line 1\nline 2",
"bookmarks": [],
"tags": [],
"parents": ["0000000000000000000000000000000000000000"]
}
]
$ hg heads -v -Tjson
[
{
"rev": 8,
"node": "95c24699272ef57d062b8bccc32c878bf841784a",
"branch": "default",
"phase": "draft",
"user": "test",
"date": [1577872860, 0],
"desc": "third",
"bookmarks": [],
"tags": ["tip"],
"parents": ["29114dbae42b9f078cf2714dbe3a86bba8ec7453"],
"files": ["fourth", "second", "third"]
},
{
"rev": 6,
"node": "d41e714fe50d9e4a5f11b4d595d543481b5f980b",
"branch": "default",
"phase": "draft",
"user": "person",
"date": [1500001, 0],
"desc": "merge",
"bookmarks": [],
"tags": [],
"parents": ["13207e5a10d9fd28ec424934298e176197f2c67f", "bbe44766e73d5f11ed2177f1838de10c53ef3e74"],
"files": []
},
{
"rev": 4,
"node": "bbe44766e73d5f11ed2177f1838de10c53ef3e74",
"branch": "foo",
"phase": "draft",
"user": "person",
"date": [1400000, 0],
"desc": "new branch",
"bookmarks": [],
"tags": [],
"parents": ["10e46f2dcbf4823578cf180f33ecf0b957964c47"],
"files": []
}
]
$ hg log --debug -Tjson
[
{
"rev": 8,
"node": "95c24699272ef57d062b8bccc32c878bf841784a",
"branch": "default",
"phase": "draft",
"user": "test",
"date": [1577872860, 0],
"desc": "third",
"bookmarks": [],
"tags": ["tip"],
"parents": ["29114dbae42b9f078cf2714dbe3a86bba8ec7453"],
"manifest": "94961b75a2da554b4df6fb599e5bfc7d48de0c64",
"extra": {"branch": "default"},
"modified": [],
Gregory Szorc
cmdutil.jsonchangeset: properly compute added and removed files...
r23734 "added": ["fourth", "third"],
"removed": ["second"]
Matt Mackall
cmdutil: add json style to log-like commands...
r22427 },
{
"rev": 7,
"node": "29114dbae42b9f078cf2714dbe3a86bba8ec7453",
"branch": "default",
"phase": "draft",
"user": "User Name <user@hostname>",
"date": [1000000, 0],
"desc": "second",
"bookmarks": [],
"tags": [],
"parents": ["0000000000000000000000000000000000000000"],
"manifest": "f2dbc354b94e5ec0b4f10680ee0cee816101d0bf",
"extra": {"branch": "default"},
"modified": [],
Gregory Szorc
cmdutil.jsonchangeset: properly compute added and removed files...
r23734 "added": ["second"],
"removed": []
Matt Mackall
cmdutil: add json style to log-like commands...
r22427 },
{
"rev": 6,
"node": "d41e714fe50d9e4a5f11b4d595d543481b5f980b",
"branch": "default",
"phase": "draft",
"user": "person",
"date": [1500001, 0],
"desc": "merge",
"bookmarks": [],
"tags": [],
"parents": ["13207e5a10d9fd28ec424934298e176197f2c67f", "bbe44766e73d5f11ed2177f1838de10c53ef3e74"],
"manifest": "4dc3def4f9b4c6e8de820f6ee74737f91e96a216",
"extra": {"branch": "default"},
"modified": [],
"added": [],
"removed": []
},
{
"rev": 5,
"node": "13207e5a10d9fd28ec424934298e176197f2c67f",
"branch": "default",
"phase": "draft",
"user": "person",
"date": [1500000, 0],
"desc": "new head",
"bookmarks": [],
"tags": [],
"parents": ["10e46f2dcbf4823578cf180f33ecf0b957964c47"],
"manifest": "4dc3def4f9b4c6e8de820f6ee74737f91e96a216",
"extra": {"branch": "default"},
"modified": [],
Gregory Szorc
cmdutil.jsonchangeset: properly compute added and removed files...
r23734 "added": ["d"],
"removed": []
Matt Mackall
cmdutil: add json style to log-like commands...
r22427 },
{
"rev": 4,
"node": "bbe44766e73d5f11ed2177f1838de10c53ef3e74",
"branch": "foo",
"phase": "draft",
"user": "person",
"date": [1400000, 0],
"desc": "new branch",
"bookmarks": [],
"tags": [],
"parents": ["10e46f2dcbf4823578cf180f33ecf0b957964c47"],
"manifest": "cb5a1327723bada42f117e4c55a303246eaf9ccc",
"extra": {"branch": "foo"},
"modified": [],
"added": [],
"removed": []
},
{
"rev": 3,
"node": "10e46f2dcbf4823578cf180f33ecf0b957964c47",
"branch": "default",
"phase": "draft",
"user": "person",
"date": [1300000, 0],
"desc": "no user, no domain",
"bookmarks": [],
"tags": [],
"parents": ["97054abb4ab824450e9164180baf491ae0078465"],
"manifest": "cb5a1327723bada42f117e4c55a303246eaf9ccc",
"extra": {"branch": "default"},
"modified": ["c"],
"added": [],
"removed": []
},
{
"rev": 2,
"node": "97054abb4ab824450e9164180baf491ae0078465",
"branch": "default",
"phase": "draft",
"user": "other@place",
"date": [1200000, 0],
"desc": "no person",
"bookmarks": [],
"tags": [],
"parents": ["b608e9d1a3f0273ccf70fb85fd6866b3482bf965"],
"manifest": "6e0e82995c35d0d57a52aca8da4e56139e06b4b1",
"extra": {"branch": "default"},
"modified": [],
Gregory Szorc
cmdutil.jsonchangeset: properly compute added and removed files...
r23734 "added": ["c"],
"removed": []
Matt Mackall
cmdutil: add json style to log-like commands...
r22427 },
{
"rev": 1,
"node": "b608e9d1a3f0273ccf70fb85fd6866b3482bf965",
"branch": "default",
"phase": "draft",
"user": "A. N. Other <other@place>",
"date": [1100000, 0],
"desc": "other 1\nother 2\n\nother 3",
"bookmarks": [],
"tags": [],
"parents": ["1e4e1b8f71e05681d422154f5421e385fec3454f"],
"manifest": "4e8d705b1e53e3f9375e0e60dc7b525d8211fe55",
"extra": {"branch": "default"},
"modified": [],
Gregory Szorc
cmdutil.jsonchangeset: properly compute added and removed files...
r23734 "added": ["b"],
"removed": []
Matt Mackall
cmdutil: add json style to log-like commands...
r22427 },
{
"rev": 0,
"node": "1e4e1b8f71e05681d422154f5421e385fec3454f",
"branch": "default",
"phase": "draft",
"user": "User Name <user@hostname>",
"date": [1000000, 0],
"desc": "line 1\nline 2",
"bookmarks": [],
"tags": [],
"parents": ["0000000000000000000000000000000000000000"],
"manifest": "a0c8bcbbb45c63b90b70ad007bf38961f64f2af0",
"extra": {"branch": "default"},
"modified": [],
Gregory Szorc
cmdutil.jsonchangeset: properly compute added and removed files...
r23734 "added": ["a"],
"removed": []
Matt Mackall
cmdutil: add json style to log-like commands...
r22427 }
]
Adrian Buehlmann
tests: unify test-command-template
r12283 Error if style not readable:
Matt Mackall
tests: skip tests that require not having root (issue4089)...
r20008 #if unix-permissions no-root
Adrian Buehlmann
tests: unify test-command-template
r12283 $ touch q
$ chmod 0 q
$ hg log --style ./q
abort: Permission denied: ./q
Matt Mackall
tests: add exit codes to unified tests
r12316 [255]
Adrian Buehlmann
test-command-template: enable for Windows
r16917 #endif
Adrian Buehlmann
tests: unify test-command-template
r12283
Error if no style:
$ hg log --style notexist
Augie Fackler
templater: fix output instability from gsoc patches
r19127 abort: style 'notexist' not found
Gregory Szorc
show: new extension for displaying various repository data...
r31765 (available styles: bisect, changelog, compact, default, phases, show, status, xml)
Matt Mackall
tests: add exit codes to unified tests
r12316 [255]
Adrian Buehlmann
tests: unify test-command-template
r12283
Matt Mackall
templates: re-add template listing support...
r21944 $ hg log -T list
Gregory Szorc
show: new extension for displaying various repository data...
r31765 available styles: bisect, changelog, compact, default, phases, show, status, xml
Matt Mackall
templates: re-add template listing support...
r21944 abort: specify a template
[255]
Adrian Buehlmann
tests: unify test-command-template
r12283 Error if style missing key:
$ echo 'q = q' > t
$ hg log --style ./t
Matt Mackall
templater: give slightly nicer error for unknown map entries
r13175 abort: "changeset" not in template map
Matt Mackall
tests: add exit codes to unified tests
r12316 [255]
Adrian Buehlmann
tests: unify test-command-template
r12283
Ross Lagerwall
templater: handle a missing value correctly...
r17334 Error if style missing value:
$ echo 'changeset =' > t
$ hg log --style t
Yuya Nishihara
templater: do not abuse SyntaxError to report errors in template map file...
r28628 hg: parse error at t:1: missing value
Ross Lagerwall
templater: handle a missing value correctly...
r17334 [255]
Adrian Buehlmann
tests: unify test-command-template
r12283 Error if include fails:
$ echo 'changeset = q' >> t
Matt Mackall
tests: skip tests that require not having root (issue4089)...
r20008 #if unix-permissions no-root
Adrian Buehlmann
tests: unify test-command-template
r12283 $ hg log --style ./t
abort: template file ./q: Permission denied
Matt Mackall
tests: add exit codes to unified tests
r12316 [255]
FUJIWARA Katsunori
tests: remove protected file forcibly for portability...
r27994 $ rm -f q
Adrian Buehlmann
test-command-template: enable for Windows
r16917 #endif
Adrian Buehlmann
tests: unify test-command-template
r12283
Include works:
$ echo '{rev}' > q
$ hg log --style ./t
8
7
6
5
4
3
2
1
0
Yuya Nishihara
templater: abort if infinite recursion detected while evaluation (issue4758)...
r27939 Check that recursive reference does not fall into RuntimeError (issue4758):
common mistake:
Yuya Nishihara
test-command-template: rewrite recursion tests by using a map file...
r32874 $ cat << EOF > issue4758
> changeset = '{changeset}\n'
> EOF
$ hg log --style ./issue4758
Yuya Nishihara
templater: abort if infinite recursion detected while evaluation (issue4758)...
r27939 abort: recursive reference 'changeset' in template
[255]
circular reference:
$ cat << EOF > issue4758
> changeset = '{foo}'
> foo = '{changeset}'
> EOF
$ hg log --style ./issue4758
abort: recursive reference 'foo' in template
[255]
Yuya Nishihara
templater: abort if infinite recursion detected while compiling...
r27940 buildmap() -> gettemplate(), where no thunk was made:
Yuya Nishihara
test-command-template: rewrite recursion tests by using a map file...
r32874 $ cat << EOF > issue4758
> changeset = '{files % changeset}\n'
> EOF
$ hg log --style ./issue4758
Yuya Nishihara
templater: abort if infinite recursion detected while compiling...
r27940 abort: recursive reference 'changeset' in template
[255]
Yuya Nishihara
templater: abort if infinite recursion detected while evaluation (issue4758)...
r27939 not a recursion if a keyword of the same name exists:
$ cat << EOF > issue4758
> changeset = '{tags % rev}'
> rev = '{rev} {tag}\n'
> EOF
$ hg log --style ./issue4758 -r tip
8 tip
Jordi Gutiérrez Hermoso
templater: set the correct phase for parents...
r22764 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)
Alexander Plavin
templater: support using templates with non-standard names from map file...
r19770 Missing non-standard names give no error (backward compatibility):
$ echo "changeset = '{c}'" > t
$ hg log --style ./t
Defining non-standard name works:
$ cat <<EOF > t
> changeset = '{c}'
> c = q
> EOF
$ hg log --style ./t
8
7
6
5
4
3
2
1
0
Adrian Buehlmann
tests: unify test-command-template
r12283 ui.style works:
$ echo '[ui]' > .hg/hgrc
$ echo 'style = t' >> .hg/hgrc
$ hg log
8
7
6
5
4
3
2
1
0
Issue338:
$ hg log --style=changelog > changelog
$ cat changelog
2020-01-01 test <test>
* fourth, second, third:
third
[95c24699272e] [tip]
1970-01-12 User Name <user@hostname>
* second:
second
[29114dbae42b]
1970-01-18 person <person>
* merge
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 [d41e714fe50d]
Adrian Buehlmann
tests: unify test-command-template
r12283
* d:
new head
[13207e5a10d9]
1970-01-17 person <person>
* new branch
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 [bbe44766e73d] <foo>
Adrian Buehlmann
tests: unify test-command-template
r12283
1970-01-16 person <person>
* c:
no user, no domain
[10e46f2dcbf4]
1970-01-14 other <other@place>
* c:
no person
[97054abb4ab8]
1970-01-13 A. N. Other <other@place>
* b:
other 1 other 2
other 3
[b608e9d1a3f0]
1970-01-12 User Name <user@hostname>
* a:
line 1 line 2
[1e4e1b8f71e0]
Martin Geisler
tests: added a short description to issue numbers...
r12399 Issue2130: xml output for 'hg heads' is malformed
Adrian Buehlmann
tests: unify test-command-template
r12283
$ hg heads --style changelog
2020-01-01 test <test>
* fourth, second, third:
third
[95c24699272e] [tip]
1970-01-18 person <person>
* merge
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 [d41e714fe50d]
Adrian Buehlmann
tests: unify test-command-template
r12283
1970-01-17 person <person>
* new branch
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 [bbe44766e73d] <foo>
Adrian Buehlmann
tests: unify test-command-template
r12283
Keys work:
Eric Eisner
template: add showbranch template for {branch}...
r13156 $ for key in author branch branches date desc file_adds file_dels file_mods \
Adrian Buehlmann
tests: unify test-command-template
r12283 > file_copies file_copies_switch files \
epriestley
templatekw: add p1rev, p1node, p2rev, p2node keywords...
r17357 > manifest node parents rev tags diffstat extras \
> p1rev p2rev p1node p2node; do
Adrian Buehlmann
tests: unify test-command-template
r12283 > 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>
Eric Eisner
template: add showbranch template for {branch}...
r13156 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
Adrian Buehlmann
tests: unify test-command-template
r12283 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
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 manifest: 6:94961b75a2da
manifest: 5:f2dbc354b94e
manifest: 4:4dc3def4f9b4
manifest: 4:4dc3def4f9b4
manifest: 3:cb5a1327723b
Adrian Buehlmann
tests: unify test-command-template
r12283 manifest: 3:cb5a1327723b
manifest: 2:6e0e82995c35
manifest: 1:4e8d705b1e53
manifest: 0:a0c8bcbbb45c
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 manifest--verbose: 6:94961b75a2da
manifest--verbose: 5:f2dbc354b94e
manifest--verbose: 4:4dc3def4f9b4
manifest--verbose: 4:4dc3def4f9b4
manifest--verbose: 3:cb5a1327723b
Adrian Buehlmann
tests: unify test-command-template
r12283 manifest--verbose: 3:cb5a1327723b
manifest--verbose: 2:6e0e82995c35
manifest--verbose: 1:4e8d705b1e53
manifest--verbose: 0:a0c8bcbbb45c
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 manifest--debug: 6:94961b75a2da554b4df6fb599e5bfc7d48de0c64
manifest--debug: 5:f2dbc354b94e5ec0b4f10680ee0cee816101d0bf
manifest--debug: 4:4dc3def4f9b4c6e8de820f6ee74737f91e96a216
manifest--debug: 4:4dc3def4f9b4c6e8de820f6ee74737f91e96a216
manifest--debug: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
Adrian Buehlmann
tests: unify test-command-template
r12283 manifest--debug: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
manifest--debug: 2:6e0e82995c35d0d57a52aca8da4e56139e06b4b1
manifest--debug: 1:4e8d705b1e53e3f9375e0e60dc7b525d8211fe55
manifest--debug: 0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0
node: 95c24699272ef57d062b8bccc32c878bf841784a
node: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 node: d41e714fe50d9e4a5f11b4d595d543481b5f980b
Adrian Buehlmann
tests: unify test-command-template
r12283 node: 13207e5a10d9fd28ec424934298e176197f2c67f
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 node: bbe44766e73d5f11ed2177f1838de10c53ef3e74
Adrian Buehlmann
tests: unify test-command-template
r12283 node: 10e46f2dcbf4823578cf180f33ecf0b957964c47
node: 97054abb4ab824450e9164180baf491ae0078465
node: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
node: 1e4e1b8f71e05681d422154f5421e385fec3454f
node--verbose: 95c24699272ef57d062b8bccc32c878bf841784a
node--verbose: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 node--verbose: d41e714fe50d9e4a5f11b4d595d543481b5f980b
Adrian Buehlmann
tests: unify test-command-template
r12283 node--verbose: 13207e5a10d9fd28ec424934298e176197f2c67f
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 node--verbose: bbe44766e73d5f11ed2177f1838de10c53ef3e74
Adrian Buehlmann
tests: unify test-command-template
r12283 node--verbose: 10e46f2dcbf4823578cf180f33ecf0b957964c47
node--verbose: 97054abb4ab824450e9164180baf491ae0078465
node--verbose: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
node--verbose: 1e4e1b8f71e05681d422154f5421e385fec3454f
node--debug: 95c24699272ef57d062b8bccc32c878bf841784a
node--debug: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 node--debug: d41e714fe50d9e4a5f11b4d595d543481b5f980b
Adrian Buehlmann
tests: unify test-command-template
r12283 node--debug: 13207e5a10d9fd28ec424934298e176197f2c67f
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 node--debug: bbe44766e73d5f11ed2177f1838de10c53ef3e74
Adrian Buehlmann
tests: unify test-command-template
r12283 node--debug: 10e46f2dcbf4823578cf180f33ecf0b957964c47
node--debug: 97054abb4ab824450e9164180baf491ae0078465
node--debug: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
node--debug: 1e4e1b8f71e05681d422154f5421e385fec3454f
parents:
parents: -1:000000000000
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 parents: 5:13207e5a10d9 4:bbe44766e73d
Adrian Buehlmann
tests: unify test-command-template
r12283 parents: 3:10e46f2dcbf4
parents:
parents:
parents:
parents:
parents:
parents--verbose:
parents--verbose: -1:000000000000
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 parents--verbose: 5:13207e5a10d9 4:bbe44766e73d
Adrian Buehlmann
tests: unify test-command-template
r12283 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
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 parents--debug: 5:13207e5a10d9fd28ec424934298e176197f2c67f 4:bbe44766e73d5f11ed2177f1838de10c53ef3e74
Adrian Buehlmann
tests: unify test-command-template
r12283 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
epriestley
templatekw: add p1rev, p1node, p2rev, p2node keywords...
r17357 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
Adrian Buehlmann
tests: unify test-command-template
r12283
Filters work:
$ hg log --template '{author|domain}\n'
hostname
place
place
hostname
$ hg log --template '{author|person}\n'
test
User Name
person
person
person
person
other
A. N. Other
User Name
$ hg log --template '{author|user}\n'
test
user
person
person
person
person
other
other
user
$ hg log --template '{date|date}\n'
Wed Jan 01 10:01:00 2020 +0000
Mon Jan 12 13:46:40 1970 +0000
Sun Jan 18 08:40:01 1970 +0000
Sun Jan 18 08:40:00 1970 +0000
Sat Jan 17 04:53:20 1970 +0000
Fri Jan 16 01:06:40 1970 +0000
Wed Jan 14 21:20:00 1970 +0000
Tue Jan 13 17:33:20 1970 +0000
Mon Jan 12 13:46:40 1970 +0000
$ hg log --template '{date|isodate}\n'
2020-01-01 10:01 +0000
1970-01-12 13:46 +0000
1970-01-18 08:40 +0000
1970-01-18 08:40 +0000
1970-01-17 04:53 +0000
1970-01-16 01:06 +0000
1970-01-14 21:20 +0000
1970-01-13 17:33 +0000
1970-01-12 13:46 +0000
$ hg log --template '{date|isodatesec}\n'
2020-01-01 10:01:00 +0000
1970-01-12 13:46:40 +0000
1970-01-18 08:40:01 +0000
1970-01-18 08:40:00 +0000
1970-01-17 04:53:20 +0000
1970-01-16 01:06:40 +0000
1970-01-14 21:20:00 +0000
1970-01-13 17:33:20 +0000
1970-01-12 13:46:40 +0000
$ hg log --template '{date|rfc822date}\n'
Wed, 01 Jan 2020 10:01:00 +0000
Mon, 12 Jan 1970 13:46:40 +0000
Sun, 18 Jan 1970 08:40:01 +0000
Sun, 18 Jan 1970 08:40:00 +0000
Sat, 17 Jan 1970 04:53:20 +0000
Fri, 16 Jan 1970 01:06:40 +0000
Wed, 14 Jan 1970 21:20:00 +0000
Tue, 13 Jan 1970 17:33:20 +0000
Mon, 12 Jan 1970 13:46:40 +0000
$ hg log --template '{desc|firstline}\n'
third
second
merge
new head
new branch
no user, no domain
no person
other 1
line 1
$ hg log --template '{node|short}\n'
95c24699272e
29114dbae42b
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 d41e714fe50d
Adrian Buehlmann
tests: unify test-command-template
r12283 13207e5a10d9
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 bbe44766e73d
Adrian Buehlmann
tests: unify test-command-template
r12283 10e46f2dcbf4
97054abb4ab8
b608e9d1a3f0
1e4e1b8f71e0
$ hg log --template '<changeset author="{author|xmlescape}"/>\n'
<changeset author="test"/>
<changeset author="User Name &lt;user@hostname&gt;"/>
<changeset author="person"/>
<changeset author="person"/>
<changeset author="person"/>
<changeset author="person"/>
<changeset author="other@place"/>
<changeset author="A. N. Other &lt;other@place&gt;"/>
<changeset author="User Name &lt;user@hostname&gt;"/>
$ hg log --template '{rev}: {children}\n'
8:
7: 8:95c24699272e
6:
Peter Arrenbrecht
localrepo: reuse parent manifest in commitctx if no files have changed...
r14162 5: 6:d41e714fe50d
4: 6:d41e714fe50d
3: 4:bbe44766e73d 5:13207e5a10d9
Adrian Buehlmann
tests: unify test-command-template
r12283 2: 3:10e46f2dcbf4
1: 2:97054abb4ab8
0: 1:b608e9d1a3f0
Formatnode filter works:
$ hg -q log -r 0 --template '{node|formatnode}\n'
1e4e1b8f71e0
$ hg log -r 0 --template '{node|formatnode}\n'
1e4e1b8f71e0
$ hg -v log -r 0 --template '{node|formatnode}\n'
1e4e1b8f71e0
$ hg --debug log -r 0 --template '{node|formatnode}\n'
1e4e1b8f71e05681d422154f5421e385fec3454f
Steven Brown
tests: make {date|age} template output independent of the current date
r15839 Age filter:
Matt Mackall
tests: fix hidden repeatability problem with age filter test...
r25005 $ hg init unstable-hash
$ cd unstable-hash
Steven Brown
tests: make {date|age} template output independent of the current date
r15839 $ hg log --template '{date|age}\n' > /dev/null || exit 1
Augie Fackler
tests: update test-command-template to pass our import checker
r33952 >>> from __future__ import absolute_import
>>> import datetime
Yuya Nishihara
py3: fix test-command-template.t to write files in binary mode
r36522 >>> fp = open('a', 'wb')
Augie Fackler
tests: update test-command-template to pass our import checker
r33952 >>> n = datetime.datetime.now() + datetime.timedelta(366 * 7)
Yuya Nishihara
py3: silence return value of file.write() in test-command-template.t
r36560 >>> fp.write(b'%d-%d-%d 00:00' % (n.year, n.month, n.day)) and None
Steven Brown
tests: make {date|age} template output independent of the current date
r15839 >>> fp.close()
$ hg add a
$ hg commit -m future -d "`cat a`"
Mads Kiilerich
check-code: fix check for trailing whitespace on sh command lines...
r17345 $ hg log -l1 --template '{date|age}\n'
Steven Brown
tests: make {date|age} template output independent of the current date
r15839 7 years from now
Matt Mackall
tests: fix hidden repeatability problem with age filter test...
r25005 $ cd ..
$ rm -rf unstable-hash
Yuya Nishihara
templatefilters: fix doc of basename()...
r35577 Filename filters:
$ hg debugtemplate '{"foo/bar"|basename}|{"foo/"|basename}|{"foo"|basename}|\n'
bar||foo|
Yuya Nishihara
templatefilters: add dirname() filter...
r36260 $ hg debugtemplate '{"foo/bar"|dirname}|{"foo/"|dirname}|{"foo"|dirname}|\n'
foo|foo||
$ hg debugtemplate '{"foo/bar"|stripdir}|{"foo/"|stripdir}|{"foo"|stripdir}|\n'
foo|foo|foo|
Yuya Nishihara
templatefilters: fix doc of basename()...
r35577
Matt Mackall
tests: fix hidden repeatability problem with age filter test...
r25005 Add a dummy commit to make up for the instability of the above:
$ echo a > a
$ hg add a
$ hg ci -m future
Anton Shestakov
templater: add count template filter, plus tests...
r22668 Count filter:
$ hg log -l1 --template '{node|count} {node|short|count}\n'
40 12
$ hg log -l1 --template '{revset("null^")|count} {revset(".")|count} {revset("0::3")|count}\n'
0 1 4
$ hg log -G --template '{rev}: children: {children|count}, \
> tags: {tags|count}, file_adds: {file_adds|count}, \
> ancestors: {revset("ancestors(%s)", rev)|count}'
@ 9: children: 0, tags: 1, file_adds: 1, ancestors: 3
|
o 8: children: 1, tags: 0, file_adds: 2, ancestors: 2
|
o 7: children: 1, tags: 0, file_adds: 1, ancestors: 1
o 6: children: 0, tags: 0, file_adds: 0, ancestors: 7
|\
| o 5: children: 1, tags: 0, file_adds: 1, ancestors: 5
| |
o | 4: children: 1, tags: 0, file_adds: 0, ancestors: 5
|/
o 3: children: 2, tags: 0, file_adds: 0, ancestors: 4
|
o 2: children: 1, tags: 0, file_adds: 1, ancestors: 3
|
o 1: children: 1, tags: 0, file_adds: 1, ancestors: 2
|
o 0: children: 1, tags: 0, file_adds: 1, ancestors: 1
Yuya Nishihara
templatefilters: add "upper" and "lower" for case conversion...
r24566 Upper/lower filters:
$ hg log -r0 --template '{branch|upper}\n'
DEFAULT
$ hg log -r0 --template '{author|lower}\n'
user name <user@hostname>
$ hg log -r0 --template '{date|upper}\n'
abort: template filter 'upper' is not compatible with keyword 'date'
[255]
Jordi Gutiérrez Hermoso
tests: add a new commit to test-commandline-template...
r24985 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"
Jordi Gutiérrez Hermoso
log: add a status template...
r25006 Check the status template
$ cat <<EOF >> $HGRCPATH
> [extensions]
> color=
> EOF
$ hg log -T status -r 10
changeset: 10:0f9759ec227a
tag: tip
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: Modify, add, remove, rename
files:
M third
A b
A fifth
R a
R fourth
$ hg log -T status -C -r 10
changeset: 10:0f9759ec227a
tag: tip
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: Modify, add, remove, rename
files:
M third
A b
A fifth
fourth
R a
R fourth
$ hg log -T status -C -r 10 -v
changeset: 10:0f9759ec227a
tag: tip
user: test
date: Thu Jan 01 00:00:00 1970 +0000
description:
Modify, add, remove, rename
files:
M third
A b
A fifth
fourth
R a
R fourth
$ hg log -T status -C -r 10 --debug
changeset: 10:0f9759ec227a4859c2014a345cd8a859022b7c6c
tag: tip
phase: secret
parent: 9:bf9dfba36635106d6a73ccc01e28b762da60e066
parent: -1:0000000000000000000000000000000000000000
manifest: 8:89dd546f2de0a9d6d664f58d86097eb97baba567
user: test
date: Thu Jan 01 00:00:00 1970 +0000
extra: branch=default
description:
Modify, add, remove, rename
files:
M third
A b
A fifth
fourth
R a
R fourth
$ hg log -T status -C -r 10 --quiet
10:0f9759ec227a
$ hg --color=debug log -T status -r 10
[log.changeset changeset.secret|changeset: 10:0f9759ec227a]
[log.tag|tag: tip]
[log.user|user: test]
[log.date|date: Thu Jan 01 00:00:00 1970 +0000]
[log.summary|summary: Modify, add, remove, rename]
[ui.note log.files|files:]
[status.modified|M third]
[status.added|A b]
[status.added|A fifth]
[status.removed|R a]
[status.removed|R fourth]
$ hg --color=debug log -T status -C -r 10
[log.changeset changeset.secret|changeset: 10:0f9759ec227a]
[log.tag|tag: tip]
[log.user|user: test]
[log.date|date: Thu Jan 01 00:00:00 1970 +0000]
[log.summary|summary: Modify, add, remove, rename]
[ui.note log.files|files:]
[status.modified|M third]
[status.added|A b]
[status.added|A fifth]
[status.copied| fourth]
[status.removed|R a]
[status.removed|R fourth]
$ hg --color=debug log -T status -C -r 10 -v
[log.changeset changeset.secret|changeset: 10:0f9759ec227a]
[log.tag|tag: tip]
[log.user|user: test]
[log.date|date: Thu Jan 01 00:00:00 1970 +0000]
[ui.note log.description|description:]
[ui.note log.description|Modify, add, remove, rename]
[ui.note log.files|files:]
[status.modified|M third]
[status.added|A b]
[status.added|A fifth]
[status.copied| fourth]
[status.removed|R a]
[status.removed|R fourth]
$ hg --color=debug log -T status -C -r 10 --debug
[log.changeset changeset.secret|changeset: 10:0f9759ec227a4859c2014a345cd8a859022b7c6c]
[log.tag|tag: tip]
[log.phase|phase: secret]
[log.parent changeset.secret|parent: 9:bf9dfba36635106d6a73ccc01e28b762da60e066]
[log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
[ui.debug log.manifest|manifest: 8:89dd546f2de0a9d6d664f58d86097eb97baba567]
[log.user|user: test]
[log.date|date: Thu Jan 01 00:00:00 1970 +0000]
[ui.debug log.extra|extra: branch=default]
[ui.note log.description|description:]
[ui.note log.description|Modify, add, remove, rename]
[ui.note log.files|files:]
[status.modified|M third]
[status.added|A b]
[status.added|A fifth]
[status.copied| fourth]
[status.removed|R a]
[status.removed|R fourth]
$ hg --color=debug log -T status -C -r 10 --quiet
[log.node|10:0f9759ec227a]
Jordi Gutiérrez Hermoso
map-cmdline.bisect: rewrite to just %include the default template...
r25007 Check the bisect template
$ hg bisect -g 1
$ hg bisect -b 3 --noupdate
Testing changeset 2:97054abb4ab8 (2 changesets remaining, ~1 tests)
$ hg log -T bisect -r 0:4
changeset: 0:1e4e1b8f71e0
bisect: good (implicit)
user: User Name <user@hostname>
date: Mon Jan 12 13:46:40 1970 +0000
summary: line 1
changeset: 1:b608e9d1a3f0
bisect: good
user: A. N. Other <other@place>
date: Tue Jan 13 17:33:20 1970 +0000
summary: other 1
changeset: 2:97054abb4ab8
bisect: untested
user: other@place
date: Wed Jan 14 21:20:00 1970 +0000
summary: no person
changeset: 3:10e46f2dcbf4
bisect: bad
user: person
date: Fri Jan 16 01:06:40 1970 +0000
summary: no user, no domain
changeset: 4:bbe44766e73d
bisect: bad (implicit)
branch: foo
user: person
date: Sat Jan 17 04:53:20 1970 +0000
summary: new branch
$ hg log --debug -T bisect -r 0:4
changeset: 0:1e4e1b8f71e05681d422154f5421e385fec3454f
bisect: good (implicit)
phase: public
parent: -1:0000000000000000000000000000000000000000
parent: -1:0000000000000000000000000000000000000000
manifest: 0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0
user: User Name <user@hostname>
date: Mon Jan 12 13:46:40 1970 +0000
files+: a
extra: branch=default
description:
line 1
line 2
changeset: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965
bisect: good
phase: public
parent: 0:1e4e1b8f71e05681d422154f5421e385fec3454f
parent: -1:0000000000000000000000000000000000000000
manifest: 1:4e8d705b1e53e3f9375e0e60dc7b525d8211fe55
user: A. N. Other <other@place>
date: Tue Jan 13 17:33:20 1970 +0000
files+: b
extra: branch=default
description:
other 1
other 2
other 3
changeset: 2:97054abb4ab824450e9164180baf491ae0078465
bisect: untested
phase: public
parent: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965
parent: -1:0000000000000000000000000000000000000000
manifest: 2:6e0e82995c35d0d57a52aca8da4e56139e06b4b1
user: other@place
date: Wed Jan 14 21:20:00 1970 +0000
files+: c
extra: branch=default
description:
no person
changeset: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47
bisect: bad
phase: public
parent: 2:97054abb4ab824450e9164180baf491ae0078465
parent: -1:0000000000000000000000000000000000000000
manifest: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
user: person
date: Fri Jan 16 01:06:40 1970 +0000
files: c
extra: branch=default
description:
no user, no domain
changeset: 4:bbe44766e73d5f11ed2177f1838de10c53ef3e74
bisect: bad (implicit)
branch: foo
phase: draft
parent: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47
parent: -1:0000000000000000000000000000000000000000
manifest: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
user: person
date: Sat Jan 17 04:53:20 1970 +0000
extra: branch=foo
description:
new branch
$ hg log -v -T bisect -r 0:4
changeset: 0:1e4e1b8f71e0
bisect: good (implicit)
user: User Name <user@hostname>
date: Mon Jan 12 13:46:40 1970 +0000
files: a
description:
line 1
line 2
changeset: 1:b608e9d1a3f0
bisect: good
user: A. N. Other <other@place>
date: Tue Jan 13 17:33:20 1970 +0000
files: b
description:
other 1
other 2
other 3
changeset: 2:97054abb4ab8
bisect: untested
user: other@place
date: Wed Jan 14 21:20:00 1970 +0000
files: c
description:
no person
changeset: 3:10e46f2dcbf4
bisect: bad
user: person
date: Fri Jan 16 01:06:40 1970 +0000
files: c
description:
no user, no domain
changeset: 4:bbe44766e73d
bisect: bad (implicit)
branch: foo
user: person
date: Sat Jan 17 04:53:20 1970 +0000
description:
new branch
$ hg --color=debug log -T bisect -r 0:4
[log.changeset changeset.public|changeset: 0:1e4e1b8f71e0]
[log.bisect bisect.good|bisect: good (implicit)]
[log.user|user: User Name <user@hostname>]
[log.date|date: Mon Jan 12 13:46:40 1970 +0000]
[log.summary|summary: line 1]
[log.changeset changeset.public|changeset: 1:b608e9d1a3f0]
[log.bisect bisect.good|bisect: good]
[log.user|user: A. N. Other <other@place>]
[log.date|date: Tue Jan 13 17:33:20 1970 +0000]
[log.summary|summary: other 1]
[log.changeset changeset.public|changeset: 2:97054abb4ab8]
[log.bisect bisect.untested|bisect: untested]
[log.user|user: other@place]
[log.date|date: Wed Jan 14 21:20:00 1970 +0000]
[log.summary|summary: no person]
[log.changeset changeset.public|changeset: 3:10e46f2dcbf4]
[log.bisect bisect.bad|bisect: bad]
[log.user|user: person]
[log.date|date: Fri Jan 16 01:06:40 1970 +0000]
[log.summary|summary: no user, no domain]
[log.changeset changeset.draft|changeset: 4:bbe44766e73d]
[log.bisect bisect.bad|bisect: bad (implicit)]
[log.branch|branch: foo]
[log.user|user: person]
[log.date|date: Sat Jan 17 04:53:20 1970 +0000]
[log.summary|summary: new branch]
$ hg --color=debug log --debug -T bisect -r 0:4
[log.changeset changeset.public|changeset: 0:1e4e1b8f71e05681d422154f5421e385fec3454f]
[log.bisect bisect.good|bisect: good (implicit)]
[log.phase|phase: public]
[log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
[log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
[ui.debug log.manifest|manifest: 0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0]
[log.user|user: User Name <user@hostname>]
[log.date|date: Mon Jan 12 13:46:40 1970 +0000]
[ui.debug log.files|files+: a]
[ui.debug log.extra|extra: branch=default]
[ui.note log.description|description:]
[ui.note log.description|line 1
line 2]
[log.changeset changeset.public|changeset: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965]
[log.bisect bisect.good|bisect: good]
[log.phase|phase: public]
[log.parent changeset.public|parent: 0:1e4e1b8f71e05681d422154f5421e385fec3454f]
[log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
[ui.debug log.manifest|manifest: 1:4e8d705b1e53e3f9375e0e60dc7b525d8211fe55]
[log.user|user: A. N. Other <other@place>]
[log.date|date: Tue Jan 13 17:33:20 1970 +0000]
[ui.debug log.files|files+: b]
[ui.debug log.extra|extra: branch=default]
[ui.note log.description|description:]
[ui.note log.description|other 1
other 2
other 3]
[log.changeset changeset.public|changeset: 2:97054abb4ab824450e9164180baf491ae0078465]
[log.bisect bisect.untested|bisect: untested]
[log.phase|phase: public]
[log.parent changeset.public|parent: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965]
[log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
[ui.debug log.manifest|manifest: 2:6e0e82995c35d0d57a52aca8da4e56139e06b4b1]
[log.user|user: other@place]
[log.date|date: Wed Jan 14 21:20:00 1970 +0000]
[ui.debug log.files|files+: c]
[ui.debug log.extra|extra: branch=default]
[ui.note log.description|description:]
[ui.note log.description|no person]
[log.changeset changeset.public|changeset: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47]
[log.bisect bisect.bad|bisect: bad]
[log.phase|phase: public]
[log.parent changeset.public|parent: 2:97054abb4ab824450e9164180baf491ae0078465]
[log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
[ui.debug log.manifest|manifest: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc]
[log.user|user: person]
[log.date|date: Fri Jan 16 01:06:40 1970 +0000]
[ui.debug log.files|files: c]
[ui.debug log.extra|extra: branch=default]
[ui.note log.description|description:]
[ui.note log.description|no user, no domain]
[log.changeset changeset.draft|changeset: 4:bbe44766e73d5f11ed2177f1838de10c53ef3e74]
[log.bisect bisect.bad|bisect: bad (implicit)]
[log.branch|branch: foo]
[log.phase|phase: draft]
[log.parent changeset.public|parent: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47]
[log.parent changeset.public|parent: -1:0000000000000000000000000000000000000000]
[ui.debug log.manifest|manifest: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc]
[log.user|user: person]
[log.date|date: Sat Jan 17 04:53:20 1970 +0000]
[ui.debug log.extra|extra: branch=foo]
[ui.note log.description|description:]
[ui.note log.description|new branch]
$ hg --color=debug log -v -T bisect -r 0:4
[log.changeset changeset.public|changeset: 0:1e4e1b8f71e0]
[log.bisect bisect.good|bisect: good (implicit)]
[log.user|user: User Name <user@hostname>]
[log.date|date: Mon Jan 12 13:46:40 1970 +0000]
[ui.note log.files|files: a]
[ui.note log.description|description:]
[ui.note log.description|line 1
line 2]
[log.changeset changeset.public|changeset: 1:b608e9d1a3f0]
[log.bisect bisect.good|bisect: good]
[log.user|user: A. N. Other <other@place>]
[log.date|date: Tue Jan 13 17:33:20 1970 +0000]
[ui.note log.files|files: b]
[ui.note log.description|description:]
[ui.note log.description|other 1
other 2
other 3]
[log.changeset changeset.public|changeset: 2:97054abb4ab8]
[log.bisect bisect.untested|bisect: untested]
[log.user|user: other@place]
[log.date|date: Wed Jan 14 21:20:00 1970 +0000]
[ui.note log.files|files: c]
[ui.note log.description|description:]
[ui.note log.description|no person]
[log.changeset changeset.public|changeset: 3:10e46f2dcbf4]
[log.bisect bisect.bad|bisect: bad]
[log.user|user: person]
[log.date|date: Fri Jan 16 01:06:40 1970 +0000]
[ui.note log.files|files: c]
[ui.note log.description|description:]
[ui.note log.description|no user, no domain]
[log.changeset changeset.draft|changeset: 4:bbe44766e73d]
[log.bisect bisect.bad|bisect: bad (implicit)]
[log.branch|branch: foo]
[log.user|user: person]
[log.date|date: Sat Jan 17 04:53:20 1970 +0000]
[ui.note log.description|description:]
[ui.note log.description|new branch]
$ hg bisect --reset
Jordi Gutiérrez Hermoso
log: add a status template...
r25006
Adrian Buehlmann
tests: unify test-command-template
r12283 Error on syntax:
$ echo 'x = "f' >> t
$ hg log
Yuya Nishihara
templater: do not abuse SyntaxError to report errors in template map file...
r28628 hg: parse error at t:3: unmatched quotes
Matt Mackall
tests: add exit codes to unified tests
r12316 [255]
Adrian Buehlmann
tests: unify test-command-template
r12283
Yuya Nishihara
templater: check existence of closing brace of template string
r25782 $ hg log -T '{date'
hg: parse error at 1: unterminated template expansion
[255]
Yuya Nishihara
templater: make sure expression is terminated by '}'...
r35698 $ hg log -T '{date(}'
hg: parse error at 7: not a prefix: end
[255]
$ hg log -T '{date)}'
hg: parse error at 5: invalid token
[255]
$ hg log -T '{date date}'
hg: parse error at 6: invalid token
[255]
Yuya Nishihara
templater: check existence of closing brace of template string
r25782
Yuya Nishihara
templater: fix crash by empty group expression...
r35762 $ hg log -T '{}'
hg: parse error at 2: not a prefix: end
[255]
$ hg debugtemplate -v '{()}'
(template
(group
None))
hg: parse error: missing argument
[255]
Yuya Nishihara
templater: check existence of closing brace of template string
r25782
Neil Kodner
templater: abort when a template filter raises an exception (issue2987)
r17383 Behind the scenes, this will throw TypeError
$ hg log -l 3 --template '{date|obfuscate}\n'
Matt Mackall
tests: fix template test output
r17387 abort: template filter 'obfuscate' is not compatible with keyword 'date'
Neil Kodner
templater: abort when a template filter raises an exception (issue2987)
r17383 [255]
Behind the scenes, this will throw a ValueError
$ hg log -l 3 --template 'line: {desc|shortdate}\n'
Matt Mackall
tests: fix template test output
r17387 abort: template filter 'shortdate' is not compatible with keyword 'desc'
Neil Kodner
templater: abort when a template filter raises an exception (issue2987)
r17383 [255]
Behind the scenes, this will throw AttributeError
$ hg log -l 3 --template 'line: {date|escape}\n'
Matt Mackall
tests: fix template test output
r17387 abort: template filter 'escape' is not compatible with keyword 'date'
Neil Kodner
templater: abort when a template filter raises an exception (issue2987)
r17383 [255]
Yuya Nishihara
templater: port localdate filter to a function...
r26127 $ hg log -l 3 --template 'line: {extras|localdate}\n'
hg: parse error: localdate expects a date information
[255]
Neil Kodner
templater: abort when a template filter raises an exception (issue2987)
r17383 Behind the scenes, this will throw ValueError
$ hg tip --template '{author|email|date}\n'
Yuya Nishihara
templatefilters: remove redundant 'date' and 'strip' filters...
r26106 hg: parse error: date expects a date information
Neil Kodner
templater: abort when a template filter raises an exception (issue2987)
r17383 [255]
Yuya Nishihara
templater: find keyword name more thoroughly on filtering error...
r31927 $ hg tip -T '{author|email|shortdate}\n'
abort: template filter 'shortdate' is not compatible with keyword 'author'
[255]
$ hg tip -T '{get(extras, "branch")|shortdate}\n'
abort: incompatible use of template filter 'shortdate'
[255]
Yuya Nishihara
templater: introduce one-pass parsing of nested template strings...
r25783 Error in nested template:
$ hg log -T '{"date'
hg: parse error at 2: unterminated string
[255]
Yuya Nishihara
templater: add parsing rule for key-value pair...
r31885 $ hg log -T '{"foo{date|?}"}'
Yuya Nishihara
templater: introduce one-pass parsing of nested template strings...
r25783 hg: parse error at 11: syntax error
[255]
Sean Farley
templater: raise error for unknown func...
r20857 Thrown an error if a template function doesn't exist
$ hg tip --template '{foo()}\n'
hg: parse error: unknown function 'foo'
[255]
Yuya Nishihara
templater: allow piping generator-type function output to filters...
r24280 Pass generator object created by template function to filter
$ hg log -l 1 --template '{if(author, author)|user}\n'
test
Yuya Nishihara
templater: provide loop counter as "index" keyword...
r31807 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
FUJIWARA Katsunori
templater: add "diff" template function...
r22434 Test diff function:
$ hg diff -c 8
diff -r 29114dbae42b -r 95c24699272e fourth
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/fourth Wed Jan 01 10:01:00 2020 +0000
@@ -0,0 +1,1 @@
+second
diff -r 29114dbae42b -r 95c24699272e second
--- a/second Mon Jan 12 13:46:40 1970 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-second
diff -r 29114dbae42b -r 95c24699272e third
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/third Wed Jan 01 10:01:00 2020 +0000
@@ -0,0 +1,1 @@
+third
$ hg log -r 8 -T "{diff()}"
diff -r 29114dbae42b -r 95c24699272e fourth
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/fourth Wed Jan 01 10:01:00 2020 +0000
@@ -0,0 +1,1 @@
+second
diff -r 29114dbae42b -r 95c24699272e second
--- a/second Mon Jan 12 13:46:40 1970 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-second
diff -r 29114dbae42b -r 95c24699272e third
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/third Wed Jan 01 10:01:00 2020 +0000
@@ -0,0 +1,1 @@
+third
$ hg log -r 8 -T "{diff('glob:f*')}"
diff -r 29114dbae42b -r 95c24699272e fourth
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/fourth Wed Jan 01 10:01:00 2020 +0000
@@ -0,0 +1,1 @@
+second
$ hg log -r 8 -T "{diff('', 'glob:f*')}"
diff -r 29114dbae42b -r 95c24699272e second
--- a/second Mon Jan 12 13:46:40 1970 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-second
diff -r 29114dbae42b -r 95c24699272e third
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/third Wed Jan 01 10:01:00 2020 +0000
@@ -0,0 +1,1 @@
+third
Yuya Nishihara
templater: evaluate arguments passed to diff() appropriately...
r25562 $ hg log -r 8 -T "{diff('FOURTH'|lower)}"
diff -r 29114dbae42b -r 95c24699272e fourth
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/fourth Wed Jan 01 10:01:00 2020 +0000
@@ -0,0 +1,1 @@
+second
Yuya Nishihara
templatekw: add verbosity keyword to select template by -q/-v/--debug flag...
r34994 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
Adrian Buehlmann
tests: unify test-command-template
r12283 $ 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
Matt Mackall
date: allow %z in format (issue4040)
r19989 $ hg ci -m merge -d '5 -3600'
Adrian Buehlmann
tests: unify test-command-template
r12283
No tag set:
Martin von Zweigbergk
tests: use graph log in {latesttag} tests...
r33865 $ 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
Adrian Buehlmann
tests: unify test-command-template
r12283
Martin von Zweigbergk
templatekw: choose {latesttag} by len(changes), not date (issue5659)...
r33866 One common tag: longest path wins for {latesttagdistance}:
Adrian Buehlmann
tests: unify test-command-template
r12283
$ hg tag -r 1 -m t1 -d '6 0' t1
Martin von Zweigbergk
tests: use graph log in {latesttag} tests...
r33865 $ 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
Adrian Buehlmann
tests: unify test-command-template
r12283
Martin von Zweigbergk
templatekw: choose {latesttag} by len(changes), not date (issue5659)...
r33866 One ancestor tag: closest wins:
Adrian Buehlmann
tests: unify test-command-template
r12283
$ hg tag -r 2 -m t2 -d '7 0' t2
Martin von Zweigbergk
tests: use graph log in {latesttag} tests...
r33865 $ 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
Adrian Buehlmann
tests: unify test-command-template
r12283
Martin von Zweigbergk
templatekw: choose {latesttag} by len(changes), not date (issue5659)...
r33866 Two branch tags: more recent wins if same number of changes:
Adrian Buehlmann
tests: unify test-command-template
r12283
$ hg tag -r 3 -m t3 -d '8 0' t3
Martin von Zweigbergk
tests: use graph log in {latesttag} tests...
r33865 $ 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
Adrian Buehlmann
tests: unify test-command-template
r12283
Martin von Zweigbergk
templatekw: choose {latesttag} by len(changes), not date (issue5659)...
r33866 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
Adrian Buehlmann
tests: unify test-command-template
r12283 Merged tag overrides:
$ hg tag -r 5 -m t5 -d '9 0' t5
$ hg tag -r 3 -m at3 -d '10 0' at3
Martin von Zweigbergk
tests: use graph log in {latesttag} tests...
r33865 $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n'
Martin von Zweigbergk
templatekw: choose {latesttag} by len(changes), not date (issue5659)...
r33866 @ 11: t5+6
|
o 10: t5+5
Martin von Zweigbergk
tests: use graph log in {latesttag} tests...
r33865 |
o 9: t5+4
|
o 8: t5+3
|
o 7: t5+2
|
o 6: t5+1
|
o 5: t5+0
|\
Martin von Zweigbergk
templatekw: choose {latesttag} by len(changes), not date (issue5659)...
r33866 | o 4: t4+0
Martin von Zweigbergk
tests: use graph log in {latesttag} tests...
r33865 | |
| 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"
Martin von Zweigbergk
templatekw: choose {latesttag} by len(changes), not date (issue5659)...
r33866 @ 11: t5+6,6
|
o 10: t5+5,5
Martin von Zweigbergk
tests: use graph log in {latesttag} tests...
r33865 |
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
|\
Martin von Zweigbergk
templatekw: choose {latesttag} by len(changes), not date (issue5659)...
r33866 | o 4: t4+0,0
Martin von Zweigbergk
tests: use graph log in {latesttag} tests...
r33865 | |
| o 3: at3+0,0 t3+0,0
| |
o | 2: t2+0,0
|/
o 1: t1+0,0
|
o 0: null+1,1
$ hg log -G --template "{rev}: {latesttag('re:^t[13]$') % '{tag}, C: {changes}, D: {distance}'}\n"
Martin von Zweigbergk
templatekw: choose {latesttag} by len(changes), not date (issue5659)...
r33866 @ 11: t3, C: 9, D: 8
|
o 10: t3, C: 8, D: 7
Martin von Zweigbergk
tests: use graph log in {latesttag} tests...
r33865 |
o 9: t3, C: 7, D: 6
|
o 8: t3, C: 6, D: 5
|
o 7: t3, C: 5, D: 4
|
o 6: t3, C: 4, D: 3
|
o 5: t3, C: 3, D: 2
|\
| o 4: t3, C: 1, D: 1
| |
| o 3: t3, C: 0, D: 0
| |
o | 2: t1, C: 1, D: 1
|/
o 1: t1, C: 0, D: 0
|
o 0: null, C: 1, D: 1
Matt Harbison
templater: introduce {latesttag()} function to match a pattern (issue4184)...
r26485
Adrian Buehlmann
tests: unify test-command-template
r12283 $ cd ..
Martin Geisler
tests: added a short description to issue numbers...
r12399 Style path expansion: issue1948 - ui.style option doesn't work on OSX
if it is a relative path
Adrian Buehlmann
tests: unify test-command-template
r12283
$ mkdir -p home/styles
$ cat > home/styles/teststyle <<EOF
> changeset = 'test {rev}:{node|short}\n'
> EOF
$ HOME=`pwd`/home; export HOME
$ cat > latesttag/.hg/hgrc <<EOF
> [ui]
> style = ~/styles/teststyle
> EOF
$ hg -R latesttag tip
Martin von Zweigbergk
templatekw: choose {latesttag} by len(changes), not date (issue5659)...
r33866 test 11:97e5943b523a
Adrian Buehlmann
tests: unify test-command-template
r12283
Test recursive showlist template (issue1989):
$ cat > style1989 <<EOF
> changeset = '{file_mods}{manifest}{extras}'
> file_mod = 'M|{author|person}\n'
> manifest = '{rev},{author}\n'
> extra = '{key}: {author}\n'
> EOF
$ hg -R latesttag log -r tip --style=style1989
M|test
Martin von Zweigbergk
templatekw: choose {latesttag} by len(changes), not date (issue5659)...
r33866 11,test
Adrian Buehlmann
tests: unify test-command-template
r12283 branch: test
Matt Mackall
templating: make new-style templating features work with command line lists
r17631 Test new-style inline templating:
$ hg log -R latesttag -r tip --template 'modified files: {file_mods % " {file}\n"}\n'
modified files: .hgtags
Yuya Nishihara
templater: handle exception when applying map operator to non-iterable object...
r28349
$ hg log -R latesttag -r tip -T '{rev % "a"}\n'
hg: parse error: keyword 'rev' is not iterable
[255]
$ hg log -R latesttag -r tip -T '{get(extras, "unknown") % "a"}\n'
hg: parse error: None is not iterable
[255]
Yuya Nishihara
templatekw: add new-style template expansion to {manifest}...
r34331 Test new-style inline templating of non-list/dict type:
$ hg log -R latesttag -r tip -T '{manifest}\n'
11:2bc6e9006ce2
$ hg log -R latesttag -r tip -T 'string length: {manifest|count}\n'
string length: 15
$ hg log -R latesttag -r tip -T '{manifest % "{rev}:{node}"}\n'
11:2bc6e9006ce29882383a22d39fd1f4e66dd3e2fc
Yuya Nishihara
templater: wrap get/min/max result so map operation can apply to element...
r34535 $ hg log -R latesttag -r tip -T '{get(extras, "branch") % "{key}: {value}\n"}'
branch: default
$ hg log -R latesttag -r tip -T '{get(extras, "unknown") % "{key}\n"}'
hg: parse error: None is not iterable
[255]
$ hg log -R latesttag -r tip -T '{min(extras) % "{key}: {value}\n"}'
branch: default
$ hg log -R latesttag -l1 -T '{min(revset("0:9")) % "{rev}:{node|short}\n"}'
0:ce3cec86e6c2
$ hg log -R latesttag -l1 -T '{max(revset("0:9")) % "{rev}:{node|short}\n"}'
9:fbc7cd862e9c
Test manifest/get() can be join()-ed as before, though it's silly:
Yuya Nishihara
templatekw: add new-style template expansion to {manifest}...
r34331
$ hg log -R latesttag -r tip -T '{join(manifest, "")}\n'
11:2bc6e9006ce2
Yuya Nishihara
templater: wrap get/min/max result so map operation can apply to element...
r34535 $ hg log -R latesttag -r tip -T '{join(get(extras, "branch"), "")}\n'
default
Yuya Nishihara
templatekw: add new-style template expansion to {manifest}...
r34331
Yuya Nishihara
templater: store revisions as ints so min/max won't compare them as strings...
r34582 Test min/max of integers
$ hg log -R latesttag -l1 -T '{min(revset("9:10"))}\n'
9
$ hg log -R latesttag -l1 -T '{max(revset("9:10"))}\n'
10
Yuya Nishihara
templater: add dot operator to easily access a sub item...
r34536 Test dot operator precedence:
$ hg debugtemplate -R latesttag -r0 -v '{manifest.node|short}\n'
(template
(|
(.
(symbol 'manifest')
(symbol 'node'))
(symbol 'short'))
(string '\n'))
89f4071fec70
(the following examples are invalid, but seem natural in parsing POV)
$ hg debugtemplate -R latesttag -r0 -v '{foo|bar.baz}\n' 2> /dev/null
(template
(|
(symbol 'foo')
(.
(symbol 'bar')
(symbol 'baz')))
(string '\n'))
[255]
$ hg debugtemplate -R latesttag -r0 -v '{foo.bar()}\n' 2> /dev/null
(template
(.
(symbol 'foo')
(func
(symbol 'bar')
None))
(string '\n'))
[255]
Test evaluation of dot operator:
$ hg log -R latesttag -l1 -T '{min(revset("0:9")).node}\n'
ce3cec86e6c26bd9bdfc590a6b92abc9680f1796
Yuya Nishihara
templater: extend dot operator as a short for get(dict, key)
r34537 $ hg log -R latesttag -r0 -T '{extras.branch}\n'
default
Yuya Nishihara
templater: add dot operator to easily access a sub item...
r34536
$ hg log -R latesttag -l1 -T '{author.invalid}\n'
hg: parse error: keyword 'author' has no member
[255]
$ hg log -R latesttag -l1 -T '{min("abc").invalid}\n'
hg: parse error: 'a' has no member
[255]
Sean Farley
template: call runtemplate on the src argument to sub...
r19058 Test the sub function of templating for expansion:
$ hg log -R latesttag -r 10 --template '{sub("[0-9]", "x", "{rev}")}\n'
xx
Alexander Plavin
templater: add strip function with chars as an extra argument...
r19330
Yuya Nishihara
templater: catch regexp error at sub() function...
r26188 $ hg log -R latesttag -r 10 -T '{sub("[", "x", rev)}\n'
hg: parse error: sub got an invalid pattern: [
[255]
$ hg log -R latesttag -r 10 -T '{sub("[0-9]", r"\1", rev)}\n'
hg: parse error: sub got an invalid replacement: \1
[255]
Alexander Plavin
templater: add strip function with chars as an extra argument...
r19330 Test the strip function with chars specified:
$ hg log -R latesttag --template '{desc}\n'
at3
t5
Martin von Zweigbergk
templatekw: choose {latesttag} by len(changes), not date (issue5659)...
r33866 t4
Alexander Plavin
templater: add strip function with chars as an extra argument...
r19330 t3
t2
t1
merge
h2e
h2d
h1c
b
a
$ hg log -R latesttag --template '{strip(desc, "te")}\n'
at3
5
Martin von Zweigbergk
templatekw: choose {latesttag} by len(changes), not date (issue5659)...
r33866 4
Alexander Plavin
templater: add strip function with chars as an extra argument...
r19330 3
2
1
merg
h2
h2d
h1c
b
a
Matt Mackall
templater: fix escaping in nested string literals (issue4102)...
r20066
Matt Mackall
date: allow %z in format (issue4040)
r19989 Test date format:
$ hg log -R latesttag --template 'date: {date(date, "%y %m %d %S %z")}\n'
date: 70 01 01 10 +0000
date: 70 01 01 09 +0000
Martin von Zweigbergk
templatekw: choose {latesttag} by len(changes), not date (issue5659)...
r33866 date: 70 01 01 04 +0000
Matt Mackall
date: allow %z in format (issue4040)
r19989 date: 70 01 01 08 +0000
date: 70 01 01 07 +0000
date: 70 01 01 06 +0000
date: 70 01 01 05 +0100
date: 70 01 01 04 +0000
date: 70 01 01 03 +0000
date: 70 01 01 02 +0000
date: 70 01 01 01 +0000
date: 70 01 01 00 +0000
Matt Mackall
merge with stable
r20072
Yuya Nishihara
templater: fix crash by passing invalid object to date() function...
r24903 Test invalid date:
$ hg log -R latesttag -T '{date(rev)}\n'
hg: parse error: date expects a date information
[255]
Yuya Nishihara
templater: tokenize decimal integer literal (issue4638) (BC)...
r25002 Test integer literal:
Yuya Nishihara
templater: add debugtemplate command...
r28548 $ hg debugtemplate -v '{(0)}\n'
(template
(group
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (integer '0'))
(string '\n'))
Yuya Nishihara
templater: tokenize decimal integer literal (issue4638) (BC)...
r25002 0
Yuya Nishihara
templater: add debugtemplate command...
r28548 $ hg debugtemplate -v '{(123)}\n'
(template
(group
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (integer '123'))
(string '\n'))
Yuya Nishihara
templater: tokenize decimal integer literal (issue4638) (BC)...
r25002 123
Yuya Nishihara
templater: add debugtemplate command...
r28548 $ hg debugtemplate -v '{(-4)}\n'
(template
(group
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 (negate
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (integer '4')))
(string '\n'))
Yuya Nishihara
templater: tokenize decimal integer literal (issue4638) (BC)...
r25002 -4
Yuya Nishihara
templater: add debugtemplate command...
r28548 $ hg debugtemplate '{(-)}\n'
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 hg: parse error at 3: not a prefix: )
Yuya Nishihara
templater: tokenize decimal integer literal (issue4638) (BC)...
r25002 [255]
Yuya Nishihara
templater: add debugtemplate command...
r28548 $ hg debugtemplate '{(-a)}\n'
Simon Farnsworth
templater: provide arithmetic operations on integers...
r30115 hg: parse error: negation needs an integer argument
Yuya Nishihara
templater: tokenize decimal integer literal (issue4638) (BC)...
r25002 [255]
top-level integer literal is interpreted as symbol (i.e. variable name):
Yuya Nishihara
templater: add debugtemplate command...
r28548 $ hg debugtemplate -D 1=one -v '{1}\n'
(template
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (integer '1')
(string '\n'))
Yuya Nishihara
templater: add debugtemplate command...
r28548 one
$ hg debugtemplate -D 1=one -v '{if("t", "{1}")}\n'
(template
(func
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (symbol 'if')
Yuya Nishihara
templater: add debugtemplate command...
r28548 (list
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (string 't')
Yuya Nishihara
templater: add debugtemplate command...
r28548 (template
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (integer '1'))))
(string '\n'))
Yuya Nishihara
templater: add debugtemplate command...
r28548 one
$ hg debugtemplate -D 1=one -v '{1|stringify}\n'
(template
(|
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (integer '1')
(symbol 'stringify'))
(string '\n'))
Yuya Nishihara
templater: add debugtemplate command...
r28548 one
Yuya Nishihara
templater: tokenize decimal integer literal (issue4638) (BC)...
r25002
unless explicit symbol is expected:
$ hg log -Ra -r0 -T '{desc|1}\n'
hg: parse error: expected a symbol, got 'integer'
[255]
$ hg log -Ra -r0 -T '{1()}\n'
hg: parse error: expected a symbol, got 'integer'
[255]
Yuya Nishihara
templater: take any string literals as template, but not for rawstring (BC)...
r25596 Test string literal:
Yuya Nishihara
templater: add debugtemplate command...
r28548 $ hg debugtemplate -Ra -r0 -v '{"string with no template fragment"}\n'
(template
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (string 'string with no template fragment')
(string '\n'))
Yuya Nishihara
templater: take any string literals as template, but not for rawstring (BC)...
r25596 string with no template fragment
Yuya Nishihara
templater: add debugtemplate command...
r28548 $ hg debugtemplate -Ra -r0 -v '{"template: {rev}"}\n'
(template
(template
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (string 'template: ')
(symbol 'rev'))
(string '\n'))
Yuya Nishihara
templater: take any string literals as template, but not for rawstring (BC)...
r25596 template: 0
Yuya Nishihara
templater: add debugtemplate command...
r28548 $ hg debugtemplate -Ra -r0 -v '{r"rawstring: {rev}"}\n'
(template
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (string 'rawstring: {rev}')
(string '\n'))
Yuya Nishihara
templater: take any string literals as template, but not for rawstring (BC)...
r25596 rawstring: {rev}
Yuya Nishihara
templater: add debugtemplate command...
r28548 $ hg debugtemplate -Ra -r0 -v '{files % r"rawstring: {file}"}\n'
(template
(%
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (symbol 'files')
(string 'rawstring: {file}'))
(string '\n'))
Yuya Nishihara
templater: relax type of mapped template...
r28546 rawstring: {file}
Yuya Nishihara
templater: do not reevaluate rawstring as template (BC)...
r25597
Matt Mackall
templater: fix escaping in nested string literals (issue4102)...
r20066 Test string escaping:
$ hg log -R latesttag -r 0 --template '>\n<>\\n<{if(rev, "[>\n<>\\n<]")}>\n<>\\n<\n'
>
<>\n<[>
<>\n<]>
<>\n<
Matt Mackall
templater: only recursively evaluate string literals as templates (issue4103)
r20067
Yuya Nishihara
templater: do not process \-escapes at parsestring() (issue4290)...
r24948 $ hg log -R latesttag -r 0 \
> --config ui.logtemplate='>\n<>\\n<{if(rev, "[>\n<>\\n<]")}>\n<>\\n<\n'
>
<>\n<[>
<>\n<]>
<>\n<
$ hg log -R latesttag -r 0 -T esc \
> --config templates.esc='>\n<>\\n<{if(rev, "[>\n<>\\n<]")}>\n<>\\n<\n'
>
<>\n<[>
<>\n<]>
<>\n<
$ cat <<'EOF' > esctmpl
> changeset = '>\n<>\\n<{if(rev, "[>\n<>\\n<]")}>\n<>\\n<\n'
> EOF
$ hg log -R latesttag -r 0 --style ./esctmpl
>
<>\n<[>
<>\n<]>
<>\n<
Yuya Nishihara
templater: fix handling of \-escapes in raw string literals...
r25638 Test string escaping of quotes:
$ hg log -Ra -r0 -T '{"\""}\n'
"
$ hg log -Ra -r0 -T '{"\\\""}\n'
\"
$ hg log -Ra -r0 -T '{r"\""}\n'
\"
$ hg log -Ra -r0 -T '{r"\\\""}\n'
\\\"
Matt Mackall
merge with stable
r25695
$ hg log -Ra -r0 -T '{"\""}\n'
"
$ hg log -Ra -r0 -T '{"\\\""}\n'
\"
$ hg log -Ra -r0 -T '{r"\""}\n'
\"
$ hg log -Ra -r0 -T '{r"\\\""}\n'
\\\"
Yuya Nishihara
templater: strip single backslash before quotation mark in quoted template...
r24966 Test exception in quoted template. single backslash before quotation mark is
stripped before parsing:
$ cat <<'EOF' > escquotetmpl
> changeset = "\" \\" \\\" \\\\" {files % \"{file}\"}\n"
> EOF
$ cd latesttag
$ hg log -r 2 --style ../escquotetmpl
" \" \" \\" head1
$ hg log -r 2 -T esc --config templates.esc='"{\"valid\"}\n"'
valid
$ hg log -r 2 -T esc --config templates.esc="'"'{\'"'"'valid\'"'"'}\n'"'"
valid
Matt Mackall
merge with stable
r25695
Yuya Nishihara
templater: parse \"...\" as string for 2.9.2-3.4 compatibility (issue4733)...
r25676 Test compatibility with 2.9.2-3.4 of escaped quoted strings in nested
_evalifliteral() templates (issue4733):
$ hg log -r 2 -T '{if(rev, "\"{rev}")}\n'
"2
$ hg log -r 2 -T '{if(rev, "{if(rev, \"\\\"{rev}\")}")}\n'
"2
$ hg log -r 2 -T '{if(rev, "{if(rev, \"{if(rev, \\\"\\\\\\\"{rev}\\\")}\")}")}\n'
"2
$ hg log -r 2 -T '{if(rev, "\\\"")}\n'
\"
$ hg log -r 2 -T '{if(rev, "{if(rev, \"\\\\\\\"\")}")}\n'
\"
$ hg log -r 2 -T '{if(rev, "{if(rev, \"{if(rev, \\\"\\\\\\\\\\\\\\\"\\\")}\")}")}\n'
\"
$ hg log -r 2 -T '{if(rev, r"\\\"")}\n'
\\\"
$ hg log -r 2 -T '{if(rev, "{if(rev, r\"\\\\\\\"\")}")}\n'
\\\"
$ hg log -r 2 -T '{if(rev, "{if(rev, \"{if(rev, r\\\"\\\\\\\\\\\\\\\"\\\")}\")}")}\n'
\\\"
escaped single quotes and errors:
$ hg log -r 2 -T "{if(rev, '{if(rev, \'foo\')}')}"'\n'
foo
$ hg log -r 2 -T "{if(rev, '{if(rev, r\'foo\')}')}"'\n'
foo
$ hg log -r 2 -T '{if(rev, "{if(rev, \")}")}\n'
Yuya Nishihara
templater: introduce one-pass parsing of nested template strings...
r25783 hg: parse error at 21: unterminated string
Yuya Nishihara
templater: parse \"...\" as string for 2.9.2-3.4 compatibility (issue4733)...
r25676 [255]
$ hg log -r 2 -T '{if(rev, \"\\"")}\n'
Matt Mackall
templater: create string unescape helper (issue4798)...
r26215 hg: parse error: trailing \ in string
Yuya Nishihara
templater: parse \"...\" as string for 2.9.2-3.4 compatibility (issue4733)...
r25676 [255]
$ hg log -r 2 -T '{if(rev, r\"\\"")}\n'
Matt Mackall
templater: create string unescape helper (issue4798)...
r26215 hg: parse error: trailing \ in string
Yuya Nishihara
templater: parse \"...\" as string for 2.9.2-3.4 compatibility (issue4733)...
r25676 [255]
Yuya Nishihara
templater: strip single backslash before quotation mark in quoted template...
r24966 $ cd ..
Yuya Nishihara
templater: strictly parse leading backslashes of '{' (issue4569) (BC)...
r24949 Test leading backslashes:
$ cd latesttag
Yuya Nishihara
templater: do not reevaluate rawstring as template (BC)...
r25597 $ hg log -r 2 -T '\{rev} {files % "\{file}"}\n'
{rev} {file}
$ hg log -r 2 -T '\\{rev} {files % "\\{file}"}\n'
\2 \head1
$ hg log -r 2 -T '\\\{rev} {files % "\\\{file}"}\n'
\{rev} \{file}
Yuya Nishihara
templater: strictly parse leading backslashes of '{' (issue4569) (BC)...
r24949 $ cd ..
Yuya Nishihara
templater: do not preprocess template string in "if" expression (issue4714)...
r25471 Test leading backslashes in "if" expression (issue4714):
$ cd latesttag
$ hg log -r 2 -T '{if("1", "\{rev}")} {if("1", r"\{rev}")}\n'
Yuya Nishihara
templater: do not reevaluate rawstring as template (BC)...
r25597 {rev} \{rev}
Yuya Nishihara
templater: do not preprocess template string in "if" expression (issue4714)...
r25471 $ hg log -r 2 -T '{if("1", "\\{rev}")} {if("1", r"\\{rev}")}\n'
Yuya Nishihara
templater: do not reevaluate rawstring as template (BC)...
r25597 \2 \\{rev}
Yuya Nishihara
templater: do not preprocess template string in "if" expression (issue4714)...
r25471 $ hg log -r 2 -T '{if("1", "\\\{rev}")} {if("1", r"\\\{rev}")}\n'
Yuya Nishihara
templater: do not reevaluate rawstring as template (BC)...
r25597 \{rev} \\\{rev}
Yuya Nishihara
templater: do not preprocess template string in "if" expression (issue4714)...
r25471 $ cd ..
FUJIWARA Katsunori
templater: make strings in template expressions be "string-escape"-ed correctly...
r20663 "string-escape"-ed "\x5c\x786e" becomes r"\x6e" (once) or r"n" (twice)
$ hg log -R a -r 0 --template '{if("1", "\x5c\x786e", "NG")}\n'
\x6e
$ hg log -R a -r 0 --template '{if("1", r"\x5c\x786e", "NG")}\n'
\x5c\x786e
$ hg log -R a -r 0 --template '{if("", "NG", "\x5c\x786e")}\n'
\x6e
$ hg log -R a -r 0 --template '{if("", "NG", r"\x5c\x786e")}\n'
\x5c\x786e
$ hg log -R a -r 2 --template '{ifeq("no perso\x6e", desc, "\x5c\x786e", "NG")}\n'
\x6e
$ hg log -R a -r 2 --template '{ifeq(r"no perso\x6e", desc, "NG", r"\x5c\x786e")}\n'
\x5c\x786e
$ hg log -R a -r 2 --template '{ifeq(desc, "no perso\x6e", "\x5c\x786e", "NG")}\n'
\x6e
$ hg log -R a -r 2 --template '{ifeq(desc, r"no perso\x6e", "NG", r"\x5c\x786e")}\n'
\x5c\x786e
$ hg log -R a -r 8 --template '{join(files, "\n")}\n'
fourth
second
third
$ hg log -R a -r 8 --template '{join(files, r"\n")}\n'
fourth\nsecond\nthird
$ hg log -R a -r 2 --template '{rstdoc("1st\n\n2nd", "htm\x6c")}'
<p>
1st
</p>
<p>
2nd
</p>
$ hg log -R a -r 2 --template '{rstdoc(r"1st\n\n2nd", "html")}'
<p>
1st\n\n2nd
</p>
$ hg log -R a -r 2 --template '{rstdoc("1st\n\n2nd", r"htm\x6c")}'
1st
2nd
$ hg log -R a -r 2 --template '{strip(desc, "\x6e")}\n'
o perso
$ hg log -R a -r 2 --template '{strip(desc, r"\x6e")}\n'
no person
$ hg log -R a -r 2 --template '{strip("no perso\x6e", "\x6e")}\n'
o perso
$ hg log -R a -r 2 --template '{strip(r"no perso\x6e", r"\x6e")}\n'
no perso
$ hg log -R a -r 2 --template '{sub("\\x6e", "\x2d", desc)}\n'
-o perso-
$ hg log -R a -r 2 --template '{sub(r"\\x6e", "-", desc)}\n'
no person
$ hg log -R a -r 2 --template '{sub("n", r"\x2d", desc)}\n'
\x2do perso\x2d
$ hg log -R a -r 2 --template '{sub("n", "\x2d", "no perso\x6e")}\n'
-o perso-
$ hg log -R a -r 2 --template '{sub("n", r"\x2d", r"no perso\x6e")}\n'
\x2do perso\x6e
$ hg log -R a -r 8 --template '{files % "{file}\n"}'
fourth
second
third
Mads Kiilerich
spelling: fixes from spell checker
r21024 Test string escaping in nested expression:
FUJIWARA Katsunori
templater: make strings in template expressions be "string-escape"-ed correctly...
r20663
$ hg log -R a -r 8 --template '{ifeq(r"\x6e", if("1", "\x5c\x786e"), join(files, "\x5c\x786e"))}\n'
fourth\x6esecond\x6ethird
$ hg log -R a -r 8 --template '{ifeq(if("1", r"\x6e"), "\x5c\x786e", join(files, "\x5c\x786e"))}\n'
fourth\x6esecond\x6ethird
$ hg log -R a -r 8 --template '{join(files, ifeq(branch, "default", "\x5c\x786e"))}\n'
fourth\x6esecond\x6ethird
$ hg log -R a -r 8 --template '{join(files, ifeq(branch, "default", r"\x5c\x786e"))}\n'
fourth\x5c\x786esecond\x5c\x786ethird
$ hg log -R a -r 3:4 --template '{rev}:{sub(if("1", "\x6e"), ifeq(branch, "foo", r"\x5c\x786e", "\x5c\x786e"), desc)}\n'
3:\x6eo user, \x6eo domai\x6e
4:\x5c\x786eew bra\x5c\x786ech
Yuya Nishihara
templater: introduce one-pass parsing of nested template strings...
r25783 Test quotes in nested expression are evaluated just like a $(command)
substitution in POSIX shells:
$ hg log -R a -r 8 -T '{"{"{rev}:{node|short}"}"}\n'
8:95c24699272e
$ hg log -R a -r 8 -T '{"{"\{{rev}} \"{node|short}\""}"}\n'
{8} "95c24699272e"
Matt Mackall
templater: only recursively evaluate string literals as templates (issue4103)
r20067 Test recursive evaluation:
$ hg init r
$ cd r
$ echo a > a
$ hg ci -Am '{rev}'
adding a
$ hg log -r 0 --template '{if(rev, desc)}\n'
{rev}
$ hg log -r 0 --template '{if(rev, "{author} {rev}")}\n'
test 0
Matt Mackall
templater: makes branches work correctly with stringify (issue4108)
r20076
FUJIWARA Katsunori
templater: avoid recursive evaluation of string literals completely...
r20661 $ hg branch -q 'text.{rev}'
$ echo aa >> aa
$ hg ci -u '{node|short}' -m 'desc to be wrapped desc to be wrapped'
Matt Mackall
merge with stable
r20670 $ hg log -l1 --template '{fill(desc, "20", author, branch)}'
FUJIWARA Katsunori
templater: avoid recursive evaluation of string literals completely...
r20661 {node|short}desc to
text.{rev}be wrapped
text.{rev}desc to be
text.{rev}wrapped (no-eol)
Matt Mackall
merge with stable
r20670 $ hg log -l1 --template '{fill(desc, "20", "{node|short}:", "text.{rev}:")}'
FUJIWARA Katsunori
templater: avoid recursive evaluation of string literals completely...
r20661 bcc7ff960b8e:desc to
text.1:be wrapped
text.1:desc to be
text.1:wrapped (no-eol)
Yuya Nishihara
templater: drop redundant type conversion when evaluating integer argument...
r28344 $ hg log -l1 -T '{fill(desc, date, "", "")}\n'
hg: parse error: fill expects an integer width
[255]
FUJIWARA Katsunori
templater: avoid recursive evaluation of string literals completely...
r20661
Simon Farnsworth
template: provide a termwidth keyword (issue5395)...
r30088 $ 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)
Matt Mackall
merge with stable
r20670 $ hg log -l 1 --template '{sub(r"[0-9]", "-", author)}'
FUJIWARA Katsunori
templater: avoid recursive evaluation of string literals completely...
r20661 {node|short} (no-eol)
Matt Mackall
merge with stable
r20670 $ hg log -l 1 --template '{sub(r"[0-9]", "-", "{node|short}")}'
FUJIWARA Katsunori
templater: avoid recursive evaluation of string literals completely...
r20661 bcc-ff---b-e (no-eol)
$ cat >> .hg/hgrc <<EOF
> [extensions]
> color=
> [color]
> mode=ansi
> text.{rev} = red
> text.1 = green
> EOF
Matt Mackall
merge with stable
r20670 $ hg log --color=always -l 1 --template '{label(branch, "text\n")}'
FUJIWARA Katsunori
templater: avoid recursive evaluation of string literals completely...
r20661 \x1b[0;31mtext\x1b[0m (esc)
Matt Mackall
merge with stable
r20670 $ hg log --color=always -l 1 --template '{label("text.{rev}", "text\n")}'
FUJIWARA Katsunori
templater: avoid recursive evaluation of string literals completely...
r20661 \x1b[0;32mtext\x1b[0m (esc)
Yuya Nishihara
templater: make label() take unknown symbol as color literal...
r28373 color effect can be specified without quoting:
$ hg log --color=always -l 1 --template '{label(red, "text\n")}'
\x1b[0;31mtext\x1b[0m (esc)
Yuya Nishihara
color: insert color code after every "\e[0m" (issue5413)...
r31518 color effects can be nested (issue5413)
$ hg debugtemplate --color=always \
> '{label(red, "red{label(magenta, "ma{label(cyan, "cyan")}{label(yellow, "yellow")}genta")}")}\n'
\x1b[0;31mred\x1b[0;35mma\x1b[0;36mcyan\x1b[0m\x1b[0;31m\x1b[0;35m\x1b[0;33myellow\x1b[0m\x1b[0;31m\x1b[0;35mgenta\x1b[0m (esc)
Yuya Nishihara
templater: make pad() strip color codes before computing width (issue5416)...
r31521 pad() should interact well with color codes (issue5416)
$ hg debugtemplate --color=always \
> '{pad(label(red, "red"), 5, label(cyan, "-"))}\n'
\x1b[0;31mred\x1b[0m\x1b[0;36m-\x1b[0m\x1b[0;36m-\x1b[0m (esc)
Yuya Nishihara
templater: move label() function from color extension...
r28374 label should be no-op if color is disabled:
$ hg log --color=never -l 1 --template '{label(red, "text\n")}'
text
$ hg log --config extensions.color=! -l 1 --template '{label(red, "text\n")}'
text
Matt Mackall
templater: makes branches work correctly with stringify (issue4108)
r20076 Test branches inside if statement:
$ hg log -r 0 --template '{if(branches, "yes", "no")}\n'
no
FUJIWARA Katsunori
templater: apply "stringify()" on sub expression to get string correctly...
r20662
Yuya Nishihara
templater: add dict() constructor...
r31926 Test dict constructor:
$ hg log -r 0 -T '{dict(y=node|short, x=rev)}\n'
y=f7769ec2ab97 x=0
$ hg log -r 0 -T '{dict(x=rev, y=node|short) % "{key}={value}\n"}'
x=0
y=f7769ec2ab97
$ hg log -r 0 -T '{dict(x=rev, y=node|short)|json}\n'
{"x": 0, "y": "f7769ec2ab97"}
$ hg log -r 0 -T '{dict()|json}\n'
{}
Yuya Nishihara
templater: add shorthand for building a dict like {"key": key}...
r31928 $ hg log -r 0 -T '{dict(rev, node=node|short)}\n'
rev=0 node=f7769ec2ab97
$ hg log -r 0 -T '{dict(rev, node|short)}\n'
rev=0 node=f7769ec2ab97
$ hg log -r 0 -T '{dict(rev, rev=rev)}\n'
hg: parse error: duplicated dict key 'rev' inferred
[255]
$ hg log -r 0 -T '{dict(node, node|short)}\n'
hg: parse error: duplicated dict key 'node' inferred
[255]
$ hg log -r 0 -T '{dict(1 + 2)}'
hg: parse error: dict key cannot be inferred
[255]
Yuya Nishihara
templater: add dict() constructor...
r31926 $ hg log -r 0 -T '{dict(x=rev, x=node)}'
hg: parse error: dict got multiple values for keyword argument 'x'
[255]
Yuya Nishihara
templatekw: forward _hybrid.get to raw values so that get(extras, key) works...
r24241 Test get function:
$ hg log -r 0 --template '{get(extras, "branch")}\n'
default
Yuya Nishihara
templater: fix get() to evaluate arguments eagerly...
r28331 $ hg log -r 0 --template '{get(extras, "br{"anch"}")}\n'
default
Yuya Nishihara
templatekw: forward _hybrid.get to raw values so that get(extras, key) works...
r24241 $ hg log -r 0 --template '{get(files, "should_fail")}\n'
hg: parse error: get() expects a dict as first argument
[255]
Yuya Nishihara
templater: make _hybrid provide more list/dict-like methods...
r31882 Test json filter applied to hybrid object:
$ hg log -r0 -T '{files|json}\n'
["a"]
$ hg log -r0 -T '{extras|json}\n'
{"branch": "default"}
Yuya Nishihara
templater: add optional timezone argument to localdate()...
r26128 Test localdate(date, tz) function:
$ TZ=JST-09 hg log -r0 -T '{date|localdate|isodate}\n'
1970-01-01 09:00 +0900
$ TZ=JST-09 hg log -r0 -T '{localdate(date, "UTC")|isodate}\n'
1970-01-01 00:00 +0000
Matt Mackall
date: refactor timezone parsing...
r29636 $ TZ=JST-09 hg log -r0 -T '{localdate(date, "blahUTC")|isodate}\n'
hg: parse error: localdate expects a timezone
[255]
Yuya Nishihara
templater: add optional timezone argument to localdate()...
r26128 $ TZ=JST-09 hg log -r0 -T '{localdate(date, "+0200")|isodate}\n'
1970-01-01 02:00 +0200
$ TZ=JST-09 hg log -r0 -T '{localdate(date, "0")|isodate}\n'
1970-01-01 00:00 +0000
$ TZ=JST-09 hg log -r0 -T '{localdate(date, 0)|isodate}\n'
1970-01-01 00:00 +0000
$ hg log -r0 -T '{localdate(date, "invalid")|isodate}\n'
hg: parse error: localdate expects a timezone
[255]
$ hg log -r0 -T '{localdate(date, date)|isodate}\n'
hg: parse error: localdate expects a timezone
[255]
Durham Goode
template: add shortest(node) template function...
r20369 Test shortest(node) function:
$ echo b > b
$ hg ci -qAm b
$ hg log --template '{shortest(node)}\n'
Matt Mackall
merge with stable
r20670 e777
bcc7
Durham Goode
template: add shortest(node) template function...
r20369 f776
$ hg log --template '{shortest(node, 10)}\n'
Matt Mackall
merge with stable
r20670 e777603221
bcc7ff960b
Durham Goode
template: add shortest(node) template function...
r20369 f7769ec2ab
Yuya Nishihara
templater: introduce unified filter syntax for unary functions...
r26105 $ hg log --template '{node|shortest}\n' -l1
e777
Durham Goode
template: add pad function for padding output...
r20370
Yuya Nishihara
templater: fix shortest() to evaluate int argument and handle error
r28346 $ hg log -r 0 -T '{shortest(node, "1{"0"}")}\n'
f7769ec2ab
$ hg log -r 0 -T '{shortest(node, "not an int")}\n'
hg: parse error: shortest() expects an integer minlength
[255]
Yuya Nishihara
revlog: add support for partial matching of wdir node id...
r32684 $ hg log -r 'wdir()' -T '{node|shortest}\n'
ffff
Yuya Nishihara
templater: do not use index.partialmatch() directly to calculate shortest()...
r30231 $ cd ..
Test shortest(node) with the repo having short hash collision:
$ hg init hashcollision
$ cd hashcollision
$ cat <<EOF >> .hg/hgrc
> [experimental]
Boris Feld
config: use 'experimental.evolution.create-markers'...
r34867 > evolution.createmarkers=True
Yuya Nishihara
templater: do not use index.partialmatch() directly to calculate shortest()...
r30231 > EOF
$ echo 0 > a
$ hg ci -qAm 0
$ for i in 17 129 248 242 480 580 617 1057 2857 4025; do
> hg up -q 0
> echo $i > a
> hg ci -qm $i
> done
$ hg up -q null
$ hg log -r0: -T '{rev}:{node}\n'
0:b4e73ffab476aa0ee32ed81ca51e07169844bc6a
1:11424df6dc1dd4ea255eae2b58eaca7831973bbc
2:11407b3f1b9c3e76a79c1ec5373924df096f0499
3:11dd92fe0f39dfdaacdaa5f3997edc533875cfc4
4:10776689e627b465361ad5c296a20a487e153ca4
5:a00be79088084cb3aff086ab799f8790e01a976b
6:a0b0acd79b4498d0052993d35a6a748dd51d13e6
7:a0457b3450b8e1b778f1163b31a435802987fe5d
8:c56256a09cd28e5764f32e8e2810d0f01e2e357a
9:c5623987d205cd6d9d8389bfc40fff9dbb670b48
10:c562ddd9c94164376c20b86b0b4991636a3bf84f
$ hg debugobsolete a00be79088084cb3aff086ab799f8790e01a976b
Boris Feld
debugobsolete: also report the number of obsoleted changesets...
r33542 obsoleted 1 changesets
Yuya Nishihara
templater: do not use index.partialmatch() directly to calculate shortest()...
r30231 $ hg debugobsolete c5623987d205cd6d9d8389bfc40fff9dbb670b48
Boris Feld
debugobsolete: also report the number of obsoleted changesets...
r33542 obsoleted 1 changesets
Yuya Nishihara
templater: do not use index.partialmatch() directly to calculate shortest()...
r30231 $ hg debugobsolete c562ddd9c94164376c20b86b0b4991636a3bf84f
Boris Feld
debugobsolete: also report the number of obsoleted changesets...
r33542 obsoleted 1 changesets
Yuya Nishihara
templater: do not use index.partialmatch() directly to calculate shortest()...
r30231
nodes starting with '11' (we don't have the revision number '11' though)
$ hg log -r 1:3 -T '{rev}:{shortest(node, 0)}\n'
1:1142
2:1140
3:11d
'5:a00' is hidden, but still we have two nodes starting with 'a0'
$ hg log -r 6:7 -T '{rev}:{shortest(node, 0)}\n'
6:a0b
7:a04
node '10' conflicts with the revision number '10' even if it is hidden
(we could exclude hidden revision numbers, but currently we don't)
$ hg log -r 4 -T '{rev}:{shortest(node, 0)}\n'
4:107
$ hg log -r 4 -T '{rev}:{shortest(node, 0)}\n' --hidden
4:107
node 'c562' should be unique if the other 'c562' nodes are hidden
Yuya Nishihara
templater: use unfiltered changelog to calculate shortest() at constant time...
r30232 (but we don't try the slow path to filter out hidden nodes for now)
Yuya Nishihara
templater: do not use index.partialmatch() directly to calculate shortest()...
r30231
$ hg log -r 8 -T '{rev}:{node|shortest}\n'
Yuya Nishihara
templater: use unfiltered changelog to calculate shortest() at constant time...
r30232 8:c5625
Yuya Nishihara
templater: do not use index.partialmatch() directly to calculate shortest()...
r30231 $ hg log -r 8:10 -T '{rev}:{node|shortest}\n' --hidden
8:c5625
9:c5623
10:c562d
$ cd ..
Durham Goode
template: add pad function for padding output...
r20370 Test pad function
Yuya Nishihara
templater: do not use index.partialmatch() directly to calculate shortest()...
r30231 $ cd r
Durham Goode
template: add pad function for padding output...
r20370 $ hg log --template '{pad(rev, 20)} {author|user}\n'
Matt Mackall
merge with stable
r20670 2 test
1 {node|short}
Durham Goode
template: add pad function for padding output...
r20370 0 test
$ hg log --template '{pad(rev, 20, " ", True)} {author|user}\n'
Matt Mackall
merge with stable
r20670 2 test
1 {node|short}
Durham Goode
template: add pad function for padding output...
r20370 0 test
$ hg log --template '{pad(rev, 20, "-", False)} {author|user}\n'
Matt Mackall
merge with stable
r20670 2------------------- test
1------------------- {node|short}
Durham Goode
template: add pad function for padding output...
r20370 0------------------- test
Durham Goode
template: add ifcontains template function...
r20518
Yuya Nishihara
templater: make pad function evaluate both string and rawstring templates...
r25509 Test template string in pad function
$ hg log -r 0 -T '{pad("\{{rev}}", 10)} {author|user}\n'
{0} test
$ hg log -r 0 -T '{pad(r"\{rev}", 10)} {author|user}\n'
Yuya Nishihara
templater: do not reevaluate rawstring as template (BC)...
r25597 \{rev} test
Yuya Nishihara
templater: make pad function evaluate both string and rawstring templates...
r25509
Yuya Nishihara
templater: fix pad() to evaluate int argument and handle error
r28345 Test width argument passed to pad function
$ hg log -r 0 -T '{pad(rev, "1{"0"}")} {author|user}\n'
0 test
$ hg log -r 0 -T '{pad(rev, "not an int")}\n'
hg: parse error: pad() expects an integer width
[255]
Yuya Nishihara
templater: reject bad fillchar argument passed to pad()...
r31519 Test invalid fillchar passed to pad function
$ hg log -r 0 -T '{pad(rev, 10, "")}\n'
hg: parse error: pad() expects a single fill character
[255]
$ hg log -r 0 -T '{pad(rev, 10, "--")}\n'
hg: parse error: pad() expects a single fill character
[255]
Yuya Nishihara
templater: make pad() evaluate boolean argument (BC)...
r29817 Test boolean argument passed to pad function
no crash
$ hg log -r 0 -T '{pad(rev, 10, "-", "f{"oo"}")}\n'
---------0
string/literal
$ hg log -r 0 -T '{pad(rev, 10, "-", "false")}\n'
---------0
$ hg log -r 0 -T '{pad(rev, 10, "-", false)}\n'
0---------
$ hg log -r 0 -T '{pad(rev, 10, "-", "")}\n'
0---------
unknown keyword is evaluated to ''
$ hg log -r 0 -T '{pad(rev, 10, "-", unknownkeyword)}\n'
0---------
Martin von Zweigbergk
templater: add separate() template function...
r29085 Test separate function
$ hg log -r 0 -T '{separate("-", "", "a", "b", "", "", "c", "")}\n'
a-b-c
$ hg log -r 0 -T '{separate(" ", "{rev}:{node|short}", author|user, branch)}\n'
0:f7769ec2ab97 test default
$ hg log -r 0 --color=always -T '{separate(" ", "a", label(red, "b"), "c", label(red, ""), "d")}\n'
a \x1b[0;31mb\x1b[0m c d (esc)
Yuya Nishihara
templater: make pad() evaluate boolean argument (BC)...
r29817 Test boolean expression/literal passed to if function
$ hg log -r 0 -T '{if(rev, "rev 0 is True")}\n'
rev 0 is True
$ hg log -r 0 -T '{if(0, "literal 0 is True as well")}\n'
literal 0 is True as well
$ hg log -r 0 -T '{if("", "", "empty string is False")}\n'
empty string is False
$ hg log -r 0 -T '{if(revset(r"0 - 0"), "", "empty list is False")}\n'
empty list is False
$ hg log -r 0 -T '{if(true, "true is True")}\n'
true is True
$ hg log -r 0 -T '{if(false, "", "false is False")}\n'
false is False
$ hg log -r 0 -T '{if("false", "non-empty string is True")}\n'
non-empty string is True
Durham Goode
template: add ifcontains template function...
r20518 Test ifcontains function
Matt Mackall
templater: fix ifcontains when list is a string (issue4399)
r22843 $ hg log --template '{rev} {ifcontains(rev, "2 two 0", "is in the string", "is not")}\n'
2 is in the string
1 is not
0 is in the string
Yuya Nishihara
templater: fix ifcontains() to evaluate items argument eagerly...
r28332 $ hg log -T '{rev} {ifcontains(rev, "2 two{" 0"}", "is in the string", "is not")}\n'
2 is in the string
1 is not
0 is in the string
Durham Goode
template: add ifcontains template function...
r20518 $ hg log --template '{rev} {ifcontains("a", file_adds, "added a", "did not add a")}\n'
Matt Mackall
merge with stable
r20670 2 did not add a
Durham Goode
template: add ifcontains template function...
r20518 1 did not add a
0 added a
Durham Goode
template: add revset() template function...
r20519
Yuya Nishihara
templatekw: switch ctx of list expression to rev of {parents} (BC)...
r28270 $ hg log --debug -T '{rev}{ifcontains(1, parents, " is parent of 1")}\n'
2 is parent of 1
1
0
Durham Goode
template: add revset() template function...
r20519 Test revset function
$ hg log --template '{rev} {ifcontains(rev, revset("."), "current rev", "not current rev")}\n'
Matt Mackall
merge with stable
r20670 2 current rev
1 not current rev
Durham Goode
template: add revset() template function...
r20519 0 not current rev
Durham Goode
templates: fix ifcontains against sets with length > 1 (issue4259)...
r21540 $ hg log --template '{rev} {ifcontains(rev, revset(". + .^"), "match rev", "not match rev")}\n'
2 match rev
1 match rev
0 not match rev
Yuya Nishihara
templater: fix ifcontains() to handle type mismatch gracefully...
r34660 $ hg log -T '{ifcontains(desc, revset(":"), "", "type not match")}\n' -l1
type not match
Durham Goode
template: add revset() template function...
r20519 $ hg log --template '{rev} Parents: {revset("parents(%s)", rev)}\n'
Matt Mackall
merge with stable
r20670 2 Parents: 1
Durham Goode
template: add revset() template function...
r20519 1 Parents: 0
0 Parents:
FUJIWARA Katsunori
templater: enable alias predicates to be used in "revset()" function...
r22304 $ cat >> .hg/hgrc <<EOF
> [revsetalias]
> myparents(\$1) = parents(\$1)
> EOF
$ hg log --template '{rev} Parents: {revset("myparents(%s)", rev)}\n'
2 Parents: 1
1 Parents: 0
0 Parents:
Durham Goode
template: add revset() template function...
r20519 $ hg log --template 'Rev: {rev}\n{revset("::%s", rev) % "Ancestor: {revision}\n"}\n'
Matt Mackall
merge with stable
r20670 Rev: 2
Ancestor: 0
Ancestor: 1
Ancestor: 2
Durham Goode
template: add revset() template function...
r20519 Rev: 1
Ancestor: 0
Ancestor: 1
Rev: 0
Ancestor: 0
Yuya Nishihara
templater: evaluate "query" argument passed to revset()...
r25637 $ hg log --template '{revset("TIP"|lower)}\n' -l1
2
Yuya Nishihara
templater: fix revset() to evaluate format arguments eagerly...
r28333 $ hg log -T '{revset("%s", "t{"ip"}")}\n' -l1
2
Yuya Nishihara
templatekw: switch ctx of list expression to rev of {parents} (BC)...
r28270 a list template is evaluated for each item of revset/parents
Yuya Nishihara
templater: switch ctx of list expression to rev of revset() (BC)...
r26234
$ hg log -T '{rev} p: {revset("p1(%s)", rev) % "{rev}:{node|short}"}\n'
2 p: 1:bcc7ff960b8e
1 p: 0:f7769ec2ab97
0 p:
Yuya Nishihara
templatekw: switch ctx of list expression to rev of {parents} (BC)...
r28270 $ hg log --debug -T '{rev} p:{parents % " {rev}:{node|short}"}\n'
2 p: 1:bcc7ff960b8e -1:000000000000
1 p: 0:f7769ec2ab97 -1:000000000000
0 p: -1:000000000000 -1:000000000000
Yuya Nishihara
templater: switch ctx of list expression to rev of revset() (BC)...
r26234 therefore, 'revcache' should be recreated for each rev
$ hg log -T '{rev} {file_adds}\np {revset("p1(%s)", rev) % "{file_adds}"}\n'
2 aa b
p
1
p a
0 a
p
Yuya Nishihara
templatekw: switch ctx of list expression to rev of {parents} (BC)...
r28270 $ hg log --debug -T '{rev} {file_adds}\np {parents % "{file_adds}"}\n'
2 aa b
p
1
p a
0 a
p
Yuya Nishihara
templater: evaluate each item of revset() as integer revision...
r28177 a revset item must be evaluated as an integer revision, not an offset from tip
$ hg log -l 1 -T '{revset("null") % "{rev}:{node|short}"}\n'
-1:000000000000
$ hg log -l 1 -T '{revset("%s", "null") % "{rev}:{node|short}"}\n'
-1:000000000000
Yuya Nishihara
templatekw: fix join format of revset() function...
r29623 join() should pick '{rev}' from revset items:
$ hg log -R ../a -T '{join(revset("parents(%d)", rev), ", ")}\n' -r6
4, 5
Yuya Nishihara
templatekw: fix join format of parents keyword (issue5292)...
r29624 on the other hand, parents are formatted as '{rev}:{node|formatnode}' by
default. join() should agree with the default formatting:
$ hg log -R ../a -T '{join(parents, ", ")}\n' -r6
5:13207e5a10d9, 4:bbe44766e73d
$ hg log -R ../a -T '{join(parents, ",\n")}\n' -r6 --debug
5:13207e5a10d9fd28ec424934298e176197f2c67f,
4:bbe44766e73d5f11ed2177f1838de10c53ef3e74
Yuya Nishihara
revsetlang: raise ParseError to report invalid format character...
r35575 Invalid arguments passed to revset()
$ hg log -T '{revset("%whatever", 0)}\n'
hg: parse error: unexpected revspec format character w
[255]
Yuya Nishihara
revsetlang: catch invalid format character with %l prefix...
r35609 $ hg log -T '{revset("%lwhatever", files)}\n'
hg: parse error: unexpected revspec format character w
[255]
Yuya Nishihara
revsetlang: check number of arguments passed to formatspec()
r35610 $ hg log -T '{revset("%s %s", 0)}\n'
hg: parse error: missing argument for revspec
[255]
$ hg log -T '{revset("", 0)}\n'
hg: parse error: too many revspec arguments specified
[255]
$ hg log -T '{revset("%s", 0, 1)}\n'
hg: parse error: too many revspec arguments specified
[255]
Yuya Nishihara
revsetlang: check incomplete revspec format character
r35611 $ hg log -T '{revset("%", 0)}\n'
hg: parse error: incomplete revspec format character
[255]
$ hg log -T '{revset("%l", 0)}\n'
hg: parse error: incomplete revspec format character
[255]
Yuya Nishihara
revsetlang: catch invalid value passed to formatspec()...
r35612 $ hg log -T '{revset("%d", 'foo')}\n'
hg: parse error: invalid argument for revspec
[255]
$ hg log -T '{revset("%ld", files)}\n'
hg: parse error: invalid argument for revspec
[255]
$ hg log -T '{revset("%ls", 0)}\n'
hg: parse error: invalid argument for revspec
[255]
$ hg log -T '{revset("%b", 'foo')}\n'
hg: parse error: invalid argument for revspec
[255]
$ hg log -T '{revset("%lb", files)}\n'
hg: parse error: invalid argument for revspec
[255]
$ hg log -T '{revset("%r", 0)}\n'
hg: parse error: invalid argument for revspec
[255]
Yuya Nishihara
revsetlang: raise ParseError to report invalid format character...
r35575
Hannes Oldenburg
templates: add built-in files() function...
r30008 Test files function
$ hg log -T "{rev}\n{join(files('*'), '\n')}\n"
2
a
aa
b
1
a
0
a
$ hg log -T "{rev}\n{join(files('aa'), '\n')}\n"
2
aa
1
0
Yuya Nishihara
templater: add relpath() to convert repo path to relative path (issue5394)...
r30083 Test relpath function
$ hg log -r0 -T '{files % "{file|relpath}\n"}'
a
$ cd ..
$ hg log -R r -r0 -T '{files % "{file|relpath}\n"}'
Matt Harbison
tests: update globs for Windows...
r30732 r/a
Yuya Nishihara
templater: add relpath() to convert repo path to relative path (issue5394)...
r30083 $ cd r
Ryan McElroy
commands: rename current to active in variables and comments...
r25349 Test active bookmark templating
Durham Goode
template: add 'current' to scope during {bookmarks % ...}...
r20520
$ hg book foo
$ hg book bar
Ryan McElroy
templatekw: introduce active subkeyword from bookmarks keyword...
r25348 $ hg log --template "{rev} {bookmarks % '{bookmark}{ifeq(bookmark, active, \"*\")} '}\n"
Matt Mackall
merge with stable
r20670 2 bar* foo
1
Durham Goode
template: add 'current' to scope during {bookmarks % ...}...
r20520 0
Ryan McElroy
templatekw: replace currentbookmark with activebookmark keyword...
r25014 $ hg log --template "{rev} {activebookmark}\n"
FUJIWARA Katsunori
templatekw: add 'currentbookmark' keyword to show current bookmark easily...
r21896 2 bar
1
0
$ hg bookmarks --inactive bar
Ryan McElroy
templatekw: replace currentbookmark with activebookmark keyword...
r25014 $ hg log --template "{rev} {activebookmark}\n"
FUJIWARA Katsunori
templatekw: add 'currentbookmark' keyword to show current bookmark easily...
r21896 2
1
0
Yuya Nishihara
templatekw: fix {join(bookmarks, sep)} to always show associated bookmarks...
r24157 $ hg book -r1 baz
$ hg log --template "{rev} {join(bookmarks, ' ')}\n"
2 bar foo
1 baz
0
Yuya Nishihara
templater: implement _hybrid.__contains__ so that ifcontains can accept dict...
r24240 $ hg log --template "{rev} {ifcontains('foo', bookmarks, 't', 'f')}\n"
2 t
1 f
0 f
FUJIWARA Katsunori
templater: apply "stringify()" on sub expression to get string correctly...
r20662
Yuya Nishihara
templatekw: add {namespaces} keyword...
r27894 Test namespaces dict
Gregory Szorc
namespaces: record and expose whether namespace is built-in...
r33048 $ hg --config extensions.revnamesext=$TESTDIR/revnamesext.py log -T '{rev}\n{namespaces % " {namespace} color={colorname} builtin={builtin}\n {join(names, ",")}\n"}\n'
Gregory Szorc
templatekw: expose color name in {namespaces} entries...
r33047 2
Gregory Szorc
namespaces: record and expose whether namespace is built-in...
r33048 bookmarks color=bookmark builtin=True
Gregory Szorc
templatekw: expose color name in {namespaces} entries...
r33047 bar,foo
Gregory Szorc
namespaces: record and expose whether namespace is built-in...
r33048 tags color=tag builtin=True
Gregory Szorc
templatekw: expose color name in {namespaces} entries...
r33047 tip
Gregory Szorc
namespaces: record and expose whether namespace is built-in...
r33048 branches color=branch builtin=True
Gregory Szorc
templatekw: expose color name in {namespaces} entries...
r33047 text.{rev}
Gregory Szorc
namespaces: record and expose whether namespace is built-in...
r33048 revnames color=revname builtin=False
r2
Gregory Szorc
templatekw: expose color name in {namespaces} entries...
r33047
1
Gregory Szorc
namespaces: record and expose whether namespace is built-in...
r33048 bookmarks color=bookmark builtin=True
Gregory Szorc
templatekw: expose color name in {namespaces} entries...
r33047 baz
Gregory Szorc
namespaces: record and expose whether namespace is built-in...
r33048 tags color=tag builtin=True
Gregory Szorc
templatekw: expose color name in {namespaces} entries...
r33047
Gregory Szorc
namespaces: record and expose whether namespace is built-in...
r33048 branches color=branch builtin=True
Gregory Szorc
templatekw: expose color name in {namespaces} entries...
r33047 text.{rev}
Gregory Szorc
namespaces: record and expose whether namespace is built-in...
r33048 revnames color=revname builtin=False
r1
Gregory Szorc
templatekw: expose color name in {namespaces} entries...
r33047
0
Gregory Szorc
namespaces: record and expose whether namespace is built-in...
r33048 bookmarks color=bookmark builtin=True
tags color=tag builtin=True
Gregory Szorc
templatekw: expose color name in {namespaces} entries...
r33047
Gregory Szorc
namespaces: record and expose whether namespace is built-in...
r33048 branches color=branch builtin=True
Gregory Szorc
templatekw: expose color name in {namespaces} entries...
r33047 default
Gregory Szorc
namespaces: record and expose whether namespace is built-in...
r33048 revnames color=revname builtin=False
r0
Gregory Szorc
templatekw: expose color name in {namespaces} entries...
r33047
Yuya Nishihara
templatekw: add {namespaces} keyword...
r27894 $ 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
Yuya Nishihara
templatekw: allow accessing to nested namespace item by its template name...
r34542 $ hg log -r2 -T '{namespaces.bookmarks % "{bookmark}\n"}'
bar
foo
Yuya Nishihara
templatekw: add {namespaces} keyword...
r27894
FUJIWARA Katsunori
templater: apply "stringify()" on sub expression to get string correctly...
r20662 Test stringify on sub expressions
Matt Mackall
merge with stable
r20670 $ cd ..
FUJIWARA Katsunori
templater: apply "stringify()" on sub expression to get string correctly...
r20662 $ hg log -R a -r 8 --template '{join(files, if("1", if("1", ", ")))}\n'
fourth, second, third
$ hg log -R a -r 8 --template '{strip(if("1", if("1", "-abc-")), if("1", if("1", "-")))}\n'
abc
Matt Mackall
merge with stable
r20670
Ryan McElroy
templatefilter: add splitlines function...
r21820 Test splitlines
$ hg log -Gv -R a --template "{splitlines(desc) % 'foo {line}\n'}"
Jordi Gutiérrez Hermoso
tests: add a new commit to test-commandline-template...
r24985 @ foo Modify, add, remove, rename
|
o foo future
Ryan McElroy
templatefilter: add splitlines function...
r21820 |
o foo third
|
o foo second
o foo merge
|\
| o foo new head
| |
o | foo new branch
|/
o foo no user, no domain
|
o foo no person
|
o foo other 1
| foo other 2
| foo
| foo other 3
o foo line 1
foo line 2
Ryan McElroy
templater: introduce startswith function...
r21821
Yuya Nishihara
templatefilters: fix crash by string formatting of '{x|splitlines}'...
r32039 $ hg log -R a -r0 -T '{desc|splitlines}\n'
line 1 line 2
$ hg log -R a -r0 -T '{join(desc|splitlines, "|")}\n'
line 1|line 2
Ryan McElroy
templater: introduce startswith function...
r21821 Test startswith
$ hg log -Gv -R a --template "{startswith(desc)}"
hg: parse error: startswith expects two arguments
[255]
$ hg log -Gv -R a --template "{startswith('line', desc)}"
@
|
o
|
o
Jordi Gutiérrez Hermoso
tests: add a new commit to test-commandline-template...
r24985 |
o
Ryan McElroy
templater: introduce startswith function...
r21821
o
|\
| o
| |
o |
|/
o
|
o
|
o
|
o line 1
line 2
Ryan McElroy
templater: add symbol to error...
r21822
Test bad template with better error message
$ hg log -Gv -R a --template '{desc|user()}'
hg: parse error: expected a symbol, got 'func'
[255]
Ryan McElroy
templater: introduce word function...
r21846
Test word function (including index out of bounds graceful failure)
$ hg log -Gv -R a --template "{word('1', desc)}"
Jordi Gutiérrez Hermoso
tests: add a new commit to test-commandline-template...
r24985 @ add,
|
o
Ryan McElroy
templater: introduce word function...
r21846 |
o
|
o
o
|\
| o head
| |
o | branch
|/
o user,
|
o person
|
o 1
|
o 1
Test word third parameter used as splitter
$ hg log -Gv -R a --template "{word('0', desc, 'o')}"
Jordi Gutiérrez Hermoso
tests: add a new commit to test-commandline-template...
r24985 @ M
|
o future
Ryan McElroy
templater: introduce word function...
r21846 |
o third
|
o sec
o merge
|\
| o new head
| |
o | new branch
|/
o n
|
o n
|
o
|
o line 1
line 2
Test word error messages for not enough and too many arguments
$ hg log -Gv -R a --template "{word('0')}"
hg: parse error: word expects two or three arguments, got 1
[255]
$ hg log -Gv -R a --template "{word('0', desc, 'o', 'h', 'b', 'o', 'y')}"
hg: parse error: word expects two or three arguments, got 7
[255]
Ryan McElroy
templater: fail more gracefully for blank strings to word
r24886
Yuya Nishihara
templater: tokenize decimal integer literal (issue4638) (BC)...
r25002 Test word for integer literal
$ hg log -R a --template "{word(2, desc)}\n" -r0
line
Ryan McElroy
templater: fail more gracefully for blank strings to word
r24886 Test word for invalid numbers
Yuya Nishihara
templater: tokenize decimal integer literal (issue4638) (BC)...
r25002 $ hg log -Gv -R a --template "{word('a', desc)}"
Yuya Nishihara
templater: update error message of invalid number passed to word() function...
r25003 hg: parse error: word expects an integer index
Ryan McElroy
templater: fail more gracefully for blank strings to word
r24886 [255]
Ryan McElroy
templater: introduce indent function
r25489
Matt Harbison
templater: protect word() from crashing on out of range negative value...
r26502 Test word for out of range
$ hg log -R a --template "{word(10000, desc)}"
$ hg log -R a --template "{word(-10000, desc)}"
Ryan McElroy
templater: introduce indent function
r25489 Test indent and not adding to empty lines
$ hg log -T "-----\n{indent(desc, '>> ', ' > ')}\n" -r 0:1 -R a
-----
> line 1
>> line 2
-----
> other 1
>> other 2
>> other 3
Test with non-strings like dates
$ hg log -T "{indent(date, ' ')}\n" -r 2:3 -R a
1200000.00
1300000.00
Matt Mackall
templater: create string unescape helper (issue4798)...
r26215
Test broken string escapes:
$ hg log -T "bogus\\" -R a
hg: parse error: trailing \ in string
[255]
$ hg log -T "\\xy" -R a
hg: parse error: invalid \x escape
[255]
Yuya Nishihara
templatefilters: try round-trip utf-8 conversion by json filter (issue4933)...
r26856
Yuya Nishihara
templatefilters: make json filter be byte-transparent (BC) (issue4926)...
r28212 json filter should escape HTML tags so that the output can be embedded in hgweb:
$ hg log -T "{'<foo@example.org>'|json}\n" -R a -l1
"\u003cfoo@example.org\u003e"
Yuya Nishihara
templater: add parsing and expansion rules to process "templatealias" section...
r28912 Templater supports aliases of symbol and func() styles:
$ hg clone -q a aliases
$ cd aliases
$ cat <<EOF >> .hg/hgrc
> [templatealias]
> r = rev
> rn = "{r}:{node|short}"
> status(c, files) = files % "{c} {file}\n"
> utcdate(d) = localdate(d, "UTC")
> EOF
$ hg debugtemplate -vr0 '{rn} {utcdate(date)|isodate}\n'
(template
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (symbol 'rn')
(string ' ')
Yuya Nishihara
templater: add parsing and expansion rules to process "templatealias" section...
r28912 (|
(func
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (symbol 'utcdate')
(symbol 'date'))
(symbol 'isodate'))
(string '\n'))
Yuya Nishihara
templater: add parsing and expansion rules to process "templatealias" section...
r28912 * expanded:
(template
(template
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (symbol 'rev')
(string ':')
Yuya Nishihara
templater: add parsing and expansion rules to process "templatealias" section...
r28912 (|
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (symbol 'node')
(symbol 'short')))
(string ' ')
Yuya Nishihara
templater: add parsing and expansion rules to process "templatealias" section...
r28912 (|
(func
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (symbol 'localdate')
Yuya Nishihara
templater: add parsing and expansion rules to process "templatealias" section...
r28912 (list
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (symbol 'date')
(string 'UTC')))
(symbol 'isodate'))
(string '\n'))
Yuya Nishihara
templater: load and expand aliases by template engine (API) (issue4842)...
r28957 0:1e4e1b8f71e0 1970-01-12 13:46 +0000
Yuya Nishihara
templater: add parsing and expansion rules to process "templatealias" section...
r28912
$ hg debugtemplate -vr0 '{status("A", file_adds)}'
(template
(func
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (symbol 'status')
Yuya Nishihara
templater: add parsing and expansion rules to process "templatealias" section...
r28912 (list
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (string 'A')
(symbol 'file_adds'))))
Yuya Nishihara
templater: add parsing and expansion rules to process "templatealias" section...
r28912 * expanded:
(template
(%
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (symbol 'file_adds')
Yuya Nishihara
templater: add parsing and expansion rules to process "templatealias" section...
r28912 (template
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (string 'A')
(string ' ')
(symbol 'file')
(string '\n'))))
Yuya Nishihara
templater: load and expand aliases by template engine (API) (issue4842)...
r28957 A a
Yuya Nishihara
templater: add parsing and expansion rules to process "templatealias" section...
r28912
A unary function alias can be called as a filter:
$ hg debugtemplate -vr0 '{date|utcdate|isodate}\n'
(template
(|
(|
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (symbol 'date')
(symbol 'utcdate'))
(symbol 'isodate'))
(string '\n'))
Yuya Nishihara
templater: add parsing and expansion rules to process "templatealias" section...
r28912 * expanded:
(template
(|
(func
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (symbol 'localdate')
Yuya Nishihara
templater: add parsing and expansion rules to process "templatealias" section...
r28912 (list
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (symbol 'date')
(string 'UTC')))
(symbol 'isodate'))
(string '\n'))
Yuya Nishihara
templater: load and expand aliases by template engine (API) (issue4842)...
r28957 1970-01-12 13:46 +0000
Aliases should be applied only to command arguments and templates in hgrc.
Otherwise, our stock styles and web templates could be corrupted:
$ hg log -r0 -T '{rn} {utcdate(date)|isodate}\n'
0:1e4e1b8f71e0 1970-01-12 13:46 +0000
$ hg log -r0 --config ui.logtemplate='"{rn} {utcdate(date)|isodate}\n"'
0:1e4e1b8f71e0 1970-01-12 13:46 +0000
$ cat <<EOF > tmpl
> changeset = 'nothing expanded:{rn}\n'
> EOF
$ hg log -r0 --style ./tmpl
nothing expanded:
Aliases in formatter:
$ hg branches -T '{pad(branch, 7)} {rn}\n'
default 6:d41e714fe50d
foo 4:bbe44766e73d
Yuya Nishihara
templater: add parsing and expansion rules to process "templatealias" section...
r28912
Yuya Nishihara
ui: drop template aliases by HGPLAIN...
r28958 Aliases should honor HGPLAIN:
$ HGPLAIN= hg log -r0 -T 'nothing expanded:{rn}\n'
nothing expanded:
$ HGPLAINEXCEPT=templatealias hg log -r0 -T '{rn}\n'
0:1e4e1b8f71e0
Yuya Nishihara
templater: add parsing and expansion rules to process "templatealias" section...
r28912 Unparsable alias:
$ hg debugtemplate --config templatealias.bad='x(' -v '{bad}'
(template
Yuya Nishihara
parser: stabilize output of prettyformat() by using byte-safe repr()...
r34075 (symbol 'bad'))
Yuya Nishihara
parser: shorten prefix of alias parsing errors...
r29059 abort: bad definition of template alias "bad": at 2: not a prefix: end
Yuya Nishihara
templater: add parsing and expansion rules to process "templatealias" section...
r28912 [255]
Yuya Nishihara
templater: load and expand aliases by template engine (API) (issue4842)...
r28957 $ hg log --config templatealias.bad='x(' -T '{bad}'
Yuya Nishihara
parser: shorten prefix of alias parsing errors...
r29059 abort: bad definition of template alias "bad": at 2: not a prefix: end
Yuya Nishihara
templater: load and expand aliases by template engine (API) (issue4842)...
r28957 [255]
Yuya Nishihara
templater: add parsing and expansion rules to process "templatealias" section...
r28912
$ cd ..
Yuya Nishihara
templatefilters: try round-trip utf-8 conversion by json filter (issue4933)...
r26856 Set up repository for non-ascii encoding tests:
$ hg init nonascii
$ cd nonascii
Augie Fackler
tests: replace yet more calls to `python` with $PYTHON...
r33262 $ $PYTHON <<EOF
Yuya Nishihara
py3: fix test-command-template.t to write files in binary mode
r36522 > open('latin1', 'wb').write(b'\xe9')
> open('utf-8', 'wb').write(b'\xc3\xa9')
Yuya Nishihara
templatefilters: try round-trip utf-8 conversion by json filter (issue4933)...
r26856 > EOF
$ HGENCODING=utf-8 hg branch -q `cat utf-8`
Yuya Nishihara
templatekw: workaround for utf-8 round-trip of {desc}...
r28239 $ HGENCODING=utf-8 hg ci -qAm "non-ascii branch: `cat utf-8`" utf-8
Yuya Nishihara
templatefilters: try round-trip utf-8 conversion by json filter (issue4933)...
r26856
json filter should try round-trip conversion to utf-8:
$ HGENCODING=ascii hg log -T "{branch|json}\n" -r0
"\u00e9"
Yuya Nishihara
templatekw: workaround for utf-8 round-trip of {desc}...
r28239 $ HGENCODING=ascii hg log -T "{desc|json}\n" -r0
"non-ascii branch: \u00e9"
Yuya Nishihara
templatefilters: try round-trip utf-8 conversion by json filter (issue4933)...
r26856
Yuya Nishihara
templatefilters: make json filter be byte-transparent (BC) (issue4926)...
r28212 json filter takes input as utf-8b:
Yuya Nishihara
templatefilters: try round-trip utf-8 conversion by json filter (issue4933)...
r26856
$ HGENCODING=ascii hg log -T "{'`cat utf-8`'|json}\n" -l1
Yuya Nishihara
templatefilters: make json filter be byte-transparent (BC) (issue4926)...
r28212 "\u00e9"
$ HGENCODING=ascii hg log -T "{'`cat latin1`'|json}\n" -l1
"\udce9"
Yuya Nishihara
templatefilters: try round-trip utf-8 conversion by json filter (issue4933)...
r26856
Yuya Nishihara
templatefilters: add "utf8" to get utf-8 bytes from local-encoding text...
r28209 utf8 filter:
$ HGENCODING=ascii hg log -T "round-trip: {branch|utf8|hex}\n" -r0
round-trip: c3a9
$ HGENCODING=latin1 hg log -T "decoded: {'`cat latin1`'|utf8|hex}\n" -l1
decoded: c3a9
$ HGENCODING=ascii hg log -T "replaced: {'`cat latin1`'|utf8|hex}\n" -l1
abort: decoding near * (glob)
[255]
$ hg log -T "invalid type: {rev|utf8}\n" -r0
abort: template filter 'utf8' is not compatible with keyword 'rev'
[255]
Yuya Nishihara
templater: make pad() compute actual width...
r31520 pad width:
$ HGENCODING=utf-8 hg debugtemplate "{pad('`cat utf-8`', 2, '-')}\n"
\xc3\xa9- (esc)
Yuya Nishihara
templatefilters: try round-trip utf-8 conversion by json filter (issue4933)...
r26856 $ cd ..
FUJIWARA Katsunori
registrar: add templatefunc to mark a function as template function (API)...
r28695
Test that template function in extension is registered as expected
$ cd a
$ cat <<EOF > $TESTTMP/customfunc.py
> from mercurial import registrar
>
> templatefunc = registrar.templatefunc()
>
Yuya Nishihara
py3: mark all string literals in test-command-template.t as bytes...
r36566 > @templatefunc(b'custom()')
FUJIWARA Katsunori
registrar: add templatefunc to mark a function as template function (API)...
r28695 > def custom(context, mapping, args):
Yuya Nishihara
py3: mark all string literals in test-command-template.t as bytes...
r36566 > return b'custom'
FUJIWARA Katsunori
registrar: add templatefunc to mark a function as template function (API)...
r28695 > EOF
$ cat <<EOF > .hg/hgrc
> [extensions]
> customfunc = $TESTTMP/customfunc.py
> EOF
$ hg log -r . -T "{custom()}\n" --config customfunc.enabled=true
custom
$ cd ..
Danny Hooper
log: add a "graphwidth" template variable...
r33860
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 ..