Files
2025-08-16 23:31:26 -04:00

35 lines
1.2 KiB
Bash
Executable File

#!/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 "$@"