mirror of
https://github.com/freedomofpress/dangerzone.git
synced 2025-04-29 10:12:38 +02:00
Add a script to help generate release notes from merged pull requests
This commit is contained in:
parent
5ed4a048a0
commit
d30a4348a6
1 changed files with 67 additions and 0 deletions
67
dev_scripts/generate-release-notes.py
Normal file
67
dev_scripts/generate-release-notes.py
Normal file
|
@ -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()
|
Loading…
Reference in a new issue