dangerzone/dev_scripts/generate-release-notes.py

67 lines
1.7 KiB
Python

import sys
import requests
REPOSITORY = "https://github.com/freedomofpress/dangerzone/"
TEMPLATE = "- {title} ([#{number}]({url}))"
def get_prs_since_last_release(owner, repo):
session = requests.Session()
session.headers["Accept"] = "application/vnd.github.v3+json"
# Try to get latest release
response = session.get(
f"https://api.github.com/repos/{owner}/{repo}/releases/latest"
)
since = None
if response.ok:
since = response.json()["published_at"]
# Get merged PRs
response = session.get(
f"https://api.github.com/repos/{owner}/{repo}/pulls",
params={
"state": "closed",
"sort": "updated",
"direction": "desc",
"per_page": 100,
},
)
response.raise_for_status()
prs = []
for pr in response.json():
if not pr["merged_at"]:
continue
if since and pr["merged_at"] <= since:
break
prs.append(
TEMPLATE.format(title=pr["title"], number=pr["number"], url=pr["html_url"])
)
return prs
def main():
try:
url_path = REPOSITORY.rstrip("/").split("github.com/")[1]
owner, repo = url_path.split("/")[-2:]
except (ValueError, IndexError):
print("Error: Invalid GitHub URL", file=sys.stderr)
sys.exit(1)
try:
notes = get_prs_since_last_release(owner, repo)
print("\n".join(notes))
except requests.exceptions.HTTPError as e:
print(f"Error: {e.response.json().get('message', str(e))}", file=sys.stderr)
sys.exit(1)
except Exception as e:
print(f"Error: {e}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()