2
2
set -e
3
3
releases=$( mktemp)
4
4
5
- maybe_trace () {
5
+ setup () {
6
6
if [ -n " $trace " ]; then
7
7
set -x
8
8
fi
9
+ b=' `'
10
+ headers_file=$( mktemp)
9
11
}
10
12
11
13
list_releases () {
12
- releases_url =" https://api.github.com/repos/$repo /releases"
14
+ releases_url_base =" https://api.github.com/repos/$repo /releases"
13
15
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 "
15
19
fi
16
- curl -H " $AUTHORIZATION_HEADER " -q -s -L " $releases_url " -o " $releases "
20
+ curl -D " $headers_file " -H " $AUTHORIZATION_HEADER " -q -s -L " $releases_url " -o " $releases "
21
+ response_code=$( get_response_code)
22
+ type=$( get_content_type " $headers_file " )
23
+ if [ $response_code -eq 404 ]; then
24
+ if [ -n " $version " ]; then
25
+ curl -D " $headers_file " -H " $AUTHORIZATION_HEADER " -q -s -L " $releases_url_base " -o " /dev/null"
26
+ releases_response_code=$( get_response_code)
27
+ if [ $releases_response_code -eq 404 ]; then
28
+ releases_is_404=1
29
+ fi
30
+ else
31
+ releases_is_404=1
32
+ fi
33
+ if [ -n " $releases_is_404 " ]; then
34
+ if [ -n " $token_is_not_gh_token " ]; then
35
+ hint=" If the repository $b $repo $b is private, then the provided $b token $b does not have access to the repository"
36
+ else
37
+ hint=" If the repository $b $repo $b is private, then provide a $b token $b "
38
+ fi
39
+ hint=" $hint . Otherwise, the repository either does not exist or has been deleted. Check with the repository owner for more information."
40
+ else
41
+ 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."
42
+ fi
43
+ fi
44
+ validate_response_code " $response_code " " $releases " " $releases_url "
17
45
}
18
46
19
47
find_artifact () {
@@ -80,24 +108,73 @@ set_up_auth() {
80
108
fi
81
109
}
82
110
83
- get_content_length () {
111
+ get_header_value () {
84
112
perl -e '
85
113
my $headers_file=shift;
86
- my $length ;
114
+ my $value ;
87
115
{
88
116
open(my $headers, q(<), $headers_file);
89
117
local $/="\r\n";
90
118
while (<$headers>) {
91
119
chomp;
92
- next unless m/^content-length :\s+(\d+ )$/i;
93
- $length =$1;
120
+ next unless m/^$ENV{header} :\s+(.* )$/i;
121
+ $value =$1;
94
122
}
95
123
close $headers;
96
124
}
97
- print $length ;
125
+ print $value ;
98
126
' " $1 "
99
127
}
100
128
129
+ get_content_length () {
130
+ header=' content-length' get_header_value " $1 "
131
+ }
132
+
133
+ get_content_type () {
134
+ header=' content-type' get_header_value " $1 "
135
+ }
136
+
137
+ validate_response_code () {
138
+ case " $1 " in
139
+ 2* )
140
+ return
141
+ ;;
142
+ 401)
143
+ title=' Bad credentials'
144
+ if [ -z " $hint " ]; then
145
+ 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."
146
+ fi
147
+ ;;
148
+ 404)
149
+ title=' Server reported resource not found'
150
+ ;;
151
+ * )
152
+ title=Unexpected http response code
153
+ ;;
154
+ esac
155
+ (
156
+ echo " ## $title ($b $1 $b )"
157
+ if [ -n " $hint " ]; then
158
+ echo " $hint "
159
+ fi
160
+ echo
161
+ echo " $b $3 $b :"
162
+ echo
163
+ case " $type " in
164
+ * json* )
165
+ type=json;;
166
+ * html* )
167
+ type=html;;
168
+ * )
169
+ type=' '
170
+ esac
171
+ echo ' ```' " $type "
172
+ head -c 10240 " $2 "
173
+ echo ' ```'
174
+ ) | tee -a " $GITHUB_STEP_SUMMARY " >&2
175
+ exit 1
176
+ }
177
+
101
178
validate_file_length () {
102
179
perl -e '
103
180
my $artifact=$ENV{artifact};
@@ -121,13 +198,18 @@ shasum() {
121
198
' " $1 "
122
199
}
123
200
201
+ get_response_code () {
202
+ 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 "
203
+ }
204
+
124
205
download_artifact () {
125
206
temp_file=$( mktemp)
126
- headers_file=$( mktemp)
127
207
curl -D " $headers_file " -H " $AUTHORIZATION_HEADER " -o " $temp_file " -q -s -L " $artifact "
208
+ response_code=$( get_response_code)
128
209
content_length=$( get_content_length " $headers_file " )
129
210
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 "
211
+ echo " Downloaded $artifact - status: $response_code ; content-length: $content_length ; shasum256: $( shasum " $temp_file " ) ; $request_id "
212
+ validate_response_code " $response_code " " $temp_file " " $artifact "
131
213
content_length=" $content_length " artifact=" $artifact " temp_file=" $temp_file " validate_file_length
132
214
133
215
echo " url=$artifact " >> " $GITHUB_OUTPUT "
@@ -224,7 +306,7 @@ maybe_extract_artifact() {
224
306
fi
225
307
}
226
308
227
- maybe_trace
309
+ setup
228
310
set_up_auth
229
311
list_releases
230
312
select_artifact
0 commit comments