2012-10-27 50 views
1

使用Python(理想情況下,Python 3)來生成Mercurial修訂版樹的可視化最簡單的方法是什麼?Mercurial修訂版樹的可視化

我猜測它必須通過組合2個庫:一個爲Mercurial存儲庫提供接口,另一個可視化圖形。

用例:我們編寫了一個(純Python)持續集成測試模塊。我們希望它顯示修訂樹,將每個節點標記爲「通過」,「失敗」,「進行中」,「未測試」或沿着這些線的某些內容。

+0

嗯,怎麼樣從Python的'hg glog'解析可視化文件並根據需要標記節點?似乎會節省大量的工作 –

+0

http://mercurial.selenic.com/wiki/HgkExtension – tacaswell

+0

這兩個看起來不錯,謝謝!你可以將它們發佈爲答案嗎?我可能會用gg glog。 – max

回答

1

對於可視化部分,我會檢查出NetworkX。它是一個Python庫,可以讓您執行圖形/網絡處理,導入/導出和可視化。

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在水銀數據獲取(hglib.open('.').log()是一個元組列表,每一個提交)。我使用graphviz進行可視化。沒有圖書館,我只是*打印*該死的東西;-)

我運行該腳本加上graphviz的是這樣的:

python version-dag.py > log.dot ; dot -Tpdf log.dot -o log.pdf 

...然後看看光榮.pdf文件。 Graphviz可以做PNG,EPS和其他格式。 jump字典用於將單親父路徑壓縮到單個節點。享受:)

+0

對我來說並不光彩。給我一個有變化的數字的有向圖。這比hg log更沒用。我錯過了什麼嗎? –

+0

呃,它給你一個分支結構的概述,公平的說法可能不那麼光榮。但是:調整輸出幷包含diffstat數字或連續積分輸出(如果您手邊有數據,例如在文件中)應該是一個小問題。 –

+0

或者至少包含分支名稱? –

相關問題