PageIndex/scripts/comment-on-duplicates.sh

88 lines
2.1 KiB
Bash
Executable file

#!/usr/bin/env bash
#
# comment-on-duplicates.sh - Posts a duplicate issue comment with auto-close warning.
#
# Usage:
# ./scripts/comment-on-duplicates.sh --base-issue 123 --potential-duplicates 456 789
#
set -euo pipefail
REPO="${GITHUB_REPOSITORY:-}"
if [ -z "$REPO" ]; then
echo "Error: GITHUB_REPOSITORY is not set" >&2
exit 1
fi
BASE_ISSUE=""
DUPLICATES=()
# Parse arguments
while [[ $# -gt 0 ]]; do
case "$1" in
--base-issue)
BASE_ISSUE="$2"
shift 2
;;
--potential-duplicates)
shift
while [[ $# -gt 0 && ! "$1" =~ ^-- ]]; do
DUPLICATES+=("$1")
shift
done
;;
*)
echo "Error: Unknown argument: $1" >&2
exit 1
;;
esac
done
# Validate inputs
if [ -z "$BASE_ISSUE" ]; then
echo "Error: --base-issue is required" >&2
exit 1
fi
if ! [[ "$BASE_ISSUE" =~ ^[0-9]+$ ]]; then
echo "Error: --base-issue must be a number, got: $BASE_ISSUE" >&2
exit 1
fi
if [ ${#DUPLICATES[@]} -eq 0 ]; then
echo "Error: --potential-duplicates requires at least one issue number" >&2
exit 1
fi
for dup in "${DUPLICATES[@]}"; do
if ! [[ "$dup" =~ ^[0-9]+$ ]]; then
echo "Error: duplicate issue must be a number, got: $dup" >&2
exit 1
fi
done
# Limit to 3 duplicates max
if [ ${#DUPLICATES[@]} -gt 3 ]; then
echo "Warning: Limiting to first 3 duplicates" >&2
DUPLICATES=("${DUPLICATES[@]:0:3}")
fi
# Build the duplicate links list
COUNT=0
LINKS=""
for dup in "${DUPLICATES[@]}"; do
COUNT=$((COUNT + 1))
LINKS="${LINKS}${COUNT}. https://github.com/${REPO}/issues/${dup}
"
done
# Build and post the comment — if the issue is closed or doesn't exist, gh will error out
COMMENT="Found ${COUNT} possible duplicate issue(s):
${LINKS}
This issue will be automatically closed as a duplicate in 3 days.
- To prevent auto-closure, add a comment or react with :thumbsdown: on this comment."
gh issue comment "$BASE_ISSUE" --repo "$REPO" --body "$COMMENT"
gh issue edit "$BASE_ISSUE" --repo "$REPO" --add-label "duplicate"
echo "Posted duplicate comment on issue #$BASE_ISSUE with $COUNT potential duplicate(s)"