我想要一个关于如何使用hg过滤器轻松使用hg log
的命令行示例,并将其安全地输出到JSON(包含文件的数组)。
多平台(windows / unix)会很棒。
答案 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
,谷歌搜索更多信息。