#!/usr/bin/env bash # Closes the issue (success) or marks failed and reopens for retry. # Usage: # finish-pr.sh ISSUE_NUM success PR_NUM # finish-pr.sh ISSUE_NUM failed REASON_FILE set -euo pipefail HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" . "$HERE/lib.sh" ISSUE="${1:?ISSUE_NUM required}" RESULT="${2:?success|failed required}" ARG3="${3:?PR_NUM or REASON_FILE required}" INPROG=$(python -c "import json; print(json.load(open('$LABEL_MAP'))['queue/in-progress'])") DONE=$(python -c "import json; print(json.load(open('$LABEL_MAP'))['queue/done'])") FAILED=$(python -c "import json; print(json.load(open('$LABEL_MAP'))['queue/failed'])") api_repo DELETE "issues/$ISSUE/labels/$INPROG" >/dev/null || true case "$RESULT" in success) PR_NUM="$ARG3" api_repo POST "issues/$ISSUE/labels" "{\"labels\":[$DONE]}" >/dev/null BODY=$(python -c "import json; print(json.dumps({'body':'✅ Auto-loop completed. Merged via PR #$PR_NUM.'}))") api_repo POST "issues/$ISSUE/comments" "$BODY" >/dev/null api_repo PATCH "issues/$ISSUE" '{"state":"closed"}' >/dev/null echo " issue #$ISSUE closed (PR #$PR_NUM merged)" ;; failed) REASON_FILE="$ARG3" REASON=$(cat "$REASON_FILE" 2>/dev/null | head -c 4000 || echo "(no reason file)") api_repo POST "issues/$ISSUE/labels" "{\"labels\":[$FAILED]}" >/dev/null BODY=$(python -c "import json,sys; r=open('$REASON_FILE').read()[:4000] if __import__('os').path.exists('$REASON_FILE') else '(no log)'; print(json.dumps({'body':'❌ Auto-loop failed.\n\n\`\`\`\n'+r+'\n\`\`\`'}))") api_repo POST "issues/$ISSUE/comments" "$BODY" >/dev/null echo " issue #$ISSUE marked failed (still open for retry)" ;; *) echo "unknown result: $RESULT" >&2; exit 1 ;; esac