#!/usr/bin/env bash set -euo pipefail # Env: GITEA_BASE_URL, GITEA_TOKEN, OWNER, REPO # Usage: DRY_RUN=1 bash scripts/tracker/labels_dedupe.sh # APPLY=1 bash scripts/tracker/labels_dedupe.sh need () { for v in GITEA_BASE_URL GITEA_TOKEN OWNER REPO; do if [[ -z "${!v:-}" ]]; then echo "ERROR: Missing $v" >&2; exit 1; fi done } api () { curl -sS -H "Authorization: token ${GITEA_TOKEN}" -H "Content-Type: application/json" "${GITEA_BASE_URL}/api/v1$1" } main () { need echo "== Finding duplicate labels by name ==" DUPS="$(api "/repos/${OWNER}/${REPO}/labels?limit=500" | jq -c 'group_by(.name) | map(select(length>1))')" count="$(echo "$DUPS" | jq 'length')" if [[ "$count" -eq 0 ]]; then echo "No duplicates."; exit 0; fi echo "$DUPS" | jq -r '.[] | "name=\(.[0].name) keep=\(.[0].id) delete=\([.[1:][] .id] | join(","))"' if [[ "${APPLY:-}" != "1" ]]; then echo "DRY RUN. Set APPLY=1 to delete extras (keeps the first ID per name)." exit 0 fi echo "$DUPS" | jq -r '.[] | .[1:][] .id' | while read -r id; do echo "Deleting label id=$id" curl -sS -X DELETE -H "Authorization: token ${GITEA_TOKEN}" "${GITEA_BASE_URL}/api/v1/repos/${OWNER}/${REPO}/labels/${id}" >/dev/null done echo "Done." } main "$@"