Search code examples
mercurial

Mercurial: Most recent change per file


I'm looking for a way to make Mercurial output a table like this:

File        Most recent revision changing the file          Date of that revision
====        ======================================          =====================
foo.py      44159adb0312                                    2018-09-16 12:24
...         ...                                             ...

This is just like github does it on the "Code" overview page. (screenshot from torvalds/linux): screenshot github

"Most recent" could refer the date or to the DAG hierarchy relative to the current changeset, or maybe to the current branch. Perhaps the latter is more useful, but in my particular use case, it doesn't make a difference.

I'd also like to be able to provide a list of files or a subdirectory for which I want the table. (I don't necessarily want it for everything)

I am aware that I could do it using a small script, looping over hg log -l 1 <file>, but I was wondering if there is a more efficient / more natural solution.


Solution

  • You won't get around looping over all files. Yet with hg manifest you get that list of files. Then template the output as needed:

    for f in $(hg ma); do hg log -l1 $f -T"$f\t\t{rev}:{node|short}\t\t{date|isodate}"; done
    

    This gives output like

    .hgignore               38289:f9c426385853              2018-06-09 13:34 +0900
    .hgsigs         38289:f9c426385853              2018-06-09 13:34 +0900
    .hgtags         38289:f9c426385853              2018-06-09 13:34 +0900
    

    You might want to twiddle more with the output formatting. See the mercurial wiki for a complete overview of output templating.