trainer/docs/release/changelog.py

73 lines
2.3 KiB
Python

import argparse
from github import Github
REPO_NAME = "kubeflow/trainer"
CHANGELOG_FILE = "CHANGELOG.md"
parser = argparse.ArgumentParser()
parser.add_argument("--token", type=str, help="GitHub Access Token")
parser.add_argument(
"--range", type=str, help="Changelog is generated for this release range"
)
args = parser.parse_args()
if args.token is None:
raise Exception("GitHub Token must be set")
try:
previous_release = args.range.split("..")[0]
current_release = args.range.split("..")[1]
except Exception:
raise Exception("Release range must be set in this format: v1.7.0..v1.8.0")
# Get list of commits from the range.
github_repo = Github(args.token).get_repo(REPO_NAME)
comparison = github_repo.compare(previous_release, current_release)
commits = comparison.commits
# The latest commit contains the release date.
release_date = str(commits[-1].commit.author.date).split(" ")[0]
release_url = "https://github.com/{}/tree/{}".format(REPO_NAME, current_release)
# Get all PRs in reverse chronological order from the commits.
pr_list = ""
pr_set = set()
for commit in reversed(commits):
# Only add commits with PRs.
for pr in commit.get_pulls():
# Each PR is added only one time to the list.
if pr.number in pr_set:
continue
pr_set.add(pr.number)
new_pr = "- {title} ([#{id}]({pr_link}) by [@{user_id}]({user_url}))\n".format(
title=pr.title,
id=pr.number,
pr_link=pr.html_url,
user_id=pr.user.login,
user_url=pr.user.html_url,
)
pr_list += new_pr
change_log = [
"# Changelog" "\n\n",
"# [{}]({}) ({})".format(current_release, release_url, release_date),
"\n\n",
"## TODO: Group PRs into Breaking Changes, New Features, Bug fixes, Misc, etc. "
+ "For example: [v1.7.0](https://github.com/kubeflow/trainer/releases/tag/v1.7.0)",
"\n\n",
pr_list,
"\n" "[Full Changelog]({})\n".format(comparison.html_url),
]
# Update Changelog with the new changes.
with open(CHANGELOG_FILE, "r+") as f:
lines = f.readlines()
f.seek(0)
lines = lines[0:0] + change_log + lines[1:]
f.writelines(lines)
print("Changelog has been updated\n")
print("Group PRs in the Changelog into Features, Bug fixes, Misc, etc.\n")
print("After that, submit a PR with the updated Changelog")