| 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 | |
| | 37 | def 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 | |
| | 46 | def 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 | |
| | 59 | def 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 | |
| | 77 | if __name__ == "__main__": |
| | 78 | main() |