22set -e
33releases=$( mktemp)
44
5- maybe_trace () {
5+ setup () {
66 if [ -n " $trace " ]; then
77 set -x
88 fi
9+ b=' `'
10+ headers_file=$( mktemp)
911}
1012
1113list_releases () {
12- releases_url =" https://api.github.com/repos/$repo /releases"
14+ releases_url_base =" https://api.github.com/repos/$repo /releases"
1315 if [ -n " $version " ]; then
14- releases_url=" $releases_url /tags/$version "
16+ releases_url=" $releases_url_base /tags/$version "
17+ else
18+ releases_url=" $releases_url_base "
19+ fi
20+ curl -D " $headers_file " -H " $AUTHORIZATION_HEADER " -q -s -L " $releases_url " -o " $releases "
21+ response_code=$( get_response_code)
22+ if [ $response_code -eq 404 ]; then
23+ if [ -n " $version " ]; then
24+ curl -D " $headers_file " -H " $AUTHORIZATION_HEADER " -q -s -L " $releases_url_base " -o " /dev/null"
25+ releases_response_code=$( get_response_code)
26+ if [ $releases_response_code -eq 404 ]; then
27+ releases_is_404=1
28+ fi
29+ else
30+ releases_is_404=1
31+ fi
32+ if [ -n " $releases_is_404 " ]; then
33+ if [ -n " $token_is_not_gh_token " ]; then
34+ hint=" If the repository $b $repo $b is private then the provided $b token $b does not have access to the repository."
35+ else
36+ hint=" If the repository $b $repo $b is private then provide a $b token $b ."
37+ fi
38+ else
39+ hint=" The specified version $b $version $b of $b $repo $b is missing; either it never existed or it was deleted. Check the version and the releases page."
40+ fi
1541 fi
16- curl -H " $AUTHORIZATION_HEADER " -q -s -L " $releases_url " -o " $releases "
42+ validate_response_code " $response_code " " $releases " " $releases_url "
1743}
1844
1945find_artifact () {
@@ -98,6 +124,39 @@ get_content_length() {
98124 ' " $1 "
99125}
100126
127+ validate_response_code () {
128+ case " $1 " in
129+ 2* )
130+ return
131+ ;;
132+ 401)
133+ title=' Bad credentials'
134+ if [ -z " $hint " ]; then
135+ hint=" Either the provided $b token $b was never valid for repository $b $repo $b , it was revoked/deleted, or it expired. Try replacing it."
136+ fi
137+ ;;
138+ 404)
139+ title=' Server reported resource not found'
140+ ;;
141+ * )
142+ title=Unexpected http response code
143+ ;;
144+ esac
145+ (
146+ echo " ## $title ($b $1 $b )"
147+ if [ -n " $hint " ]; then
148+ echo " $hint "
149+ fi
150+ echo
151+ echo " $b $3 $b :"
152+ echo
153+ echo ' ```'
154+ head -c 10240 " $2 "
155+ echo ' ```'
156+ ) | tee -a " $GITHUB_STEP_SUMMARY " >&2
157+ exit 1
158+ }
159+
101160validate_file_length () {
102161 perl -e '
103162 my $artifact=$ENV{artifact};
@@ -121,13 +180,18 @@ shasum() {
121180 ' " $1 "
122181}
123182
183+ get_response_code () {
184+ perl -e ' $/="\r\n\r\n"; my $code = -1; while (<>) { $_ =~ s/\n.*/\n/s; next unless m!HTTP/\S+\s+(\d+)!; $code=$1;} print $code;' " $headers_file "
185+ }
186+
124187download_artifact () {
125188 temp_file=$( mktemp)
126- headers_file=$( mktemp)
127189 curl -D " $headers_file " -H " $AUTHORIZATION_HEADER " -o " $temp_file " -q -s -L " $artifact "
190+ response_code=$( get_response_code)
128191 content_length=$( get_content_length " $headers_file " )
129192 request_id=$( grep -i ^x-github-request-id: " $headers_file " | tail -1)
130- echo " Downloaded $artifact - content-length: $content_length ; shasum256: $( shasum " $temp_file " ) ; $request_id "
193+ echo " Downloaded $artifact - status: $response_code ; content-length: $content_length ; shasum256: $( shasum " $temp_file " ) ; $request_id "
194+ validate_response_code " $response_code " " $temp_file " " $artifact "
131195 content_length=" $content_length " artifact=" $artifact " temp_file=" $temp_file " validate_file_length
132196
133197 echo " url=$artifact " >> " $GITHUB_OUTPUT "
@@ -224,7 +288,7 @@ maybe_extract_artifact() {
224288 fi
225289}
226290
227- maybe_trace
291+ setup
228292set_up_auth
229293list_releases
230294select_artifact
0 commit comments