Changeset 368:39d742579105

Show
Ignore:
Timestamp:
08/24/08 09:36:47 (3 months ago)
Author:
Christos Trochalakis <yatiohi@…>
Branch:
default
Message:

hg-shortlog.py respects .mailmap file + .mailmap

Files:
1 added
1 modified

Legend:

Unmodified
Added
Removed
  • devel-docs/hg-shortlog.py

    r367 r368  
    22# Produces shortlog from hg log output. 
    33# 
    4 # hg log --template "{author|person}\t{desc|firstline}\n" 
     4# hg log --template "{author|person}\t{author|email}\t{desc|firstline}\n" 
    55# 
    6 # e.x. Dimitris Glezos<tab>Contributions by Silvio Pierro 
     6# e.x.  
     7# Dimitris Glezos<tab>dimitris@glezos.com<tab>Contributions by Silvio Pierro 
    78# 
    89import re 
    910import sys 
    1011from collections import defaultdict 
     12from optparse import OptionParser 
    1113 
    12 log_re = re.compile('^(?P<name>.*)\t(?P<msg>.*)$') 
     14log_re = re.compile('^(?P<name>.*)\t(?P<email>.*)\t(?P<msg>.*)$') 
    1315 
    14 commit_map = defaultdict(list) 
    1516 
    16 for line in sys.stdin.xreadlines(): 
    17     m = log_re.match(line) 
    18     if m: 
    19         commit_map[m.group('name')].append(m.group('msg')) 
     17def read_mailmap(filename): 
     18    """ 
     19    Reads mailmap file 
     20    Returns {<email>:<name>} dict 
     21    """ 
     22    mailmap_re = re.compile('^(?P<name>.*) \<(?P<email>.*)\>') 
     23    mailmap = {} 
    2024 
    21 for person, commits in commit_map.iteritems(): 
    22     print '%s (%s):' % (person, len(commits)) 
    23     for commit in commits: 
    24         print '\t%s' % commit 
     25    f = open(filename,'r') 
     26    try: 
     27        for line in f: 
     28            if line.startswith('#'): 
     29                continue 
     30            m = mailmap_re.match(line) 
     31            if m: 
     32                mailmap[m.group('email')] = m.group('name') 
     33    finally: 
     34        f.close() 
     35    return mailmap 
     36 
     37def log(): 
     38    """ Yields (name, email, msg) from stdin""" 
     39 
     40    for line in sys.stdin: 
     41        m = log_re.match(line) 
     42        if m: 
     43            g = m.group 
     44            yield g('name'), g('email'), g('msg') 
     45 
     46def get_commit_map(mailmap={}): 
     47    """ 
     48    Returns {<Full Name> : [<msg1>, <msg2>]} dict 
     49    """ 
     50    commit_map = defaultdict(list) 
     51     
     52    for name, email, msg in log(): 
     53        # search mailmap for the email. Use name if you don't find it 
     54        name = mailmap.get(email, name) 
     55        commit_map[name].append(msg) 
     56    return commit_map 
     57 
     58 
     59def main(): 
     60    parser = OptionParser() 
     61 
     62    parser.add_option('-m', '--mailmap', default='.mailmap', dest='mailmap', 
     63        help="Use mailmap file") 
     64    parser.add_option('-n', '--no-mailmap', action='store_false', dest='mailmap', 
     65        help="Don't use mailmap") 
     66    (options, args) = parser.parse_args() 
     67 
     68    if options.mailmap: 
     69        options.mailmap = read_mailmap(options.mailmap) 
     70    commit_map = get_commit_map(mailmap=options.mailmap or {}) 
     71 
     72    for person, commits in commit_map.iteritems(): 
     73        print '%s (%s):' % (person, len(commits)) 
     74        for commit in commits: 
     75            print '\t%s' % commit 
     76 
     77if __name__ == "__main__": 
     78    main()