Get last commit for every file of a file list in Mercurial

独自空忆成欢 提交于 2019-12-24 07:39:12

问题


I have an hg repository and I would like to know the last commit date of every file in sources/php/dracca/endpoint/wiki/**/Wiki*.php

So far, I have this one liner:

find sources/php/dracca/endpoint/wiki/ -name "Wiki*.php" -exec hg log --limit 1 --template "{date|shortdate}" {} \; -exec echo {} \;

But this seems utterly slow as (I suppose) find makes 1 hg call per file, leading to 15seconds of computation for the (say) ~40 files I have in there...

Is there a faster way?

The output of this command looks like:

2019-09-20 sources/php/dracca/endpoint/wiki/characters/colmarr/WikiCharactersColmarrEndpoint.php
2019-09-20 sources/php/dracca/endpoint/wiki/characters/dracquints/allgroup/WikiCharactersDracquintsAllgroupEndpoint.php
...

It might be changed a bit if needed (I won't mind having, say, 1 date and then the list of files changed for that date, or whatever like this)


回答1:


  1. Even with find+exec you can have shorter (by one last exec) chain with modified template {date|shortdate}\n
  2. You can use (accepted) perl-ism from this question or ask anybody to update mentioned lof extension to current Mercurial (code from 2012 will not work now)

Alternatives (dirty ugly hacks)

In any case, you can|have to call hg only once and perform some post-processing of results.

Before these trick, read hg help filesets and get one common fileset for your files (I suppose, it can be just set:sources/php/dracca/endpoint/wiki/**/Wiki*.php but TBT!)

After it, you can:

  • Perform hg log like this

    hg log setup.* --template "{files % '{file} {rev} {date|shortdate}\n'}"

(I used simple pattern for test, you have to have own fileset)

get output in such form

setup.py 1163 2018-11-07
README.md 1162 2018-11-07
setup.py 1162 2018-11-07
hggit/git_handler.py 1124 2018-05-01
setup.py 1124 2018-05-01
setup.cfg 1118 2017-11-27
setup.py 1117 2017-11-27
hggit/git2hg.py 1111 2017-11-27
hggit/overlay.py 1111 2017-11-27
setup.py 1111 2017-11-27
…

(there are some unwanted unexpected files, because I out all files in revision, which affect file in interest, without filter). You have to grep only needed files, sort by cols 1+2 and use date of latest revision of each file

  • Use hg grep. For the above test-pattern

    hg grep "." -I setup.* --files-with-matches -d -q

(find any changes, output only filename+revision, short date)

you'll get something like

setup.py:1163:2018-11-07
setup.cfg:1118:2017-11-27

and 3-rd column will be your needed last modification date of file



来源:https://stackoverflow.com/questions/58068809/get-last-commit-for-every-file-of-a-file-list-in-mercurial

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!