@@ -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,19 +132,16 @@ 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 # pre-installation hook: implements function __sdkman_pre_installation_hook
132147 local pre_installation_hook=" ${SDKMAN_DIR} /tmp/hook_pre_${candidate} _${version} .sh"
@@ -138,7 +153,6 @@ function __sdkman_download() {
138153 __sdkman_echo_debug " Completed pre-installation hook..."
139154
140155 export local binary_input=" ${SDKMAN_DIR} /tmp/${base_name} .bin"
141- export local zip_output=" ${SDKMAN_DIR} /tmp/${base_name} .zip"
142156
143157 echo " "
144158 __sdkman_echo_no_colour " Downloading: ${candidate} ${version} "
@@ -161,27 +175,49 @@ function __sdkman_download() {
161175# __sdkman_post_installation_hook || return 1
162176# __sdkman_echo_debug "Processed binary as: $zip_output"
163177# __sdkman_echo_debug "Completed post-installation hook..."
164-
165- __sdkman_validate_zip " ${binary_input} " || return 1
166- __sdkman_checksum_zip " ${binary_input} " " ${headers_file} " || return 1
167- echo " "
178+
179+ if [[ ! -s " ${headers_file} " ]]; then
180+ echo " "
181+ __sdkman_echo_red " Metadata file not found (or is empty) at '${headers_file} '"
182+ rm -f " ${binary_input} "
183+ return 1
184+ else
185+ __sdkman_validate " ${binary_input} " " ${headers_file} " || return 1
186+ __sdkman_checksum " ${binary_input} " " ${headers_file} " || return 1
187+ echo " "
188+ fi
168189}
169190
170- function __sdkman_validate_zip() {
171- local zip_archive zip_ok
191+ function __sdkman_validate() {
192+ local -r archive=" $1 "
193+ local -r headers_file=" $2 "
194+ local -r archive_type=$( sed -n ' s/^X-Sdkman-ArchiveType:\(.*\)$/\1/p' ${headers_file} | tr -cd ' [:alnum:]' )
195+ local is_ok
196+
197+ echo " archive_type: ${archive_type} "
198+ echo " archive: ${archive} "
199+
200+ if [[ " ${archive_type} " == ' zip' ]]; then
201+ is_ok=$( unzip -t " $archive " | grep ' No errors detected in compressed data' )
202+ elif [[ " ${archive_type} " == ' tar' ]]; then
203+ is_ok=$( tar tf " $archive " | grep -v ' Error opening archive' )
204+ else
205+ echo " "
206+ __sdkman_echo_red " Stop! The archive type cannot be determined! Please try installing again."
207+ rm -f " ${archive} "
208+ return 1
209+ fi
172210
173- zip_archive=" $1 "
174- zip_ok=$( unzip -t " $zip_archive " | grep ' No errors detected in compressed data' )
175- if [ -z " $zip_ok " ]; then
176- rm -f " $zip_archive "
211+ if [ -z " $is_ok " ]; then
212+ rm -f " $archive "
177213 echo " "
178214 __sdkman_echo_red " Stop! The archive was corrupt and has been removed! Please try installing again."
179215 return 1
180216 fi
181217}
182218
183- function __sdkman_checksum_zip () {
184- local -r zip_archive =" $1 "
219+ function __sdkman_checksum () {
220+ local -r archive =" $1 "
185221 local -r headers_file=" $2 "
186222 local algorithm checksum cmd
187223 local shasum_avail=false
@@ -218,17 +254,17 @@ function __sdkman_checksum_zip() {
218254 if [[ -n ${algorithm} && -n ${checksum} ]]; then
219255
220256 if [[ " $algorithm " =~ ' SHA' && " $shasum_avail " == ' true' ]]; then
221- cmd=" echo \" ${checksum} *${zip_archive } \" | shasum --check --quiet"
257+ cmd=" echo \" ${checksum} *${archive } \" | shasum --check --quiet"
222258
223259 elif [[ " $algorithm " =~ ' MD5' && " $md5sum_avail " == ' true' ]]; then
224- cmd=" echo \" ${checksum} ${zip_archive } \" | md5sum --check --quiet"
260+ cmd=" echo \" ${checksum} ${archive } \" | md5sum --check --quiet"
225261 fi
226262
227263 if [[ -n $cmd ]]; then
228- __sdkman_echo_no_colour " Verifying artifact: ${zip_archive } (${algorithm} :${checksum} )"
264+ __sdkman_echo_no_colour " Verifying artifact: ${archive } (${algorithm} :${checksum} )"
229265
230266 if ! eval " $cmd " ; then
231- rm -f " $zip_archive "
267+ rm -f " $archive "
232268 echo " "
233269 __sdkman_echo_red " Stop! An invalid checksum was detected and the archive removed! Please try re-installing."
234270 return 1
0 commit comments