使用Python(理想情况下,Python 3)生成Mercurial修订树可视化的最简单方法是什么?
我猜测它必须通过组合2个库:一个提供Mercurial存储库的接口,一个可视化图形。
用例:我们编写了一个(纯Python)持续集成测试模块。我们希望它显示修订树,将每个节点标记为“已通过”,“失败”,“正在进行中”,“未经过测试”或沿着这些行显示。
答案 0 :(得分:1)
对于可视化部分,我会查看NetworkX。它是一个Python库,允许您进行图形/网络处理,导入/导出和可视化。
答案 1 :(得分:1)
在这里,有我的脚本:
#!/usr/bin/env python
from itertools import chain
import hglib
#from pygraphviz import *
repo = hglib.open('.')
log = dict((t[0], t) for t in repo.log())
def graph(): return dict((v, []) for v in log)
forward, backward, jump = (graph() for i in range(3))
for target in log:
for parent in repo.parents(target) or []:
source = parent[0]
forward[source].append(target)
backward[target].append(source)
def endpoint(v):
if len(forward[v]) != 1: return True
if len(backward[forward[v][0]]) != 1: return True
if len(backward[v]) != 1: return True
if len(forward[backward[v][0]]) != 1: return True
for v in forward:
if endpoint(v):
w = v
while len(forward[w]) == 1 == len(backward[forward[w][0]]):
w = forward[w][0]
jump[v] = w
else: del jump[v]
def vertex(tupl): return 'v' + tupl[1][:5]
print 'digraph {'
colors = ['red', 'green', 'blue', 'yellow', 'cyan', 'magenta',
'orange', 'chartreuse']
authors = dict()
for v in sorted(forward, key=int):
if not endpoint(v) or v not in jump: continue
node = 'v%s' % v
if jump[v] != v:
sep = '+' if forward[v] == jump[v] else '::'
label = '%s%s%s' % (v, sep, jump[v])
assert int(jump[v]) > int(v)
v = jump[v]
del jump[v]
else:
label = v
author = log[v][4]
print '// %s' % author
if author not in authors: authors[author] = colors[len(authors) %
len(colors)]
attrs = dict(color=authors[author], label=label, style='bold').items()
print '\t%s [%s]' % (node, ','.join('%s="%s"' % kv for kv in attrs))
for w in forward[v]: print '\t%s -> v%s' % (node, w)
print '}'
正如您所知,我使用hglib来获取Mercurial数据(hglib.open('.').log()
是一个元组列表,每次提交一个)。我使用graphviz进行可视化。没有图书馆,我只是*打印*该死的东西; - )
我像这样运行脚本加graphviz:
python version-dag.py > log.dot ; dot -Tpdf log.dot -o log.pdf
...然后查看光荣的.pdf文件。 Graphviz可以执行png,eps和其他格式。 jump
字典用于压缩单父节点到单个节点。享受:)