Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 26 additions & 8 deletions hack/validate-labels.py
Original file line number Diff line number Diff line change
@@ -1,45 +1,63 @@
#!/usr/bin/env python3
"""Validate GitHub label descriptions don't exceed 100 characters."""
"""Validate GitHub label configuration."""

import sys
import yaml

MAX_LENGTH = 100
LABELS_FILE = "core-services/prow/02_config/_labels.yaml"

def label_names(labels):
return {label["name"] for label in labels}

def main():
with open(LABELS_FILE, encoding="utf-8") as f:
data = yaml.safe_load(f)

errors = []

default_labels = data.get("default", {}).get("labels", [])
default_names = label_names(default_labels)

# Check default labels
for label in data.get("default", {}).get("labels", []):
for label in default_labels:
desc = label.get("description", "")
if len(desc) > MAX_LENGTH:
errors.append(f"default/{label['name']}: {len(desc)} chars - {desc}")
errors.append(f"default/{label['name']}: description is {len(desc)} chars (max {MAX_LENGTH})")

# Check org-level labels
for org, config in data.get("orgs", {}).items():
for label in config.get("labels", []):
org_labels = config.get("labels", [])
for label in org_labels:
name = label["name"]
desc = label.get("description", "")
if len(desc) > MAX_LENGTH:
errors.append(f"orgs/{org}/{label['name']}: {len(desc)} chars - {desc}")
errors.append(f"orgs/{org}/{name}: description is {len(desc)} chars (max {MAX_LENGTH})")
if name in default_names:
errors.append(f"orgs/{org}/{name}: duplicates default label")

# Check repo-specific labels
for repo, config in data.get("repos", {}).items():
org = repo.split("/")[0] if "/" in repo else None
org_names = label_names(data.get("orgs", {}).get(org, {}).get("labels", [])) if org else set()

for label in config.get("labels", []):
name = label["name"]
desc = label.get("description", "")
if len(desc) > MAX_LENGTH:
errors.append(f"repos/{repo}/{label['name']}: {len(desc)} chars - {desc}")
errors.append(f"repos/{repo}/{name}: description is {len(desc)} chars (max {MAX_LENGTH})")
if name in default_names:
errors.append(f"repos/{repo}/{name}: duplicates default label")
if name in org_names:
errors.append(f"repos/{repo}/{name}: duplicates org-level label from {org}")

if errors:
print(f"Labels with descriptions exceeding {MAX_LENGTH} characters:")
print("Label validation errors:")
for err in errors:
print(f" {err}")
sys.exit(1)

print("All label descriptions are within limits.")
print("All labels are valid.")

if __name__ == "__main__":
main()