@@ -40,25 +40,79 @@ declare CURL="${CURL:-curl}"
4040function 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