aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonio Cuni <anto.cuni@gmail.com>2012-04-07 21:00:42 +0200
committerAntonio Cuni <anto.cuni@gmail.com>2012-04-07 21:00:42 +0200
commit93187ea30a0c5e1b41dc528c0db2aaac0edea8f8 (patch)
treefcb2224c911367852cb4da3e02a4fc941e6f2c75 /pypy/doc/tool/makecontributor.py
parenta script to update the contributors list (diff)
downloadpypy-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.py129
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: