##// END OF EJS Templates
perf: add command to benchmark bundle reading...
perf: add command to benchmark bundle reading Upcoming commits will be refactoring bundle2 I/O code. This commit establishes a `hg perfbundleread` command that measures how long it takes to read a bundle using various mechanisms. As a baseline, here's output from an uncompressed bundle1 bundle of my Firefox repo (7,098,622,890 bytes): ! read(8k) ! wall 0.763481 comb 0.760000 user 0.160000 sys 0.600000 (best of 6) ! read(16k) ! wall 0.644512 comb 0.640000 user 0.110000 sys 0.530000 (best of 16) ! read(32k) ! wall 0.581172 comb 0.590000 user 0.060000 sys 0.530000 (best of 18) ! read(128k) ! wall 0.535183 comb 0.530000 user 0.010000 sys 0.520000 (best of 19) ! cg1 deltaiter() ! wall 0.873500 comb 0.880000 user 0.840000 sys 0.040000 (best of 12) ! cg1 getchunks() ! wall 6.283797 comb 6.270000 user 5.570000 sys 0.700000 (best of 3) ! cg1 read(8k) ! wall 1.097173 comb 1.100000 user 0.400000 sys 0.700000 (best of 10) ! cg1 read(16k) ! wall 0.810750 comb 0.800000 user 0.200000 sys 0.600000 (best of 13) ! cg1 read(32k) ! wall 0.671215 comb 0.670000 user 0.110000 sys 0.560000 (best of 15) ! cg1 read(128k) ! wall 0.597857 comb 0.600000 user 0.020000 sys 0.580000 (best of 15) And from an uncompressed bundle2 bundle (6,070,036,163 bytes): ! read(8k) ! wall 0.676997 comb 0.680000 user 0.160000 sys 0.520000 (best of 15) ! read(16k) ! wall 0.592706 comb 0.590000 user 0.080000 sys 0.510000 (best of 17) ! read(32k) ! wall 0.529395 comb 0.530000 user 0.050000 sys 0.480000 (best of 16) ! read(128k) ! wall 0.491270 comb 0.490000 user 0.010000 sys 0.480000 (best of 19) ! bundle2 forwardchunks() ! wall 2.997131 comb 2.990000 user 2.270000 sys 0.720000 (best of 4) ! bundle2 iterparts() ! wall 12.247197 comb 10.670000 user 8.170000 sys 2.500000 (best of 3) ! bundle2 part seek() ! wall 11.761675 comb 10.500000 user 8.240000 sys 2.260000 (best of 3) ! bundle2 part read(8k) ! wall 9.116163 comb 9.110000 user 8.240000 sys 0.870000 (best of 3) ! bundle2 part read(16k) ! wall 8.984362 comb 8.970000 user 8.110000 sys 0.860000 (best of 3) ! bundle2 part read(32k) ! wall 8.758364 comb 8.740000 user 7.860000 sys 0.880000 (best of 3) ! bundle2 part read(128k) ! wall 8.749040 comb 8.730000 user 7.830000 sys 0.900000 (best of 3) We already see some interesting data. Notably that bundle2 has significant overhead compared to bundle1. This matters for e.g. stream clone bundles, which can be applied at >1Gbps. Differential Revision: https://phab.mercurial-scm.org/D1385

File last commit:

r34659:dbe1f511 default
r35108:e9661304 default
Show More
templates.txt
215 lines | 5.8 KiB | text/plain | TextLexer
Mercurial allows you to customize output of commands through
templates. You can either pass in a template or select an existing
template-style from the command line, via the --template option.
You can customize output for any "log-like" command: log,
outgoing, incoming, tip, parents, and heads.
Some built-in styles are packaged with Mercurial. These can be listed
with :hg:`log --template list`. Example usage::
$ hg log -r1.0::1.1 --template changelog
A template is a piece of text, with markup to invoke variable
expansion::
$ hg log -r1 --template "{node}\n"
b56ce7b07c52de7d5fd79fb89701ea538af65746
Keywords
========
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:
.. keywordsmarker
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
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::
$ hg tip --template "{date|isodate}\n"
2008-08-21 18:22 +0000
Filters
=======
List of filters:
.. filtersmarker
Note that a filter is nothing more than a function call, i.e.
``expr|filter`` is equivalent to ``filter(expr)``.
Functions
=========
In addition to filters, there are some basic built-in functions:
.. functionsmarker
Operators
=========
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)
Division fulfills the law x = x / y + mod(x, y).
Also, for any expression that returns a list, there is a list operator::
expr % "{template}"
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'...'``.
The dot operator can be used as a shorthand for accessing a sub item:
- ``expr.member`` is roughly equivalent to ``expr % '{member}'`` if ``expr``
returns a non-list/dict. The returned value is not stringified.
- ``dict.key`` is identical to ``get(dict, 'key')``.
Aliases
=======
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()``.
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
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}``.
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'
Examples
========
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"
- Join the list of files ending with ".py" with a ", "::
$ hg log -r 0 --template "pythonfiles: {join(files('**.py'), ', ')}\n"
- Separate non-empty arguments by a " "::
$ hg log -r 0 --template "{separate(' ', node, bookmarks, tags}\n"
- Modify each line of a commit description::
$ hg log --template "{splitlines(desc) % '**** {line}\n'}"
- Format date::
$ hg log -r 0 --template "{date(date, '%Y')}\n"
- Display date in UTC::
$ hg log -r 0 --template "{localdate(date, 'UTC')|date}\n"
- Output the description set to a fill-width of 30::
$ hg log -r 0 --template "{fill(desc, 30)}"
- 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"
- Display the contents of the 'extra' field, one per line::
$ hg log -r 0 --template "{join(extras, '\n')}\n"
- Mark the active bookmark with '*'::
$ hg log --template "{bookmarks % '{bookmark}{ifeq(bookmark, active, '*')} '}\n"
- Find the previous release candidate tag, the distance and changes since the tag::
$ hg log -r . --template "{latesttag('re:^.*-rc$') % '{tag}, {changes}, {distance}'}\n"
- Mark the working copy parent with '@'::
$ hg log --template "{ifcontains(rev, revset('.'), '@')}\n"
- Show details of parent revisions::
$ hg log --template "{revset('parents(%d)', rev) % '{desc|firstline}\n'}"
- Show only commit descriptions that start with "template"::
$ hg log --template "{startswith('template', firstline(desc))}\n"
- Print the first word of each line of a commit message::
$ hg log --template "{word(0, desc)}\n"