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()