Skip to content

Commit 3e70070

Browse files
committed
HBASE-29829 Pagination support for Hide Old Comments in PRs
1 parent cf9aa36 commit 3e70070

File tree

1 file changed

+68
-14
lines changed

1 file changed

+68
-14
lines changed

dev-support/gh_hide_old_comments.sh

Lines changed: 68 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -40,25 +40,79 @@ declare CURL="${CURL:-curl}"
4040
function fetch_comments {
4141
local pr="$1"
4242
local comments_file
43+
local page_file
44+
local headers_file
4345
local -a curl_args
44-
curl_args=(
45-
--fail
46-
"${GITHUB_AUTH[@]}"
47-
--header 'Accept: application/vnd.github+json'
48-
--header 'X-GitHub-Api-Version: 2022-11-28'
49-
--request GET
50-
--url "${GITHUB_API_URL}/repos/${REPO}/issues/${pr}/comments?per_page=500"
51-
)
52-
if [ "${DEBUG}" = true ] ; then
53-
curl_args+=(--verbose)
54-
else
55-
curl_args+=(--silent)
56-
fi
46+
local page=1
47+
local next_url
5748

5849
comments_file="$(mktemp "comments_${pr}" 2>/dev/null || mktemp -t "comments_${pr}.XXXXXXXXXX")" || \
5950
{ >&2 echo 'cannot create temp file'; exit 1 ;}
60-
"${CURL}" "${curl_args[@]}" > "${comments_file}"
51+
page_file="$(mktemp "page_${pr}" 2>/dev/null || mktemp -t "page_${pr}.XXXXXXXXXX")" || \
52+
{ >&2 echo 'cannot create temp file'; exit 1 ;}
53+
headers_file="$(mktemp "headers_${pr}" 2>/dev/null || mktemp -t "headers_${pr}.XXXXXXXXXX")" || \
54+
{ >&2 echo 'cannot create temp file'; exit 1 ;}
55+
56+
# cleanup temp files on error
57+
trap 'rm -f "${page_file}" "${headers_file}"; exit 1' ERR
58+
59+
next_url="${GITHUB_API_URL}/repos/${REPO}/issues/${pr}/comments?per_page=100"
60+
61+
# start with empty JSON array
62+
echo '[]' > "${comments_file}"
63+
64+
while [ -n "${next_url}" ] ; do
65+
curl_args=(
66+
--fail
67+
--max-time 30
68+
"${GITHUB_AUTH[@]}"
69+
--header 'Accept: application/vnd.github+json'
70+
--header 'X-GitHub-Api-Version: 2022-11-28'
71+
--dump-header "${headers_file}"
72+
--request GET
73+
--url "${next_url}"
74+
)
75+
if [ "${DEBUG}" = true ] ; then
76+
curl_args+=(--verbose)
77+
>&2 echo "Fetching page ${page}: ${next_url}"
78+
else
79+
curl_args+=(--silent)
80+
fi
81+
82+
if ! "${CURL}" "${curl_args[@]}" > "${page_file}"; then
83+
>&2 echo "Failed to fetch page ${page}: ${next_url}"
84+
rm -f "${page_file}" "${headers_file}"
85+
exit 1
86+
fi
87+
88+
if [ "${DEBUG}" = 'true' ] ; then
89+
>&2 echo "Page ${page} returned $(jq length "${page_file}") comments"
90+
fi
91+
92+
# merge this page into the accumulated results
93+
if ! jq -s '.[0] + .[1]' "${comments_file}" "${page_file}" > "${comments_file}.tmp"; then
94+
>&2 echo "Failed to merge comments from page ${page}"
95+
rm -f "${page_file}" "${headers_file}" "${comments_file}.tmp"
96+
exit 1
97+
fi
98+
mv "${comments_file}.tmp" "${comments_file}"
99+
100+
# check for next page in Link header
101+
# Link header format: <url>; rel="next", <url>; rel="last"
102+
# Extract URL associated with rel="next" regardless of position
103+
next_url=""
104+
if grep -qi '^link:' "${headers_file}" ; then
105+
next_url=$(grep -i '^link:' "${headers_file}" | tr ',' '\n' | grep 'rel="next"' | sed -n 's/.*<\([^>]*\)>.*/\1/p' || true)
106+
fi
107+
108+
page=$((page + 1))
109+
done
110+
111+
rm -f "${page_file}" "${headers_file}"
112+
trap - ERR
113+
61114
if [ "${DEBUG}" = 'true' ] ; then
115+
>&2 echo "Total comments fetched: $(jq length "${comments_file}")"
62116
>&2 cat "${comments_file}"
63117
fi
64118
echo "${comments_file}"

0 commit comments

Comments
 (0)