# Get github issues / PR for a release # Exec with "python github_release_notes.py YOUR_GITHUB_API_ACCESS_TOKEN 4.7.1" from github import Github from collections import Counter import sys TARGETS = ['csharp', 'cpp', 'go', 'java', 'javascript', 'python2', 'python3', 'swift', 'php', 'dart'] TOKEN=sys.argv[1] MILESTONE=sys.argv[2] g = Github(login_or_token=TOKEN) # Then play with your Github objects: org = g.get_organization("antlr") repo = org.get_repo("antlr4") milestone = [x for x in repo.get_milestones() if x.title==MILESTONE] milestone = milestone[0] issues = repo.get_issues(state="closed", milestone=milestone, sort="created", direction="desc") # dump bugs fixed print() print("## Issues fixed") for x in issues: labels = [l.name for l in x.labels] if x.pull_request is None and not ("type:improvement" in labels or "type:feature" in labels): print("* [%s](%s) (%s)" % (x.title, x.html_url, ", ".join([l.name for l in x.labels]))) # dump improvements closed for this release (issues or pulls) print() print("## Improvements, features") for x in issues: labels = [l.name for l in x.labels] if ("type:improvement" in labels or "type:feature" in labels): print("* [%s](%s) (%s)" % (x.title, x.html_url, ", ".join(labels))) # dump PRs closed for this release by target print() print("## Pull requests grouped by target") for target in TARGETS: print() print(f"### {target} target") for x in issues: labels = [l.name for l in x.labels] if x.pull_request is not None and f"target:{target}" in labels: print("* [%s](%s) (%s)" % (x.title, x.html_url, ", ".join(labels))) # dump contributors print() print("## Contributors") user_counts = Counter([x.user.login for x in issues]) users = {x.user.login:x.user for x in issues} for login,count in user_counts.most_common(10000): name = users[login].name logins = f" ({users[login].login})" if name is None: name = users[login].login logins = "" print(f"* {count:3d} items: [{name}]({users[login].html_url}){logins}")