2012-06-06 2 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

Поскольку это, видимо, на TODO для в то время как лет и иным образом недоступны, я написал свой собственный 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') 
Смежные вопросы