'Mercurial log with one-liners
The regular hg log command gives output with at least 4 lines per changeset. For example
changeset: 238:03a214f2a1cf
user: My Name <[email protected]>
date: Thu Aug 26 09:49:32 2010 +0200
summary: Added tag v1.1 for changeset f22fd3974361
I mean to remember that there was a command to print a log in a more compact way what just had one line per changeset. A format that you could basically stick in a changelog.txt file and it would look nice.
Does that exist? Or am I mixing this with something I have seen with git or something else?
Solution 1:[1]
You can use hg log with a --template option, e.g.:
hg log --template '{node|short} | {date|isodatesec} | {author|user}: {desc|strip|firstline}\n'
This should show something like this (example from the GNU Emacs trunk I converted locally to an hg repository):
$ hg log --limit 5 --template '{node|short} | {date|isodatesec} | {author|user}: {desc|strip|firstline}\n'
36ab2e3f8ebd | 2010-09-08 16:54:00 +0200 | agustin: textmodes/ispell.el (ispell-valid-dictionary-list): Simplify logic.
9f3ac6d4a645 | 2010-09-08 16:42:54 +0200 | michael: Migrate to Tramp 2.2. Rearrange load dependencies.
8c696d2a7695 | 2010-09-07 20:01:23 +0200 | agustin: Make sure original ispell arg list is initialized in (ispell-start-process).
b5f110747072 | 2010-09-07 06:23:16 +0000 | yamaoka: gnus-html.el (gnus-html-wash-tags, gnus-html-put-image): Mark cid and internal images as deletable by `W D D'.
b53cfb7d099e | 2010-09-07 01:20:19 +0000 | yamaoka: gnus-async.el (gnus-html-prefetch-images): Autoload it when compiling; (gnus-async-article-callback): Fix typo.
$
Once you have a nice template for one-line summaries of changesets, you can add a command alias in your ~/.hgrc file like this:
[alias]
shortlog = log --template '{node|short} | {date|isodatesec} | {author|user}: {desc|strip|firstline}\n'
With the alias installed you can now type hg shortlog, hg short or even hg shor (to uniquely identify hg shortlog instead of hg showconfig) and all the usual `log' command-options. For instance it should now be possible to type:
$ hg short -r 100:103
db9f8efcf689 | 1990-09-14 19:07:14 +0000 | jimb: *** empty log message ***
5874bf15e07d | 1990-09-19 18:22:41 +0000 | gnulists: Initial revision
797d304414fd | 1990-09-27 21:17:59 +0000 | mtr: Initial revision
b2656b7830e4 | 1990-10-09 02:52:33 +0000 | rms: *** empty log message ***
$
or even things that use tag names (example from the mercurial crew repository itself):
keramida@kobe:/hg/mercurial/crew$ hg short -r 1.4 -r 1.5 -r 1.6
31ec469f9b55 | 2009-11-16 21:25:36 +0100 | mg: i18n-ja: fixed bad indentation
ff2704a8ded3 | 2010-03-05 17:24:52 -0600 | mpm: mq: drop -Q in favor of --mq only
f786fc4b8764 | 2010-06-29 12:12:34 +0200 | mads: log: follow filenames through renames (issue647)
keramida@kobe:/hg/mercurial/crew$
Solution 2:[2]
To get the description on one line even if original comment contains multiple line combine a splitlines and join function like below:
{join(splitlines(desc), ' ')}
Here is an example i'm using to extract data as CSV:
hg log --template "{node};{date|shortdate};{branch};{author};{join(splitlines(desc), ' ')};{diffstat};files: {join(files, ', ')}\n"
Solution 3:[3]
Just in case anyone wants something similar to git log --oneline:
hg log --template '{rev} {tags} {desc|strip|firstline}\n' -l 5
2737 tip Lint: trailing-whitespace
2736 Hack: temporary auto-subscription on login
2735 Fix: Encoding wasn't passed in memory metrics
Replace {rev} with {node|short} if you want hashes (but in Mercurial revision numbers are traditionally used).
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Giorgos Keramidas |
| Solution 2 | Kevin Beaudoin |
| Solution 3 | nponeccop |
