如何格式化mercurial" hg log"轻松输出可解析的JSON?

时间:2014-11-29 09:50:45

标签: mercurial

我想要一个关于如何使用hg过滤器轻松使用hg log的命令行示例,并将其安全地输出到JSON(包含文件的数组)。

多平台(windows / unix)会很棒。

2 个答案:

答案 0 :(得分:12)

Mercurial内置了对JSON的支持。 您只需使用以下命令即可以JSON格式获取日志输出:

hg log -Tjson

过滤器可以照常使用,要获取文件,可以添加'-v'(详细)参数。

请注意,这是一个相对较新的功能(有关更多详细信息,请参阅wiki),这可能是为什么它尚未明确记录的原因。

也可以使用:

获取xml输出
hg log -Txml

答案 1 :(得分:4)

编辑:此答案适用于任何hg版本。对于较新的hg版本(3.1+),请参阅其他answer ,其性能更高,更简单。

这是一个坚实的oneliner,作为一个例子。

它使用mercurials hg log,并将其输出传递给python oneliner。 hg log template配置为输出有效的python文字。 python oneliner将其转换为JSON。

hg log --date ">2014-10-01" --no-merges --keyword "mantis@1953" --keyword "mantis@1955" --template "[\"{node|short}\",\"{author|user|urlescape}\",\"{date|rfc3339date}\",\"{desc|urlescape}\", [{files % '\"{file}\",'}]]\n" --user marinus --user develop | python -c "import sys,ast,json,urllib; x=[[z[0], urllib.unquote(z[1]).decode('utf8'), z[2], urllib.unquote(z[3]).decode('utf8'), z[4]] for z in [ast.literal_eval(y) for y in sys.stdin.readlines()]]; print(json.dumps(x,indent=2))"

以上示例适用于 unix ,但如果您需要 windows 兼容性,则只需将\"替换为""即可。你想要未格式化的JSON,将'indent'设置为None

python代码是2/3兼容的(任何最新版本),并且不使用任何外部模块。

有关使用过的hg命令的更多说明,请参阅:

hg help log
hg help dates
hg help templates

python代码使用嵌套的list comprehensions,谷歌搜索更多信息。