@@ -60,11 +60,11 @@ export DVM_VERSION="v0.9.1"
6060
6161 # Set global variables to default values
6262 DVM_DENO_VERSION=" "
63- DVM_FILE_TYPE=" "
6463 DVM_INSTALL_MODE=" binary"
6564 DVM_INSTALL_REGISTRY=" "
6665 DVM_INSTALL_SKIP_VALIDATION=false
6766 DVM_INSTALL_SKIP_CACHE=false
67+ DVM_INSTALL_SHA256SUM=false
6868 DVM_LATEST_VERSION=" "
6969 DVM_PROFILE_FILE=" "
7070 DVM_REMOTE_VERSIONS=" "
@@ -165,16 +165,18 @@ export DVM_VERSION="v0.9.1"
165165 local url
166166 local file
167167 local cmd
168+ local downloading_file
168169
169170 url=" $1 "
170171 file=" $2 "
172+ downloading_file=" $file .downloading"
171173
172174 dvm_debug " downloading url: $url "
173175 dvm_debug " download destination file: $file "
174176
175177 if dvm_has curl
176178 then
177- cmd=" curl -LJ $url -o $file "
179+ cmd=" curl -LJ $url -o $downloading_file "
178180 if [ " $DVM_QUIET_MODE " = true ]
179181 then
180182 cmd=" $cmd -s"
@@ -192,8 +194,14 @@ export DVM_VERSION="v0.9.1"
192194
193195 if ! eval " $cmd "
194196 then
197+ # remove failed download file
198+ rm -f " $downloading_file "
195199 dvm_failure
200+ return
196201 fi
202+
203+ # rename the downloading file to the target file
204+ mv " $downloading_file " " $file "
197205 }
198206
199207 # Send a GET request to the specific url, and save response to the
@@ -368,7 +376,7 @@ export DVM_VERSION="v0.9.1"
368376 then
369377 return
370378 fi
371-
379+
372380 if [[ " $DVM_TARGET_VERSION " != " v" * ]]
373381 then
374382 DVM_TARGET_VERSION=" v$DVM_TARGET_VERSION "
@@ -574,15 +582,7 @@ export DVM_VERSION="v0.9.1"
574582 continue
575583 fi
576584
577- [ -f " $cache_path /deno-downloading.zip" ] && rm " $cache_path /deno-downloading.zip"
578-
579- [ -f " $cache_path /deno-downloading.gz" ] && rm " $cache_path /deno-downloading.gz"
580-
581- [ -f " $cache_path /deno.zip" ] && rm " $cache_path /deno.zip"
582-
583- [ -f " $cache_path /deno.gz" ] && rm " $cache_path /deno.gz"
584-
585- rmdir " $cache_path "
585+ rm -rf " $cache_path "
586586 done
587587 }
588588}
@@ -974,16 +974,12 @@ export DVM_VERSION="v0.9.1"
974974 dvm_debug " registry url: $registry "
975975
976976 url=" $registry /$version /$DVM_TARGET_NAME "
977- temp_file=" $DVM_DIR /download/$version /deno-downloading. $DVM_TARGET_TYPE "
977+ temp_file=" $DVM_DIR /download/$version /$DVM_TARGET_NAME "
978978
979979 if dvm_download_file " $url " " $temp_file "
980980 then
981- local file_type
982- file_type=$( file " $temp_file " )
983-
984- if [[ $file_type == * " $DVM_FILE_TYPE " * ]]
981+ if dvm_validate_download_file " $version " " $url "
985982 then
986- mv " $temp_file " " $DVM_DIR /download/$version /deno.$DVM_TARGET_TYPE "
987983 return
988984 fi
989985 fi
@@ -1109,10 +1105,8 @@ export DVM_VERSION="v0.9.1"
11091105 if dvm_compare_version " $target_version " " v0.36.0"
11101106 then
11111107 DVM_TARGET_TYPE=" gz"
1112- DVM_FILE_TYPE=" gzip compressed data"
11131108 else
11141109 DVM_TARGET_TYPE=" zip"
1115- DVM_FILE_TYPE=" Zip archive data"
11161110 fi
11171111
11181112 dvm_debug " target file type: $DVM_TARGET_TYPE "
@@ -1400,6 +1394,58 @@ export DVM_VERSION="v0.9.1"
14001394 fi
14011395 }
14021396
1397+ # Validate the downloaded file, and move it to the versions directory if the
1398+ # file is valid.
1399+ # Parameters:
1400+ # - $1: The Deno version to install.
1401+ dvm_validate_download_file () {
1402+ local version
1403+ local download_url
1404+ local download_file
1405+ local sha256sum_url
1406+ local sha256sum_file
1407+ local checksum
1408+ local checksum_expected
1409+
1410+ version=" $1 "
1411+ download_url=" $2 "
1412+
1413+ download_file=" $DVM_DIR /download/$version /$DVM_TARGET_NAME "
1414+ sha256sum_url=" $download_url .sha256sum"
1415+ sha256sum_file=" $download_file .sha256sum"
1416+
1417+ if [ " $DVM_INSTALL_SHA256SUM " = true ] &&
1418+ dvm_has shasum &&
1419+ ! dvm_compare_version " $version " " v2.0.1"
1420+ then
1421+ dvm_debug " downloading sha256sum file: $sha256sum_url "
1422+
1423+ if ! dvm_download_file " $sha256sum_url " " $sha256sum_file "
1424+ then
1425+ dvm_print_error " failed to download sha256 file."
1426+ dvm_failure
1427+ return
1428+ fi
1429+
1430+ dvm_print " Computing checksum with sha256sum..."
1431+ checksum=$( shasum -a 256 " $download_file " | cut -d " " -f 1)
1432+ checksum_expected=$( cut -d " " -f 1 < " $sha256sum_file " )
1433+ dvm_debug " checksum: $checksum , expected checksum: $checksum_expected "
1434+
1435+ if [ " $checksum " != " $checksum_expected " ]
1436+ then
1437+ dvm_print_error " Checksums failed."
1438+ dvm_failure
1439+ return
1440+ fi
1441+
1442+ dvm_print " Checksums matched!"
1443+ rm " $sha256sum_file "
1444+ fi
1445+
1446+ mv " $download_file " " $DVM_DIR /download/$version /deno.$DVM_TARGET_TYPE "
1447+ }
1448+
14031449 # Get remote data by GitHub api (Get a release by tag name) to validate the
14041450 # version from the parameter.
14051451 # Parameters:
@@ -1702,10 +1748,11 @@ export DVM_VERSION="v0.9.1"
17021748 echo " $content " > " $DVM_PROFILE_FILE "
17031749
17041750 # unset global variables
1705- unset -v DVM_COLOR_MODE DVM_DENO_VERSION DVM_DIR DVM_FILE_TYPE DVM_INSTALL_MODE \
1706- DVM_INSTALL_REGISTRY DVM_INSTALL_SKIP_CACHE DVM_INSTALL_SKIP_VALIDATION DVM_LATEST_VERSION \
1707- DVM_PROFILE_FILE DVM_QUIET_MODE DVM_REMOTE_VERSIONS DVM_REQUEST_RESPONSE DVM_SOURCE \
1708- DVM_TARGET_ARCH DVM_TARGET_NAME DVM_TARGET_OS DVM_TARGET_TYPE DVM_TARGET_VERSION \
1751+ unset -v DVM_COLOR_MODE DVM_DENO_VERSION DVM_DIR DVM_INSTALL_MODE \
1752+ DVM_INSTALL_REGISTRY DVM_INSTALL_SHA256SUM DVM_INSTALL_SKIP_CACHE \
1753+ DVM_INSTALL_SKIP_VALIDATION DVM_LATEST_VERSION DVM_PROFILE_FILE DVM_QUIET_MODE \
1754+ DVM_REMOTE_VERSIONS DVM_REQUEST_RESPONSE DVM_SOURCE DVM_TARGET_ARCH \
1755+ DVM_TARGET_NAME DVM_TARGET_OS DVM_TARGET_TYPE DVM_TARGET_VERSION \
17091756 DVM_VERBOSE_MODE DVM_VERSION
17101757 # unset dvm itself
17111758 unset -f dvm
@@ -1729,7 +1776,7 @@ export DVM_VERSION="v0.9.1"
17291776 dvm_scan_and_fix_versions dvm_set_alias \
17301777 dvm_set_default_alias_after_install dvm_set_default_env dvm_strip_path \
17311778 dvm_success dvm_uninstall_version dvm_update_dvm dvm_use_version \
1732- dvm_validate_build_target dvm_validate_remote_version
1779+ dvm_validate_build_target dvm_validate_download_file dvm_validate_remote_version
17331780 # unset dvm shell completion functions
17341781 unset -f _dvm_add_aliases_to_opts _dvm_add_versions_to_opts \
17351782 _dvm_has_active_version _dvm_add_options_to_opts _dvm_completion
@@ -2074,6 +2121,9 @@ dvm() {
20742121 " --from-source" )
20752122 DVM_INSTALL_MODE=" source"
20762123 ;;
2124+ " --sha256sum" )
2125+ DVM_INSTALL_SHA256SUM=true
2126+ ;;
20772127 " -" * )
20782128 ;;
20792129 * )
0 commit comments