forked from Qortal/q-blog
35 lines
1.2 KiB
Bash
Executable File
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 "$@"
|