2012-06-06 31 views
2

在我們的構建腳本中,我使用模板化的hg log命令獲取特定構建的更改列表。這很好,但不幸的是它不包括subrepos中的更改(我們有超過10個)。我也想包括他們,但似乎沒有這樣的命令。包含子庫的Mercurial存儲庫日誌

我想編寫一個腳本:

  1. 枚舉在啓動修訂.hgsubstate文件
  2. 找出subrepos和他們的首發版本
  3. 奔跑hg log他們
  4. 按日期合併並分類結果。

還有其他更簡單的方法嗎?也許我錯過了一個命令?

+2

參見[這個問題] (http://stackoverflow.com/q/5757511/800151),它解決了這個問題,如果不是重複的話。此外,請注意合併日誌[在Hg Todo列表中](http://mercurial.selenic.com/wiki/SubrepoWork#log)。 –

回答

0

因爲它是顯然的待辦事項爲 ,而 和不可用,我寫我自己subtools.py

from __future__ import print_function 
import hglib 
import os 
import sys 

def get_substate(client, rev=None): 
    substate_filename = os.path.join(client.root(), '.hgsubstate') 
    if os.path.isfile(substate_filename): 
     lines = client.cat([substate_filename], rev).split('\n') 
     return { key : value for (value,key) in [ line.split() for line in lines if line ]} 
    else: 
     return {} 


def substate_diff(client, revA, revB): 
    substate_a = get_substate(client, revA) 
    substate_b = get_substate(client, revB) 
    key_union = set(substate_b) | set(substate_a) 

    diff = {} 
    for key in key_union: 
     diff[key] = (substate_a[key], substate_b[key]) 

    return diff 

def recursive_log(path, revA, revB): 
    logtree = { 'logs': [], 'subrepos': {}} 

    try: 
     client = hglib.open(path) 
    except: 
     return logtree 

    if revA == revB: 
     print("no changes on {}".format(client.root())) 
     return logtree 

    print("Checking {} between {} and {}...".format(client.root(), revA, revB)) 

    for key, revisions in substate_diff(client, revA, revB).iteritems(): 
     if revisions[0] and revisions[1]: 
      logtree['subrepos'][key] = recursive_log(os.path.join(client.root(),key), revisions[0], revisions[1]) 
     elif revisions[0] and not revisions[1]: 
      print("removed subrepo with path: %s"%key, file=sys.stderr) 
     elif revisions[1] and not revisions[2]: 
      print("added subrepo with path: %s"%key, file=sys.stderr) 

    logtree['logs'] = client.log("%s:%s"%(revA,revB)) 
    return logtree 

用作這樣的:

In [15]: log = subtools.recursive_log('./', '947', '951')