view mercurial/help/templates.txt @ 26379:39d643252b9f

revlog: use existing file handle when reading during _addrevision _addrevision() may need to read from revlogs as part of computing deltas. Previously, we would flush existing file handles and open a new, short-lived file handle to perform the reading. If we have an existing file handle, it seems logical to reuse it for reading instead of opening a new file handle. This patch makes that the new behavior. After this patch, revlog files are only reopened when adding revisions if the revlog is switched from inline to non-inline. On Linux when unbundling a bundle of the mozilla-central repo, this patch has the following impact on system call counts: Call Before After Delta write 827,639 673,390 -154,249 open 700,103 684,089 -16,014 read 74,489 74,489 0 fstat 493,924 461,896 -32,028 close 249,131 233,117 -16,014 stat 242,001 242,001 0 lstat 18,676 18,676 0 lseek 20,268 20,268 0 ioctl 14,652 13,173 -1,479 TOTAL 3,180,758 2,930,679 -250,079 It's worth noting that many of the open() calls fail due to missing files. That's why there are many more open() calls than close(). Despite the significant system call reduction, this change does not seem to have a significant performance impact on Linux. On Windows 10 (not a VM, on a SSD), this patch appears to reduce unbundle time for mozilla-central from ~960s to ~920s. This isn't as significant as I was hoping. But a decrease it is nonetheless. Still, Windows unbundle performance is still >2x slower than Linux. Despite the lack of significant gains, fewer system calls is fewer system calls. If nothing else, this will narrow the focus of potential areas to optimize in the future.
author Gregory Szorc <gregory.szorc@gmail.com>
date Sun, 27 Sep 2015 16:08:18 -0700
parents e4609ec959f8
children 43bf9471fae9
line wrap: on
line source

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

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

List of filters:

.. filtersmarker

Note that a filter is nothing more than a function call, i.e.
``expr|filter`` is equivalent to ``filter(expr)``.

In addition to filters, there are some basic built-in functions:

.. functionsmarker

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'...'".

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"

- 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"

- 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"