* Add release note for 1.3.0 * Address reviewer's comment * Fix silly mistake * Apply suggestions from code review Co-authored-by: John Zedlewski <904524+JohnZed@users.noreply.github.com> Co-authored-by: John Zedlewski <904524+JohnZed@users.noreply.github.com>
75 lines
2.8 KiB
Python
75 lines
2.8 KiB
Python
"""Query list of all contributors and reviewers in a release"""
|
|
|
|
from sh.contrib import git
|
|
import sys
|
|
import re
|
|
import requests
|
|
import json
|
|
|
|
if len(sys.argv) != 5:
|
|
print(f'Usage: {sys.argv[0]} [starting commit/tag] [ending commit/tag] [GitHub username] ' +
|
|
'[GitHub password]')
|
|
sys.exit(1)
|
|
|
|
from_commit = sys.argv[1]
|
|
to_commit = sys.argv[2]
|
|
username = sys.argv[3]
|
|
password = sys.argv[4]
|
|
|
|
contributors = set()
|
|
reviewers = set()
|
|
|
|
def paginate_request(url, callback):
|
|
r = requests.get(url, auth=(username, password))
|
|
assert r.status_code == requests.codes.ok, f'Code: {r.status_code}, Text: {r.text}'
|
|
callback(json.loads(r.text))
|
|
while 'next' in r.links:
|
|
r = requests.get(r.links['next']['url'], auth=(username, password))
|
|
callback(json.loads(r.text))
|
|
|
|
for line in git.log(f'{from_commit}..{to_commit}', '--pretty=format:%s', '--reverse', '--first-parent'):
|
|
m = re.search('\(#([0-9]+)\)$', line.rstrip())
|
|
if m:
|
|
pr_id = m.group(1)
|
|
print(f'PR #{pr_id}')
|
|
|
|
def process_commit_list(commit_list):
|
|
try:
|
|
contributors.update([commit['author']['login'] for commit in commit_list])
|
|
except TypeError:
|
|
prompt = (f'Error fetching contributors for PR #{pr_id}. Enter it manually, ' +
|
|
'as a space-separated list: ')
|
|
contributors.update(str(input(prompt)).split(' '))
|
|
def process_review_list(review_list):
|
|
reviewers.update([x['user']['login'] for x in review_list])
|
|
def process_comment_list(comment_list):
|
|
reviewers.update([x['user']['login'] for x in comment_list])
|
|
|
|
paginate_request(f'https://api.github.com/repos/dmlc/xgboost/pulls/{pr_id}/commits',
|
|
process_commit_list)
|
|
paginate_request(f'https://api.github.com/repos/dmlc/xgboost/pulls/{pr_id}/reviews',
|
|
process_review_list)
|
|
paginate_request(f'https://api.github.com/repos/dmlc/xgboost/issues/{pr_id}/comments',
|
|
process_comment_list)
|
|
|
|
print('Contributors: ', end='')
|
|
for x in sorted(contributors):
|
|
r = requests.get(f'https://api.github.com/users/{x}', auth=(username, password))
|
|
assert r.status_code == requests.codes.ok, f'Code: {r.status_code}, Text: {r.text}'
|
|
user_info = json.loads(r.text)
|
|
if user_info['name'] is None:
|
|
print(f"@{x}, ", end='')
|
|
else:
|
|
print(f"{user_info['name']} (@{x}), ", end='')
|
|
|
|
print('\nReviewers: ', end='')
|
|
for x in sorted(reviewers):
|
|
r = requests.get(f'https://api.github.com/users/{x}', auth=(username, password))
|
|
assert r.status_code == requests.codes.ok, f'Code: {r.status_code}, Text: {r.text}'
|
|
user_info = json.loads(r.text)
|
|
if user_info['name'] is None:
|
|
print(f"@{x}, ", end='')
|
|
else:
|
|
print(f"{user_info['name']} (@{x}), ", end='')
|
|
print('')
|