I'm trying to create a custom template for hg log
with a part that shows the first N (e.g. 72) characters of the first line. Based off this answer to a different question I've gotten so far:
hg log --template '{desc|strip|firstline}\n'
Now I'm trying to limit that bit to a certain number of characters. However, the corresponding template usage docs yields no search results for "substring", "left", etc. I've tried a few things, including
hg log --template '{desc|strip|firstline|strip|50}\n'
and just for testing also
hg log --template '{desc|strip|50}\n'
but they give an error:
hg: parse error: unkown function '50'
I'd hazard a guess that what I want is possible, but I just seem unable to find the appropriate syntax. How can I construct a template that outputs the first line of a commit message, up to a maximum of N characters?
You can use regular expressions and the
sub()
function to accomplish that. For example:The
sub()
function takes three arguments, the pattern, the replacement, and the string to be processed. In this example, we use a group that captures anywhere from 0 to 50 characters (except newline), followed by another pattern that slurps up the rest (so that it gets discarded). The replacement string simply shows the first group, and we usedesc
as the input. Simply change the50
in the example above with the width you actually want.If you don't want descriptions cut off mid-word, you can also use
fill()
in conjunction withfirstline
. Here,fill()
will break the input into lines, then we use the first line of the output. Example:Note that words with dashes in them may still be cut off, since
fill()
considers the position after a dash to be a valid choice for a linebreak.