65 regels
2.1 KiB
Python
65 regels
2.1 KiB
Python
import os
|
|
import sys
|
|
import yaml
|
|
import requests
|
|
|
|
def get_existing_labels(repo, token):
|
|
headers = {"Authorization": f"token {token}"}
|
|
labels = {}
|
|
page = 1
|
|
while True:
|
|
url = f"https://api.github.com/repos/{repo}/labels?page={page}&per_page=100"
|
|
resp = requests.get(url, headers=headers)
|
|
if resp.status_code != 200:
|
|
raise Exception(f"Failed to fetch existing labels: {resp.text}")
|
|
data = resp.json()
|
|
if not data:
|
|
break
|
|
for label in data:
|
|
labels[label["name"]] = {
|
|
"color": label["color"],
|
|
"description": label.get("description", "")
|
|
}
|
|
page += 1
|
|
return labels
|
|
|
|
def create_or_update_label(repo, token, label, existing):
|
|
headers = {
|
|
"Authorization": f"token {token}",
|
|
"Accept": "application/vnd.github+json"
|
|
}
|
|
|
|
if label["name"] not in existing:
|
|
# Create label
|
|
print(f"Creating label: {label['name']}")
|
|
url = f"https://api.github.com/repos/{repo}/labels"
|
|
resp = requests.post(url, json=label, headers=headers)
|
|
else:
|
|
# Update if different
|
|
current = existing[label["name"]]
|
|
if (label["color"].lower() != current["color"].lower() or
|
|
label.get("description", "") != current.get("description", "")):
|
|
print(f"Updating label: {label['name']}")
|
|
url = f"https://api.github.com/repos/{repo}/labels/{label['name']}"
|
|
resp = requests.patch(url, json=label, headers=headers)
|
|
else:
|
|
print(f"Label '{label['name']}' already up to date. Skipping.")
|
|
return
|
|
|
|
if not resp.ok:
|
|
print(f"Failed to apply label {label['name']}: {resp.status_code} {resp.text}")
|
|
|
|
def main(label_file):
|
|
token = os.environ["GH_TOKEN"]
|
|
repo = os.environ["GITHUB_REPO"]
|
|
existing = get_existing_labels(repo, token)
|
|
|
|
with open(label_file, "r") as f:
|
|
labels = yaml.safe_load(f)
|
|
|
|
for label in labels:
|
|
create_or_update_label(repo, token, label, existing)
|
|
|
|
if __name__ == "__main__":
|
|
main(sys.argv[1])
|