From d30a4348a665f8827b4d17ebfbdbe51adf6e7e7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20M=C3=A9taireau?= Date: Tue, 29 Oct 2024 22:37:14 +0100 Subject: [PATCH] Add a script to help generate release notes from merged pull requests --- dev_scripts/generate-release-notes.py | 67 +++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 dev_scripts/generate-release-notes.py diff --git a/dev_scripts/generate-release-notes.py b/dev_scripts/generate-release-notes.py new file mode 100644 index 0000000..463b123 --- /dev/null +++ b/dev_scripts/generate-release-notes.py @@ -0,0 +1,67 @@ +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()