1#!/usr/bin/env bash
2# See ./README.md for docs
3
4set -euo pipefail
5
6log() {
7 echo "$@" >&2
8}
9
10if (( $# < 2 )); then
11 log "Usage: $0 GITHUB_REPO PR_NUMBER"
12 exit 99
13fi
14repo=$1
15prNumber=$2
16
17# Retry the API query this many times
18retryCount=5
19# Start with 5 seconds, but double every retry
20retryInterval=5
21
22while true; do
23 log "Checking whether the pull request can be merged"
24 prInfo=$(gh api \
25 -H "Accept: application/vnd.github+json" \
26 -H "X-GitHub-Api-Version: 2022-11-28" \
27 "/repos/$repo/pulls/$prNumber")
28
29 # Non-open PRs won't have their mergeability computed no matter what
30 state=$(jq -r .state <<< "$prInfo")
31 if [[ "$state" != open ]]; then
32 log "PR is not open anymore"
33 exit 1
34 fi
35
36 mergeable=$(jq -r .mergeable <<< "$prInfo")
37 if [[ "$mergeable" == "null" ]]; then
38 if (( retryCount == 0 )); then
39 log "Not retrying anymore. It's likely that GitHub is having internal issues: check https://www.githubstatus.com/"
40 exit 3
41 else
42 (( retryCount -= 1 )) || true
43
44 # null indicates that GitHub is still computing whether it's mergeable
45 # Wait a couple seconds before trying again
46 log "GitHub is still computing whether this PR can be merged, waiting $retryInterval seconds before trying again ($retryCount retries left)"
47 sleep "$retryInterval"
48
49 (( retryInterval *= 2 )) || true
50 fi
51 else
52 break
53 fi
54done
55
56if [[ "$mergeable" == "true" ]]; then
57 log "The PR can be merged"
58 mergedSha="$(jq -r .merge_commit_sha <<< "$prInfo")"
59 echo "mergedSha=$mergedSha"
60 targetSha="$(gh api "/repos/$repo/commits/$mergedSha" --jq '.parents[0].sha')"
61 echo "targetSha=$targetSha"
62else
63 log "The PR has a merge conflict"
64 exit 2
65fi