diff options
author | 2012-04-07 21:00:42 +0200 | |
---|---|---|
committer | 2012-04-07 21:00:42 +0200 | |
commit | 93187ea30a0c5e1b41dc528c0db2aaac0edea8f8 (patch) | |
tree | fcb2224c911367852cb4da3e02a4fc941e6f2c75 /pypy/doc/tool/makecontributor.py | |
parent | a script to update the contributors list (diff) | |
download | pypy-93187ea30a0c5e1b41dc528c0db2aaac0edea8f8.tar.gz pypy-93187ea30a0c5e1b41dc528c0db2aaac0edea8f8.tar.bz2 pypy-93187ea30a0c5e1b41dc528c0db2aaac0edea8f8.zip |
be advanced: try hard to parse the pair programming markers in commit logs, and count them in the commit count :-)
Diffstat (limited to 'pypy/doc/tool/makecontributor.py')
-rw-r--r-- | pypy/doc/tool/makecontributor.py | 129 |
1 files changed, 99 insertions, 30 deletions
diff --git a/pypy/doc/tool/makecontributor.py b/pypy/doc/tool/makecontributor.py index e314727d9b..00d101e444 100644 --- a/pypy/doc/tool/makecontributor.py +++ b/pypy/doc/tool/makecontributor.py @@ -8,50 +8,119 @@ import mercurial.ui ROOT = py.path.local(__file__).join('..', '..', '..', '..') author_re = re.compile('(.*) <.*>') - -excluded = set(["pypy" "convert-repo"]) +pair_programming_re = re.compile(r'^\((.*?)\)') +excluded = set(["pypy", "convert-repo"]) alias = { - 'arigo': 'Armin Rigo', - 'lac': 'Laura Creighton', - 'fijal': 'Maciej Fijalkowski', - 'tismer@christia-wjtqxl.localdomain': 'Christian Tismer', - 'holger krekel': 'Holger Krekel', - 'hager': 'Sven Hager', - 'mattip': 'Matti Picus', - 'mattip>': 'Matti Picus', - 'matthp': 'Matti Picus', - 'Matti Picus matti.picus@gmail.com': 'Matti Picus', - 'edelsohn': 'David Edelsohn', - 'edelsoh': 'David Edelsohn', - 'l.diekmann': 'Lukas Diekmann', - 'ldiekmann': 'Lukas Diekmann', - 'aliles': 'Aaron Iles', - 'mikefc': 'Michael Cheng', - 'cocoatomo': 'Tomo Cocoa', - 'roberto@goyle': 'Roberto De Ioris', - 'roberto@mrspurr': 'Roberto De Ioris', - 'landtuna@gmail.com': 'Jim Hunziker', - 'kristjan@kristjan-lp.ccp.ad.local': 'Kristjan Valur Jonsson', + 'Anders Chrigstrom': ['arre'], + 'Antonio Cuni': ['antocuni', 'anto'], + 'Armin Rigo': ['arigo', 'arfigo', 'armin', 'arigato'], + 'Maciej Fijalkowski': ['fijal'], + 'Carl Friedrich Bolz': ['cfbolz', 'cf'], + 'Samuele Pedroni': ['pedronis', 'samuele', 'samule'], + 'Michael Hudson': ['mwh'], + 'Holger Krekel': ['hpk', 'holger krekel', 'holger', 'hufpk'], + "Amaury Forgeot d'Arc": ['afa'], + 'Alex Gaynor': ['alex', 'agaynor'], + 'David Schneider': ['bivab', 'david'], + 'Christian Tismer': ['chris', 'christian', 'tismer', + 'tismer@christia-wjtqxl.localdomain'], + 'Benjamin Peterson': ['benjamin'], + 'Hakan Ardo': ['hakan', 'hakanardo'], + 'Niklaus Haldimann': ['nik'], + 'Alexander Schremmer': ['xoraxax'], + 'Anders Hammarquist': ['iko'], + 'David Edelsohn': ['edelsoh', 'edelsohn'], + 'Niko Matsakis': ['niko'], + 'Jakub Gustak': ['jlg'], + 'Guido Wesdorp': ['guido'], + 'Michael Foord': ['mfoord'], + 'Mark Pearse': ['mwp'], + 'Toon Verwaest': ['tverwaes'], + 'Eric van Riet Paap': ['ericvrp'], + 'Jacob Hallen': ['jacob', 'jakob'], + 'Anders Lehmann': ['ale', 'anders'], + 'Bert Freudenberg': ['bert'], + 'Boris Feigin': ['boris', 'boria'], + 'Valentino Volonghi': ['valentino', 'dialtone'], + 'Aurelien Campeas': ['aurelien', 'aureliene'], + 'Adrien Di Mascio': ['adim'], + 'Jacek Generowicz': ['Jacek', 'jacek'], + 'Jim Hunziker': ['landtuna@gmail.com'], + 'Kristjan Valur Jonsson': ['kristjan@kristjan-lp.ccp.ad.local'], + 'Laura Creighton': ['lac'], + 'Aaron Iles': ['aliles'], + 'Ludovic Aubry': ['ludal', 'ludovic'], + 'Lukas Diekmann': ['l.diekmann', 'ldiekmann'], + 'Matti Picus': ['Matti Picus matti.picus@gmail.com', + 'matthp', 'mattip', 'mattip>'], + 'Michael Cheng': ['mikefc'], + 'Richard Emslie': ['rxe'], + 'Roberto De Ioris': ['roberto@goyle'], + 'Roberto De Ioris': ['roberto@mrspurr'], + 'Sven Hager': ['hager'], + 'Tomo Cocoa': ['cocoatomo'], } +alias_map = {} +for name, nicks in alias.iteritems(): + for nick in nicks: + alias_map[nick] = name + def get_canonical_author(name): match = author_re.match(name) if match: name = match.group(1) - return alias.get(name, name) + return alias_map.get(name, name) + +ignored_nicknames = defaultdict(int) + +def get_more_authors(log): + match = pair_programming_re.match(log) + if not match: + return set() + ignore_words = ['around', 'consulting', 'yesterday', 'for a bit', 'thanks', + 'in-progress', 'bits of', 'even a little', 'floating',] + sep_words = ['and', ';', '+', '/', 'with special by'] + nicknames = match.group(1) + for word in ignore_words: + nicknames = nicknames.replace(word, '') + for word in sep_words: + nicknames = nicknames.replace(word, ',') + nicknames = [nick.strip().lower() for nick in nicknames.split(',')] + authors = set() + for nickname in nicknames: + author = alias_map.get(nickname) + if not author: + ignored_nicknames[nickname] += 1 + else: + authors.add(author) + return authors def main(show_numbers): ui = mercurial.ui.ui() repo = mercurial.localrepo.localrepository(ui, str(ROOT)) - authors = defaultdict(int) + authors_count = defaultdict(int) for i in repo: ctx = repo[i] - author = get_canonical_author(ctx.user()) - if author not in excluded: - authors[author] += 1 - # - items = authors.items() + authors = set() + authors.add(get_canonical_author(ctx.user())) + authors.update(get_more_authors(ctx.description())) + for author in authors: + if author not in excluded: + authors_count[author] += 1 + + # uncomment the next lines to get the list of nicknamed which could not be + # parsed from commit logs + ## items = ignored_nicknames.items() + ## items.sort(key=operator.itemgetter(1), reverse=True) + ## for name, n in items: + ## if show_numbers: + ## print '%5d %s' % (n, name) + ## else: + ## print name + + items = authors_count.items() items.sort(key=operator.itemgetter(1), reverse=True) for name, n in items: if show_numbers: |