Adds a script to delete old tags (#7158)
diff --git a/scripts/git/prune_old_tags.sh b/scripts/git/prune_old_tags.sh new file mode 100755 index 0000000..627005a --- /dev/null +++ b/scripts/git/prune_old_tags.sh
@@ -0,0 +1,82 @@ +#!/bin/bash + +# Copyright 2021 The IREE Authors +# +# Licensed under the Apache License v2.0 with LLVM Exceptions. +# See https://llvm.org/LICENSE.txt for license information. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +# Deletes all but the input number of snapshot tags and corresponding releases, +# starting with the oldest tags. +# +# Delete all but the 100 newest tags from the repository at the UPSTREAM_REMOTE +# environment variable: +# ./prune_old_tags.sh 100 +# +# List the tags that would be deleted when not performing a dry run: +# ./prune_old_tags.sh 100 DRY_RUN + +set -euo pipefail + +KEEP_TAGS_COUNT="$1" +DRY_RUN="${2:-}" +UPSTREAM_REMOTE="${UPSTREAM_REMOTE:-upstream}" + +DRY_RUN="${DRY_RUN//[-_]/}" +DRY_RUN="${DRY_RUN^^}" + +if [[ -n "${DRY_RUN}" ]] && [[ "${DRY_RUN}" != "DRYRUN" ]]; then + echo "Unexpected argument '${2}'. Should be DRYRUN (case and punctuation insensitive) if present" + exit 1 +fi + +if [[ -z "${KEEP_TAGS_COUNT}" ]]; then + echo "Must specify the number of tags to keep" + exit 1 +fi + +if [[ "${KEEP_TAGS_COUNT}" -le 0 ]]; then + echo "Cannot delete all remaining tags" + exit 1 +fi + +git fetch --all --tags +TAGS=($(git for-each-ref --sort=creatordate --format '%(refname:short)' refs/tags)) + +# Filter out tags that were not created by snapshot releases. +for TAG_INDEX in "${!TAGS[@]}"; do + if [[ ! ${TAGS[TAG_INDEX]} =~ ^snapshot-* ]]; then + unset 'TAGS[TAG_INDEX]' + fi +done + +TOTAL_TAGS_COUNT=${#TAGS[@]} +if [[ "${KEEP_TAGS_COUNT}" -ge "${TOTAL_TAGS_COUNT}" ]]; then + echo "Only ${TOTAL_TAGS_COUNT} tags exist, so nothing to delete" + exit 1 +fi + +DELETE_TAGS_COUNT=$((TOTAL_TAGS_COUNT-KEEP_TAGS_COUNT)) +DELETE_TAGS=${TAGS[@]::$DELETE_TAGS_COUNT} + +echo "${TOTAL_TAGS_COUNT} snapshot tags available" +echo "${DELETE_TAGS_COUNT} tags will be deleted" + +if [[ "${DRY_RUN}" == "DRYRUN" ]]; then + echo "Dry run mode, these tags would be deleted:" + for TAG in ${DELETE_TAGS[@]}; do + echo "${TAG}" + done + exit 0 +fi + +read -p "Continue? (y/n) " -n 1 -r +echo +if [[ ! "${REPLY}" =~ ^[Yy]$ ]] +then + echo "Exiting" + exit 0 +fi + +git tag -d ${DELETE_TAGS[@]} +git push "${UPSTREAM_REMOTE?}" -d ${DELETE_TAGS[@]}