Two things were off: 1. sorting should be case-insensitive, in both places 2. multiple entries can be added just before the same line
117 lines
4.2 KiB
Python
Executable File
117 lines
4.2 KiB
Python
Executable File
#!/usr/bin/python2
|
|
"""Update the contributor list
|
|
|
|
Alias handling is done by git with .mailmap
|
|
New contributors are merged in the short-term list.
|
|
Moving them to a "higher" list should be a manual process.
|
|
"""
|
|
|
|
import fileinput
|
|
from subprocess import Popen, PIPE
|
|
|
|
def format_contributor(contributor):
|
|
return " * {0} {1}".format(
|
|
" ".join(contributor["name"]),
|
|
contributor["email"])
|
|
|
|
|
|
def main():
|
|
# generate list of contributors
|
|
contributors = []
|
|
p_git = Popen(["git", "shortlog", "-se"], stdout=PIPE)
|
|
for line in p_git.stdout:
|
|
contributors.append({
|
|
'count': int(line.split("\t")[0].strip()),
|
|
'name': line.split("\t")[1].split()[0:-1],
|
|
'email': line.split("\t")[1].split()[-1]
|
|
})
|
|
|
|
# cache listed contributors
|
|
old_contributors = []
|
|
with open("CONTRIBUTORS.rst", "r") as contrib_file:
|
|
for line in contrib_file:
|
|
if "@" in line:
|
|
old_contributors.append({
|
|
'name': line.split()[1:-1],
|
|
'email': line.split()[-1]
|
|
})
|
|
|
|
old = map(lambda x: (x['name'], x['email']), old_contributors)
|
|
old_emails = map(lambda x: x['email'], old_contributors)
|
|
old_names = map(lambda x: x['name'], old_contributors)
|
|
|
|
# check which contributors are new
|
|
new_contributors = []
|
|
update_mailmap = False
|
|
for contributor in contributors:
|
|
if (contributor['name'], contributor['email']) in old:
|
|
# this exact combination already in the list
|
|
pass
|
|
elif (contributor['email'] not in old_emails
|
|
and contributor['name'] not in old_names):
|
|
# name AND email are not in the list
|
|
new_contributors.append(contributor)
|
|
elif contributor['email'] in old_emails:
|
|
# email is listed, but with another name
|
|
old_name = filter(lambda x: x['email'] == contributor['email'],
|
|
old_contributors)[0]['name']
|
|
print "new alias %s for %s %s ?" % (
|
|
" ".join(contributor['name']),
|
|
" ".join(old_name),
|
|
contributor['email'])
|
|
update_mailmap = True
|
|
elif contributor['name'] in old_names:
|
|
# probably a new email for a previous contributor
|
|
other_mail = filter(lambda x: x['name'] == contributor['name'],
|
|
old_contributors)[0]['email']
|
|
print "new email %s for %s %s ?" % (
|
|
contributor['email'],
|
|
" ".join(contributor['name']),
|
|
other_mail)
|
|
update_mailmap = True
|
|
if update_mailmap:
|
|
print "Please update .mailmap"
|
|
|
|
# sort on the last word of the name
|
|
new_contributors = sorted(new_contributors,
|
|
key=lambda x: x['name'][-1].lower())
|
|
|
|
# show new contributors to be merged to the list
|
|
if new_contributors:
|
|
print "inserting:"
|
|
for contributor in new_contributors:
|
|
print format_contributor(contributor)
|
|
|
|
# merge with alphabetical (by last part of name) contributor list
|
|
i = 0
|
|
short_term_found = False
|
|
for line in fileinput.input("CONTRIBUTORS.rst", inplace=1):
|
|
if not short_term_found:
|
|
print line,
|
|
if "Short-term" in line:
|
|
short_term_found = True
|
|
else:
|
|
if i >= len(new_contributors) or "@" not in line:
|
|
print line,
|
|
else:
|
|
listed_name = line.split()[-2].lower()
|
|
contributor = new_contributors[i]
|
|
# insert all new contributors that fit here
|
|
while listed_name > contributor["name"][-1].lower():
|
|
print format_contributor(contributor)
|
|
i += 1
|
|
if i < len(new_contributors):
|
|
contributor = new_contributors[i]
|
|
else:
|
|
break
|
|
print line,
|
|
# append remaining contributors
|
|
with open("CONTRIBUTORS.rst", "a") as contrib_file:
|
|
while i < len(new_contributors):
|
|
contrib_file.write(format_contributor(new_contributors[i]) + "\n")
|
|
i += 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|