使用Python(理想情況下,Python 3)來生成Mercurial修訂版樹的可視化最簡單的方法是什麼?Mercurial修訂版樹的可視化
我猜測它必須通過組合2個庫:一個爲Mercurial存儲庫提供接口,另一個可視化圖形。
用例:我們編寫了一個(純Python)持續集成測試模塊。我們希望它顯示修訂樹,將每個節點標記爲「通過」,「失敗」,「進行中」,「未測試」或沿着這些線的某些內容。
使用Python(理想情況下,Python 3)來生成Mercurial修訂版樹的可視化最簡單的方法是什麼?Mercurial修訂版樹的可視化
我猜測它必須通過組合2個庫:一個爲Mercurial存儲庫提供接口,另一個可視化圖形。
用例:我們編寫了一個(純Python)持續集成測試模塊。我們希望它顯示修訂樹,將每個節點標記爲「通過」,「失敗」,「進行中」,「未測試」或沿着這些線的某些內容。
對於可視化部分,我會檢查出NetworkX。它是一個Python庫,可以讓您執行圖形/網絡處理,導入/導出和可視化。
在這裏,有我的腳本:
#!/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在水銀數據獲取(hglib.open('.').log()
是一個元組列表,每一個提交)。我使用graphviz進行可視化。沒有圖書館,我只是*打印*該死的東西;-)
我運行該腳本加上graphviz的是這樣的:
python version-dag.py > log.dot ; dot -Tpdf log.dot -o log.pdf
...然後看看光榮.pdf文件。 Graphviz可以做PNG,EPS和其他格式。 jump
字典用於將單親父路徑壓縮到單個節點。享受:)
對我來說並不光彩。給我一個有變化的數字的有向圖。這比hg log更沒用。我錯過了什麼嗎? –
呃,它給你一個分支結構的概述,公平的說法可能不那麼光榮。但是:調整輸出幷包含diffstat數字或連續積分輸出(如果您手邊有數據,例如在文件中)應該是一個小問題。 –
或者至少包含分支名稱? –
嗯,怎麼樣從Python的'hg glog'解析可視化文件並根據需要標記節點?似乎會節省大量的工作 –
http://mercurial.selenic.com/wiki/HgkExtension – tacaswell
這兩個看起來不錯,謝謝!你可以將它們發佈爲答案嗎?我可能會用gg glog。 – max