@@ -30,44 +30,79 @@ jobs:
3030 REVIEWER : Pigbibi
3131 run : |
3232 set -euo pipefail
33- latest_review_request_actor () {
33+ review_events () {
3434 gh api --paginate \
3535 "repos/${GITHUB_REPOSITORY}/issues/${PR_NUMBER}/timeline?per_page=100" |
36- jq -sr --arg reviewer "${REVIEWER}" \
37- '[.[][] | select(.event == "review_requested" and .requested_reviewer.login == $reviewer)][-1].actor.login // ""'
36+ jq -sc --arg reviewer "${REVIEWER}" '
37+ [.[][] | select(
38+ (.event == "review_requested" or .event == "review_request_removed") and
39+ .requested_reviewer.login == $reviewer
40+ )]
41+ '
3842 }
3943
40- review_requests="$(gh pr view "${PR_NUMBER}" \
41- --repo "${GITHUB_REPOSITORY}" \
42- --json reviewRequests \
43- --jq '.reviewRequests[].login')"
44+ current_review_requests() {
45+ gh pr view "${PR_NUMBER}" \
46+ --repo "${GITHUB_REPOSITORY}" \
47+ --json reviewRequests \
48+ --jq '.reviewRequests[].login'
49+ }
50+
51+ review_requests="$(current_review_requests)"
4452 if ! grep -Fqx "${REVIEWER}" <<<"${review_requests}"; then
4553 echo "No review request for ${REVIEWER}; nothing to dismiss." >> "${GITHUB_STEP_SUMMARY}"
4654 exit 0
4755 fi
4856
49- latest_request_actor="$(latest_review_request_actor)"
50- case "${latest_request_actor}" in
51- 'dependabot[bot]'|'app/dependabot') ;;
57+ events_before="$(review_events)"
58+ latest_event="$(jq -r '.[-1].event // ""' <<<"${events_before}")"
59+ latest_actor="$(jq -r '.[-1].actor.login // ""' <<<"${events_before}")"
60+ case "${latest_event}:${latest_actor}" in
61+ 'review_requested:dependabot[bot]'|'review_requested:app/dependabot') ;;
5262 *)
53- echo "Latest review request was made by ${latest_request_actor :-<unknown>}; preserving it ." >> "${GITHUB_STEP_SUMMARY}"
63+ echo "Latest review event was ${latest_event:-<unknown>} by ${latest_actor :-<unknown>}; preserving the request ." >> "${GITHUB_STEP_SUMMARY}"
5464 exit 0
5565 ;;
5666 esac
67+ baseline_count="$(jq 'length' <<<"${events_before}")"
5768
58- gh api --method DELETE \
69+ review_requests="$(current_review_requests)"
70+ if ! grep -Fqx "${REVIEWER}" <<<"${review_requests}"; then
71+ echo "Review request was removed during cleanup; nothing to dismiss." >> "${GITHUB_STEP_SUMMARY}"
72+ exit 0
73+ fi
74+
75+ if ! gh api --method DELETE \
5976 "repos/${GITHUB_REPOSITORY}/pulls/${PR_NUMBER}/requested_reviewers" \
60- -f "reviewers[]=${REVIEWER}"
77+ -f "reviewers[]=${REVIEWER}"; then
78+ review_requests="$(current_review_requests)"
79+ if ! grep -Fqx "${REVIEWER}" <<<"${review_requests}"; then
80+ echo "Review request was removed concurrently; nothing to dismiss." >> "${GITHUB_STEP_SUMMARY}"
81+ exit 0
82+ fi
83+ exit 1
84+ fi
6185
62- latest_request_actor="$(latest_review_request_actor)"
63- case "${latest_request_actor}" in
64- 'dependabot[bot]'|'app/dependabot')
65- echo "Dismissed Dependabot review request for ${REVIEWER}." >> "${GITHUB_STEP_SUMMARY}"
66- ;;
67- *)
86+ events_after="$(review_events)"
87+ human_intent="$(jq -r --argjson baseline "${baseline_count}" '
88+ [.[$baseline:][] | select(
89+ .actor.login != "dependabot[bot]" and
90+ .actor.login != "app/dependabot" and
91+ .actor.login != "github-actions[bot]" and
92+ .actor.login != "github-actions"
93+ )][-1].event // ""
94+ ' <<<"${events_after}")"
95+
96+ if [ "${human_intent}" = 'review_requested' ]; then
97+ review_requests="$(current_review_requests)"
98+ if ! grep -Fqx "${REVIEWER}" <<<"${review_requests}"; then
6899 gh api --method POST \
69100 "repos/${GITHUB_REPOSITORY}/pulls/${PR_NUMBER}/requested_reviewers" \
70101 -f "reviewers[]=${REVIEWER}"
71- echo "Restored review request made by ${latest_request_actor:-<unknown>}." >> "${GITHUB_STEP_SUMMARY}"
72- ;;
73- esac
102+ fi
103+ echo "Preserved a concurrent human review request." >> "${GITHUB_STEP_SUMMARY}"
104+ elif [ "${human_intent}" = 'review_request_removed' ]; then
105+ echo "Preserved a concurrent human review removal." >> "${GITHUB_STEP_SUMMARY}"
106+ else
107+ echo "Dismissed Dependabot review request for ${REVIEWER}." >> "${GITHUB_STEP_SUMMARY}"
108+ fi
0 commit comments