templates.txt
209 lines
| 5.6 KiB
| text/plain
|
TextLexer
Dan Villiom Podlaski Christiansen
|
r9999 | Mercurial allows you to customize output of commands through | ||
Yuya Nishihara
|
r21943 | templates. You can either pass in a template or select an existing | ||
template-style from the command line, via the --template option. | ||||
Dan Villiom Podlaski Christiansen
|
r9999 | |||
You can customize output for any "log-like" command: log, | ||||
Matt Mackall
|
r21945 | outgoing, incoming, tip, parents, and heads. | ||
Dan Villiom Podlaski Christiansen
|
r9999 | |||
Matt Mackall
|
r21946 | Some built-in styles are packaged with Mercurial. These can be listed | ||
with :hg:`log --template list`. Example usage:: | ||||
Dan Villiom Podlaski Christiansen
|
r9999 | |||
Matt Mackall
|
r21946 | $ hg log -r1.0::1.1 --template changelog | ||
Dan Villiom Podlaski Christiansen
|
r9999 | |||
A template is a piece of text, with markup to invoke variable | ||||
expansion:: | ||||
$ hg log -r1 --template "{node}\n" | ||||
b56ce7b07c52de7d5fd79fb89701ea538af65746 | ||||
Matt Harbison
|
r30730 | Keywords | ||
======== | ||||
Dan Villiom Podlaski Christiansen
|
r9999 | Strings in curly braces are called keywords. The availability of | ||
keywords depends on the exact context of the templater. These | ||||
keywords are usually available for templating a log-like command: | ||||
Patrick Mezard
|
r13585 | .. keywordsmarker | ||
Dan Villiom Podlaski Christiansen
|
r9999 | |||
The "date" keyword does not produce human-readable output. If you | ||||
want to use a date in your output, you can use a filter to process | ||||
it. Filters are functions which return a string based on the input | ||||
Dirkjan Ochtman
|
r10759 | variable. Be sure to use the stringify filter first when you're | ||
applying a string-input filter to a list-like input variable. | ||||
You can also use a chain of filters to get the desired output:: | ||||
Dan Villiom Podlaski Christiansen
|
r9999 | |||
$ hg tip --template "{date|isodate}\n" | ||||
2008-08-21 18:22 +0000 | ||||
Matt Harbison
|
r30730 | Filters | ||
======= | ||||
Dan Villiom Podlaski Christiansen
|
r9999 | List of filters: | ||
Patrick Mezard
|
r13591 | .. filtersmarker | ||
Sean Farley
|
r18465 | |||
Note that a filter is nothing more than a function call, i.e. | ||||
``expr|filter`` is equivalent to ``filter(expr)``. | ||||
Matt Harbison
|
r30730 | Functions | ||
========= | ||||
Sean Farley
|
r18465 | In addition to filters, there are some basic built-in functions: | ||
Gregory Szorc
|
r24587 | .. functionsmarker | ||
Ryan McElroy
|
r21846 | |||
Matt Harbison
|
r30731 | Operators | ||
========= | ||||
Matt Harbison
|
r30730 | |||
Simon Farnsworth
|
r30115 | We provide a limited set of infix arithmetic operations on integers:: | ||
+ for addition | ||||
- for subtraction | ||||
* for multiplication | ||||
/ for floor division (division rounded to integer nearest -infinity) | ||||
Matt Harbison
|
r32139 | Division fulfills the law x = x / y + mod(x, y). | ||
Simon Farnsworth
|
r30115 | |||
Yuya Nishihara
|
r28040 | Also, for any expression that returns a list, there is a list operator:: | ||
Sean Farley
|
r18465 | |||
Yuya Nishihara
|
r28040 | expr % "{template}" | ||
Sean Farley
|
r18465 | |||
Yuya Nishihara
|
r28040 | As seen in the above example, ``{template}`` is interpreted as a template. | ||
To prevent it from being interpreted, you can use an escape character ``\{`` | ||||
or a raw string prefix, ``r'...'``. | ||||
Yuya Nishihara
|
r25596 | |||
Matt Harbison
|
r30730 | Aliases | ||
======= | ||||
Yuya Nishihara
|
r28957 | New keywords and functions can be defined in the ``templatealias`` section of | ||
a Mercurial configuration file:: | ||||
<alias> = <definition> | ||||
Arguments of the form `a1`, `a2`, etc. are substituted from the alias into | ||||
the definition. | ||||
For example, | ||||
:: | ||||
[templatealias] | ||||
r = rev | ||||
rn = "{r}:{node|short}" | ||||
leftpad(s, w) = pad(s, w, ' ', True) | ||||
defines two symbol aliases, ``r`` and ``rn``, and a function alias | ||||
``leftpad()``. | ||||
Mathias De Maré
|
r29717 | It's also possible to specify complete template strings, using the | ||
``templates`` section. The syntax used is the general template string syntax. | ||||
For example, | ||||
:: | ||||
[templates] | ||||
nodedate = "{node|short}: {date(date, "%Y-%m-%d")}\n" | ||||
defines a template, ``nodedate``, which can be called like:: | ||||
$ hg log -r . -Tnodedate | ||||
Yuya Nishihara
|
r32875 | A template defined in ``templates`` section can also be referenced from | ||
another template:: | ||||
$ hg log -r . -T "{rev} {nodedate}" | ||||
but be aware that the keywords cannot be overridden by templates. For example, | ||||
a template defined as ``templates.rev`` cannot be referenced as ``{rev}``. | ||||
Yuya Nishihara
|
r32952 | A template defined in ``templates`` section may have sub templates which | ||
are inserted before/after/between items:: | ||||
[templates] | ||||
myjson = ' {dict(rev, node|short)|json}' | ||||
myjson:docheader = '\{\n' | ||||
myjson:docfooter = '\n}\n' | ||||
myjson:separator = ',\n' | ||||
Matt Harbison
|
r30730 | Examples | ||
======== | ||||
Sean Farley
|
r18465 | Some sample command line templates: | ||
- Format lists, e.g. files:: | ||||
$ hg log -r 0 --template "files:\n{files % ' {file}\n'}" | ||||
- Join the list of files with a ", ":: | ||||
$ hg log -r 0 --template "files: {join(files, ', ')}\n" | ||||
Hannes Oldenburg
|
r30008 | - Join the list of files ending with ".py" with a ", ":: | ||
$ hg log -r 0 --template "pythonfiles: {join(files('**.py'), ', ')}\n" | ||||
Martin von Zweigbergk
|
r29085 | - Separate non-empty arguments by a " ":: | ||
$ hg log -r 0 --template "{separate(' ', node, bookmarks, tags}\n" | ||||
Ryan McElroy
|
r21820 | - Modify each line of a commit description:: | ||
$ hg log --template "{splitlines(desc) % '**** {line}\n'}" | ||||
Sean Farley
|
r18465 | - Format date:: | ||
$ hg log -r 0 --template "{date(date, '%Y')}\n" | ||||
Yuya Nishihara
|
r26128 | - Display date in UTC:: | ||
$ hg log -r 0 --template "{localdate(date, 'UTC')|date}\n" | ||||
Sean Farley
|
r18465 | - Output the description set to a fill-width of 30:: | ||
Yuya Nishihara
|
r25004 | $ hg log -r 0 --template "{fill(desc, 30)}" | ||
Sean Farley
|
r18465 | |||
- Use a conditional to test for the default branch:: | ||||
$ hg log -r 0 --template "{ifeq(branch, 'default', 'on the main branch', | ||||
'on branch {branch}')}\n" | ||||
- Append a newline if not empty:: | ||||
$ hg tip --template "{if(author, '{author}\n')}" | ||||
- Label the output for use with the color extension:: | ||||
$ hg log -r 0 --template "{label('changeset.{phase}', node|short)}\n" | ||||
- Invert the firstline filter, i.e. everything but the first line:: | ||||
$ hg log -r 0 --template "{sub(r'^.*\n?\n?', '', desc)}\n" | ||||
Matthew Turk
|
r20016 | |||
- Display the contents of the 'extra' field, one per line:: | ||||
Steve Hoelzer
|
r20170 | $ hg log -r 0 --template "{join(extras, '\n')}\n" | ||
Durham Goode
|
r20531 | |||
Ryan McElroy
|
r25348 | - Mark the active bookmark with '*':: | ||
Durham Goode
|
r20531 | |||
Yuya Nishihara
|
r25786 | $ hg log --template "{bookmarks % '{bookmark}{ifeq(bookmark, active, '*')} '}\n" | ||
Durham Goode
|
r20531 | |||
Matt Harbison
|
r26485 | - Find the previous release candidate tag, the distance and changes since the tag:: | ||
$ hg log -r . --template "{latesttag('re:^.*-rc$') % '{tag}, {changes}, {distance}'}\n" | ||||
Durham Goode
|
r20531 | - Mark the working copy parent with '@':: | ||
$ hg log --template "{ifcontains(rev, revset('.'), '@')}\n" | ||||
Ryan McElroy
|
r21821 | |||
Yuya Nishihara
|
r26234 | - Show details of parent revisions:: | ||
$ hg log --template "{revset('parents(%d)', rev) % '{desc|firstline}\n'}" | ||||
Ryan McElroy
|
r21821 | - Show only commit descriptions that start with "template":: | ||
Yuya Nishihara
|
r25786 | $ hg log --template "{startswith('template', firstline(desc))}\n" | ||
Ryan McElroy
|
r21846 | |||
- Print the first word of each line of a commit message:: | ||||
Yuya Nishihara
|
r25004 | $ hg log --template "{word(0, desc)}\n" | ||