Torjus Håkestad 9ee3ec2018
All checks were successful
test / test (pull_request) Successful in 53s
build / build (pull_request) Successful in 2m11s
Add title to pr command output
2024-10-07 16:02:45 +02:00

92 lines
3.2 KiB
Python

import requests
from pydantic import BaseModel
DEFAULT_HEADERS = {
"Accept": "application/vnd.github.text+json",
}
DEFAULT_BRANCHES = ["master", "nixos-unstable-small", "nixos-unstable", "nixos-24.05"]
BACKPORT_LABEL = "backport release-24.05"
class PRStatus(BaseModel):
title: str
merged: bool
branches: dict[str, bool]
def commit_in_branch(commit_sha: str, branch: str) -> bool:
url = f"https://api.github.com/repos/NixOS/nixpkgs/compare/{branch}...{commit_sha}"
commit_response = requests.get(url, headers=DEFAULT_HEADERS)
commit_response.raise_for_status()
status = commit_response.json().get("status")
if status in ["identical", "behind"]:
return True
return False
def commits_since(first_ref: str, last_ref: str) -> int:
url = f"https://api.github.com/repos/NixOS/nixpkgs/compare/{first_ref}...{last_ref}"
commit_response = requests.get(url, headers=DEFAULT_HEADERS)
commit_response.raise_for_status()
return commit_response.json()["behind_by"]
def pr_merge_status(
pr: int, branches: list[str] = DEFAULT_BRANCHES, check_backport: bool = True
) -> PRStatus:
url = f"https://api.github.com/repos/NixOS/nixpkgs/pulls/{pr}"
pr_response = requests.get(url, headers=DEFAULT_HEADERS)
pr_response.raise_for_status()
pr_data = pr_response.json()
title = pr_data["title"]
merged = pr_data["merged"]
if merged is False:
return PRStatus(
title=title, merged=False, branches={branch: False for branch in branches}
)
commit_sha = pr_data.get("merge_commit_sha")
# Check for backport label
has_backport_label = BACKPORT_LABEL in [
label.get("name") for label in pr_data["labels"]
]
results = {}
for branch in branches:
in_branch = commit_in_branch(commit_sha, branch)
results[branch] = in_branch
if check_backport and has_backport_label and "nixos-24.05" in branches:
# Check comments for message about backport
comment_url = f"https://api.github.com/repos/NixOS/nixpkgs/issues/{pr}/comments"
comment_response = requests.get(comment_url, headers=DEFAULT_HEADERS)
comment_response.raise_for_status()
for comment in comment_response.json():
body = comment.get("body_text", "")
if "Successfully created backport PR" in body:
backport_pr = body.split("\n")[-1].replace("#", "")
# Check if backport pr has been merged
backport_url = (
f"https://api.github.com/repos/NixOS/nixpkgs/pulls/{backport_pr}"
)
backport_response = requests.get(backport_url, headers=DEFAULT_HEADERS)
backport_sha = backport_response.json().get("merge_commit_sha")
if backport_sha is None:
results[f"nixos-24.05 (#{backport_pr})"] = False
return PRStatus(title=title, merged=True, branches=results)
results.pop("nixos-24.05")
results[f"nixos-24.05 (#{backport_pr})"] = commit_in_branch(
backport_sha, "nixos-24.05"
)
return PRStatus(title=title, merged=True, branches=results)