Skip to content

Commit 5fa4bc3

Browse files
rhtjackiekazil
authored andcommitted
Add script to list unabeled PR's since latest release
1 parent 6bd58df commit 5fa4bc3

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed

maintenance/fetch_unlabeled_prs.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import os
2+
from datetime import datetime
3+
4+
import requests
5+
6+
# Configuration
7+
# Your GitHub Personal Access Token
8+
GITHUB_TOKEN = os.getenv("GITHUB_TOKEN")
9+
if GITHUB_TOKEN is None:
10+
print("Please specify your GitHub Personal Access Token as GITHUB_TOKEN in your .bashrc")
11+
exit()
12+
GITHUB_USERNAME = "projectmesa"
13+
GITHUB_REPO = "mesa"
14+
HEADERS = {"Authorization": f"token {GITHUB_TOKEN}"}
15+
TIMEOUT = 20
16+
17+
18+
def get_latest_release_date() -> str:
19+
"""Fetches the latest release date from the GitHub repository."""
20+
url = (
21+
f"https://api.github.com/repos/{GITHUB_USERNAME}/{GITHUB_REPO}/releases/latest"
22+
)
23+
response = requests.get(url, headers=HEADERS, timeout=TIMEOUT)
24+
response.raise_for_status() # Raises an exception for HTTP error codes
25+
return response.json()["published_at"]
26+
27+
28+
def get_closed_pull_requests_since_latest_release(
29+
latest_release_date,
30+
) -> list[dict[str, any]]:
31+
"""Fetches pull requests created or updated after the latest release date, then filters by merged date."""
32+
pull_requests = []
33+
page = 1
34+
while True:
35+
# Fetch PRs that were created or updated after the latest release date
36+
url = f"https://api.github.com/repos/{GITHUB_USERNAME}/{GITHUB_REPO}/pulls?state=closed&base=main&sort=updated&direction=desc&page={page}"
37+
response = requests.get(url, headers=HEADERS, timeout=TIMEOUT)
38+
response.raise_for_status()
39+
prs = response.json()
40+
if not prs:
41+
break
42+
43+
# Convert latest release date to datetime for comparison
44+
latest_release_datetime = datetime.strptime(
45+
latest_release_date, "%Y-%m-%dT%H:%M:%SZ"
46+
).astimezone()
47+
48+
for pr in prs:
49+
# Convert PR's `updated_at` to datetime for comparison
50+
pr_updated_at = datetime.strptime(
51+
pr["updated_at"], "%Y-%m-%dT%H:%M:%SZ"
52+
).astimezone()
53+
# Stop fetching if PR was updated before the latest release
54+
if pr_updated_at < latest_release_datetime:
55+
return pull_requests
56+
57+
if pr["merged_at"]:
58+
pr_merged_at = datetime.strptime(
59+
pr["merged_at"], "%Y-%m-%dT%H:%M:%SZ"
60+
).astimezone()
61+
if pr_merged_at > latest_release_datetime and not pr["labels"]:
62+
pull_requests.append(pr)
63+
page += 1
64+
return pull_requests
65+
66+
67+
def main() -> None:
68+
# Based on https://github.com/projectmesa/mesa/pull/1917#issuecomment-1871352058
69+
latest_release_date = get_latest_release_date()
70+
pull_requests = get_closed_pull_requests_since_latest_release(latest_release_date)
71+
if len(pull_requests) <= 0:
72+
return
73+
print("These pull requests must be labeled:")
74+
for pr in pull_requests:
75+
print(f" PR #{pr['number']}: {pr['title']} - Merged at: {pr['merged_at']}")
76+
77+
78+
if __name__ == "__main__":
79+
main()

0 commit comments

Comments
 (0)