@@ -59,18 +59,36 @@ function __sdk_install() {
5959}
6060
6161function __sdkman_install_candidate_version() {
62- local candidate version
63-
62+ local candidate version base_name headers_file archive_type
63+ local metadata_folder=" ${SDKMAN_DIR} /var/metadata"
64+
6465 candidate=" $1 "
6566 version=" $2 "
67+ base_name=" ${candidate} -${version} "
68+ headers_file=" ${metadata_folder} /${base_name} .headers"
69+
70+ mkdir -p ${metadata_folder}
6671
67- __sdkman_download " $candidate " " $version " || return 1
72+ __sdkman_download " $candidate " " $version " " $headers_file " || return 1
6873 __sdkman_echo_green " Installing: ${candidate} ${version} "
6974
7075 mkdir -p " ${SDKMAN_CANDIDATES_DIR} /${candidate} "
71-
7276 rm -rf " ${SDKMAN_DIR} /tmp/out"
73- unzip -oq " ${SDKMAN_DIR} /tmp/${candidate} -${version} .bin" -d " ${SDKMAN_DIR} /tmp/out"
77+
78+ archive_type=$( sed -n ' s/^X-Sdkman-ArchiveType:\(.*\)$/\1/p' ${headers_file} | tr -cd ' [:alnum:]' )
79+
80+ if [[ " ${archive_type} " == ' zip' ]]; then
81+ unzip -oq " ${SDKMAN_DIR} /tmp/${base_name} .bin" -d " ${SDKMAN_DIR} /tmp/out"
82+ elif [[ " ${archive_type} " == ' tar' ]]; then
83+ mkdir -p " ${SDKMAN_DIR} /tmp/out"
84+ tar zxf " ${SDKMAN_DIR} /tmp/${base_name} .bin" -C " ${SDKMAN_DIR} /tmp/out"
85+ else
86+ echo " "
87+ __sdkman_echo_red " Stop! The archive type cannot be determined! Please try installing again."
88+ rm -f " ${SDKMAN_DIR} /tmp/${base_name} .bin"
89+ return 1
90+ fi
91+
7492 mv -f " $SDKMAN_DIR " /tmp/out/* " ${SDKMAN_CANDIDATES_DIR} /${candidate} /${version} "
7593 __sdkman_echo_green " Done installing!"
7694 echo " "
@@ -114,22 +132,18 @@ function __sdkman_install_local_version() {
114132}
115133
116134function __sdkman_download() {
117- local candidate version
135+ local candidate version headers_file
118136
119137 candidate=" $1 "
120138 version=" $2 "
139+ headers_file=" $3 "
121140
122- metadata_folder=" ${SDKMAN_DIR} /var/metadata"
123- mkdir -p ${metadata_folder}
124-
125141 local platform_parameter=" $( echo $SDKMAN_PLATFORM | tr ' [:upper:]' ' [:lower:]' ) "
126142 local download_url=" ${SDKMAN_CANDIDATES_API} /broker/download/${candidate} /${version} /${platform_parameter} "
127143 local base_name=" ${candidate} -${version} "
128144 local tmp_headers_file=" ${SDKMAN_DIR} /tmp/${base_name} .headers.tmp"
129- local headers_file=" ${metadata_folder} /${base_name} .headers"
130145
131146 export local binary_input=" ${SDKMAN_DIR} /tmp/${base_name} .bin"
132- export local zip_output=" ${SDKMAN_DIR} /tmp/${base_name} .zip"
133147
134148 echo " "
135149 __sdkman_echo_no_colour " Downloading: ${candidate} ${version} "
@@ -142,26 +156,48 @@ function __sdkman_download() {
142156 grep ' ^X-Sdkman' " ${tmp_headers_file} " > " ${headers_file} "
143157 __sdkman_echo_debug " Downloaded binary to: ${binary_input} (HTTP headers written to: ${headers_file} )"
144158
145- __sdkman_validate_zip " ${binary_input} " || return 1
146- __sdkman_checksum_zip " ${binary_input} " " ${headers_file} " || return 1
147- echo " "
159+ if [[ ! -s " ${headers_file} " ]]; then
160+ echo " "
161+ __sdkman_echo_red " Metadata file not found (or is empty) at '${headers_file} '"
162+ rm -f " ${binary_input} "
163+ return 1
164+ else
165+ __sdkman_validate " ${binary_input} " " ${headers_file} " || return 1
166+ __sdkman_checksum " ${binary_input} " " ${headers_file} " || return 1
167+ echo " "
168+ fi
148169}
149170
150- function __sdkman_validate_zip() {
151- local zip_archive zip_ok
171+ function __sdkman_validate() {
172+ local -r archive=" $1 "
173+ local -r headers_file=" $2 "
174+ local -r archive_type=$( sed -n ' s/^X-Sdkman-ArchiveType:\(.*\)$/\1/p' ${headers_file} | tr -cd ' [:alnum:]' )
175+ local is_ok
176+
177+ echo " archive_type: ${archive_type} "
178+ echo " archive: ${archive} "
179+
180+ if [[ " ${archive_type} " == ' zip' ]]; then
181+ is_ok=$( unzip -t " $archive " | grep ' No errors detected in compressed data' )
182+ elif [[ " ${archive_type} " == ' tar' ]]; then
183+ is_ok=$( tar tf " $archive " | grep -v ' Error opening archive' )
184+ else
185+ echo " "
186+ __sdkman_echo_red " Stop! The archive type cannot be determined! Please try installing again."
187+ rm -f " ${archive} "
188+ return 1
189+ fi
152190
153- zip_archive=" $1 "
154- zip_ok=$( unzip -t " $zip_archive " | grep ' No errors detected in compressed data' )
155- if [ -z " $zip_ok " ]; then
156- rm -f " $zip_archive "
191+ if [ -z " $is_ok " ]; then
192+ rm -f " $archive "
157193 echo " "
158194 __sdkman_echo_red " Stop! The archive was corrupt and has been removed! Please try installing again."
159195 return 1
160196 fi
161197}
162198
163- function __sdkman_checksum_zip () {
164- local -r zip_archive =" $1 "
199+ function __sdkman_checksum () {
200+ local -r archive =" $1 "
165201 local -r headers_file=" $2 "
166202 local algorithm checksum cmd
167203 local shasum_avail=false
@@ -198,17 +234,17 @@ function __sdkman_checksum_zip() {
198234 if [[ -n ${algorithm} && -n ${checksum} ]]; then
199235
200236 if [[ " $algorithm " =~ ' SHA' && " $shasum_avail " == ' true' ]]; then
201- cmd=" echo \" ${checksum} *${zip_archive } \" | shasum --check --quiet"
237+ cmd=" echo \" ${checksum} *${archive } \" | shasum --check --quiet"
202238
203239 elif [[ " $algorithm " =~ ' MD5' && " $md5sum_avail " == ' true' ]]; then
204- cmd=" echo \" ${checksum} ${zip_archive } \" | md5sum --check --quiet"
240+ cmd=" echo \" ${checksum} ${archive } \" | md5sum --check --quiet"
205241 fi
206242
207243 if [[ -n $cmd ]]; then
208- __sdkman_echo_no_colour " Verifying artifact: ${zip_archive } (${algorithm} :${checksum} )"
244+ __sdkman_echo_no_colour " Verifying artifact: ${archive } (${algorithm} :${checksum} )"
209245
210246 if ! eval " $cmd " ; then
211- rm -f " $zip_archive "
247+ rm -f " $archive "
212248 echo " "
213249 __sdkman_echo_red " Stop! An invalid checksum was detected and the archive removed! Please try re-installing."
214250 return 1
0 commit comments