Skip to content

Commit 8f1d44b

Browse files
committed
Add script to list unabeled PR's since latest release
1 parent 3bafa14 commit 8f1d44b

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed

maintenance/fetch_unlabeled_prs.py

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

0 commit comments

Comments
 (0)