Porting 'dotnet-install.sh' from CLI:master to CLI:release/2.0.0

This commit is contained in:
John Beisner 2017-10-11 10:53:53 -07:00
parent da92efce24
commit 282de2bfe2

View file

@ -240,7 +240,7 @@ to_lowercase() {
remove_trailing_slash() { remove_trailing_slash() {
#eval $invocation #eval $invocation
local input=${1:-} local input="${1:-}"
echo "${input%/}" echo "${input%/}"
return 0 return 0
} }
@ -250,7 +250,7 @@ remove_trailing_slash() {
remove_beginning_slash() { remove_beginning_slash() {
#eval $invocation #eval $invocation
local input=${1:-} local input="${1:-}"
echo "${input#/}" echo "${input#/}"
return 0 return 0
} }
@ -267,8 +267,8 @@ combine_paths() {
return 1 return 1
fi fi
local root_path=$(remove_trailing_slash $1) local root_path="$(remove_trailing_slash "$1")"
local child_path=$(remove_beginning_slash ${2:-}) local child_path="$(remove_beginning_slash "${2:-}")"
say_verbose "combine_paths: root_path=$root_path" say_verbose "combine_paths: root_path=$root_path"
say_verbose "combine_paths: child_path=$child_path" say_verbose "combine_paths: child_path=$child_path"
echo "$root_path/$child_path" echo "$root_path/$child_path"
@ -288,10 +288,10 @@ get_machine_architecture() {
get_normalized_architecture_from_architecture() { get_normalized_architecture_from_architecture() {
eval $invocation eval $invocation
local architecture=$(to_lowercase $1) local architecture="$(to_lowercase "$1")"
case $architecture in case "$architecture" in
\<auto\>) \<auto\>)
echo "$(get_normalized_architecture_from_architecture $(get_machine_architecture))" echo "$(get_normalized_architecture_from_architecture "$(get_machine_architecture)")"
return 0 return 0
;; ;;
amd64|x64) amd64|x64)
@ -338,11 +338,11 @@ get_commit_hash_from_version_info() {
is_dotnet_package_installed() { is_dotnet_package_installed() {
eval $invocation eval $invocation
local install_root=$1 local install_root="$1"
local relative_path_to_package=$2 local relative_path_to_package="$2"
local specific_version=${3//[$'\t\r\n']} local specific_version="${3//[$'\t\r\n']}"
local dotnet_package_path=$(combine_paths $(combine_paths $install_root $relative_path_to_package) $specific_version) local dotnet_package_path="$(combine_paths "$(combine_paths "$install_root" "$relative_path_to_package")" "$specific_version")"
say_verbose "is_dotnet_package_installed: dotnet_package_path=$dotnet_package_path" say_verbose "is_dotnet_package_installed: dotnet_package_path=$dotnet_package_path"
if [ -d "$dotnet_package_path" ]; then if [ -d "$dotnet_package_path" ]; then
@ -360,10 +360,10 @@ is_dotnet_package_installed() {
get_latest_version_info() { get_latest_version_info() {
eval $invocation eval $invocation
local azure_feed=$1 local azure_feed="$1"
local channel=$2 local channel="$2"
local normalized_architecture=$3 local normalized_architecture="$3"
local coherent=$4 local coherent="$4"
local version_file_url=null local version_file_url=null
if [ "$shared_runtime" = true ]; then if [ "$shared_runtime" = true ]; then
@ -377,7 +377,7 @@ get_latest_version_info() {
fi fi
say_verbose "get_latest_version_info: latest url: $version_file_url" say_verbose "get_latest_version_info: latest url: $version_file_url"
download $version_file_url download "$version_file_url"
return $? return $?
} }
@ -389,28 +389,28 @@ get_latest_version_info() {
get_specific_version_from_version() { get_specific_version_from_version() {
eval $invocation eval $invocation
local azure_feed=$1 local azure_feed="$1"
local channel=$2 local channel="$2"
local normalized_architecture=$3 local normalized_architecture="$3"
local version=$(to_lowercase $4) local version="$(to_lowercase "$4")"
case $version in case "$version" in
latest) latest)
local version_info local version_info
version_info="$(get_latest_version_info $azure_feed $channel $normalized_architecture false)" || return 1 version_info="$(get_latest_version_info "$azure_feed" "$channel" "$normalized_architecture" false)" || return 1
say_verbose "get_specific_version_from_version: version_info=$version_info" say_verbose "get_specific_version_from_version: version_info=$version_info"
echo "$version_info" | get_version_from_version_info echo "$version_info" | get_version_from_version_info
return 0 return 0
;; ;;
coherent) coherent)
local version_info local version_info
version_info="$(get_latest_version_info $azure_feed $channel $normalized_architecture true)" || return 1 version_info="$(get_latest_version_info "$azure_feed" "$channel" "$normalized_architecture" true)" || return 1
say_verbose "get_specific_version_from_version: version_info=$version_info" say_verbose "get_specific_version_from_version: version_info=$version_info"
echo "$version_info" | get_version_from_version_info echo "$version_info" | get_version_from_version_info
return 0 return 0
;; ;;
*) *)
echo $version echo "$version"
return 0 return 0
;; ;;
esac esac
@ -424,13 +424,13 @@ get_specific_version_from_version() {
construct_download_link() { construct_download_link() {
eval $invocation eval $invocation
local azure_feed=$1 local azure_feed="$1"
local channel=$2 local channel="$2"
local normalized_architecture=$3 local normalized_architecture="$3"
local specific_version=${4//[$'\t\r\n']} local specific_version="${4//[$'\t\r\n']}"
local osname local osname
osname=$(get_current_os_name) || return 1 osname="$(get_current_os_name)" || return 1
local download_link=null local download_link=null
if [ "$shared_runtime" = true ]; then if [ "$shared_runtime" = true ]; then
@ -451,13 +451,13 @@ construct_download_link() {
construct_legacy_download_link() { construct_legacy_download_link() {
eval $invocation eval $invocation
local azure_feed=$1 local azure_feed="$1"
local channel=$2 local channel="$2"
local normalized_architecture=$3 local normalized_architecture="$3"
local specific_version=${4//[$'\t\r\n']} local specific_version="${4//[$'\t\r\n']}"
local distro_specific_osname local distro_specific_osname
distro_specific_osname=$(get_distro_specific_os_name) || return 1 distro_specific_osname="$(get_distro_specific_os_name)" || return 1
local legacy_download_link=null local legacy_download_link=null
if [ "$shared_runtime" = true ]; then if [ "$shared_runtime" = true ]; then
@ -474,7 +474,7 @@ get_user_install_path() {
eval $invocation eval $invocation
if [ ! -z "${DOTNET_INSTALL_DIR:-}" ]; then if [ ! -z "${DOTNET_INSTALL_DIR:-}" ]; then
echo $DOTNET_INSTALL_DIR echo "$DOTNET_INSTALL_DIR"
else else
echo "$HOME/.dotnet" echo "$HOME/.dotnet"
fi fi
@ -488,7 +488,7 @@ resolve_installation_path() {
local install_dir=$1 local install_dir=$1
if [ "$install_dir" = "<auto>" ]; then if [ "$install_dir" = "<auto>" ]; then
local user_install_path=$(get_user_install_path) local user_install_path="$(get_user_install_path)"
say_verbose "resolve_installation_path: user_install_path=$user_install_path" say_verbose "resolve_installation_path: user_install_path=$user_install_path"
echo "$user_install_path" echo "$user_install_path"
return 0 return 0
@ -503,11 +503,11 @@ resolve_installation_path() {
get_installed_version_info() { get_installed_version_info() {
eval $invocation eval $invocation
local install_root=$1 local install_root="$1"
local version_file=$(combine_paths "$install_root" "$local_version_file_relative_path") local version_file="$(combine_paths "$install_root" "$local_version_file_relative_path")"
say_verbose "Local version file: $version_file" say_verbose "Local version file: $version_file"
if [ ! -z "$version_file" ] | [ -r "$version_file" ]; then if [ ! -z "$version_file" ] | [ -r "$version_file" ]; then
local version_info="$(cat $version_file)" local version_info="$(cat "$version_file")"
echo "$version_info" echo "$version_info"
return 0 return 0
fi fi
@ -522,7 +522,7 @@ get_absolute_path() {
eval $invocation eval $invocation
local relative_or_absolute_path=$1 local relative_or_absolute_path=$1
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1") echo "$(cd "$(dirname "$1")" && pwd -P)/$(basename "$1")"
return 0 return 0
} }
@ -534,17 +534,17 @@ get_absolute_path() {
copy_files_or_dirs_from_list() { copy_files_or_dirs_from_list() {
eval $invocation eval $invocation
local root_path=$(remove_trailing_slash $1) local root_path="$(remove_trailing_slash "$1")"
local out_path=$(remove_trailing_slash $2) local out_path="$(remove_trailing_slash "$2")"
local override=$3 local override="$3"
local override_switch=$(if [ "$override" = false ]; then printf -- "-n"; fi) local override_switch=$(if [ "$override" = false ]; then printf -- "-n"; fi)
cat | uniq | while read -r file_path; do cat | uniq | while read -r file_path; do
local path=$(remove_beginning_slash ${file_path#$root_path}) local path="$(remove_beginning_slash "${file_path#$root_path}")"
local target=$out_path/$path local target="$out_path/$path"
if [ "$override" = true ] || (! ([ -d "$target" ] || [ -e "$target" ])); then if [ "$override" = true ] || (! ([ -d "$target" ] || [ -e "$target" ])); then
mkdir -p $out_path/$(dirname $path) mkdir -p "$out_path/$(dirname "$path")"
cp -R $override_switch $root_path/$path $target cp -R $override_switch "$root_path/$path" "$target"
fi fi
done done
} }
@ -555,19 +555,19 @@ copy_files_or_dirs_from_list() {
extract_dotnet_package() { extract_dotnet_package() {
eval $invocation eval $invocation
local zip_path=$1 local zip_path="$1"
local out_path=$2 local out_path="$2"
local temp_out_path=$(mktemp -d $temporary_file_template) local temp_out_path="$(mktemp -d "$temporary_file_template")"
local failed=false local failed=false
tar -xzf "$zip_path" -C "$temp_out_path" > /dev/null || failed=true tar -xzf "$zip_path" -C "$temp_out_path" > /dev/null || failed=true
local folders_with_version_regex='^.*/[0-9]+\.[0-9]+[^/]+/' local folders_with_version_regex='^.*/[0-9]+\.[0-9]+[^/]+/'
find $temp_out_path -type f | grep -Eo $folders_with_version_regex | copy_files_or_dirs_from_list $temp_out_path $out_path false find "$temp_out_path" -type f | grep -Eo "$folders_with_version_regex" | copy_files_or_dirs_from_list "$temp_out_path" "$out_path" false
find $temp_out_path -type f | grep -Ev $folders_with_version_regex | copy_files_or_dirs_from_list $temp_out_path $out_path $override_non_versioned_files find "$temp_out_path" -type f | grep -Ev "$folders_with_version_regex" | copy_files_or_dirs_from_list "$temp_out_path" "$out_path" "$override_non_versioned_files"
rm -rf $temp_out_path rm -rf "$temp_out_path"
if [ "$failed" = true ]; then if [ "$failed" = true ]; then
say_err "Extraction failed" say_err "Extraction failed"
@ -581,14 +581,14 @@ extract_dotnet_package() {
download() { download() {
eval $invocation eval $invocation
local remote_path=$1 local remote_path="$1"
local out_path=${2:-} local out_path="${2:-}"
local failed=false local failed=false
if machine_has "curl"; then if machine_has "curl"; then
downloadcurl $remote_path $out_path || failed=true downloadcurl "$remote_path" "$out_path" || failed=true
elif machine_has "wget"; then elif machine_has "wget"; then
downloadwget $remote_path $out_path || failed=true downloadwget "$remote_path" "$out_path" || failed=true
else else
failed=true failed=true
fi fi
@ -601,14 +601,14 @@ download() {
downloadcurl() { downloadcurl() {
eval $invocation eval $invocation
local remote_path=$1 local remote_path="$1"
local out_path=${2:-} local out_path="${2:-}"
local failed=false local failed=false
if [ -z "$out_path" ]; then if [ -z "$out_path" ]; then
curl --retry 10 -sSL -f --create-dirs $remote_path || failed=true curl --retry 10 -sSL -f --create-dirs "$remote_path" || failed=true
else else
curl --retry 10 -sSL -f --create-dirs -o $out_path $remote_path || failed=true curl --retry 10 -sSL -f --create-dirs -o "$out_path" "$remote_path" || failed=true
fi fi
if [ "$failed" = true ]; then if [ "$failed" = true ]; then
say_verbose "Curl download failed" say_verbose "Curl download failed"
@ -619,14 +619,14 @@ downloadcurl() {
downloadwget() { downloadwget() {
eval $invocation eval $invocation
local remote_path=$1 local remote_path="$1"
local out_path=${2:-} local out_path="${2:-}"
local failed=false local failed=false
if [ -z "$out_path" ]; then if [ -z "$out_path" ]; then
wget -q --tries 10 -O - $remote_path || failed=true wget -q --tries 10 -O - "$remote_path" || failed=true
else else
wget -v --tries 10 -O $out_path $remote_path || failed=true wget -v --tries 10 -O "$out_path" "$remote_path" || failed=true
fi fi
if [ "$failed" = true ]; then if [ "$failed" = true ]; then
say_verbose "Wget download failed" say_verbose "Wget download failed"
@ -639,20 +639,20 @@ calculate_vars() {
eval $invocation eval $invocation
valid_legacy_download_link=true valid_legacy_download_link=true
normalized_architecture=$(get_normalized_architecture_from_architecture "$architecture") normalized_architecture="$(get_normalized_architecture_from_architecture "$architecture")"
say_verbose "normalized_architecture=$normalized_architecture" say_verbose "normalized_architecture=$normalized_architecture"
specific_version=$(get_specific_version_from_version $azure_feed $channel $normalized_architecture $version) specific_version="$(get_specific_version_from_version "$azure_feed" "$channel" "$normalized_architecture" "$version")"
say_verbose "specific_version=$specific_version" say_verbose "specific_version=$specific_version"
if [ -z "$specific_version" ]; then if [ -z "$specific_version" ]; then
say_err "Could not get version information." say_err "Could not get version information."
return 1 return 1
fi fi
download_link=$(construct_download_link $azure_feed $channel $normalized_architecture $specific_version) download_link="$(construct_download_link "$azure_feed" "$channel" "$normalized_architecture" "$specific_version")"
say_verbose "download_link=$download_link" say_verbose "download_link=$download_link"
legacy_download_link=$(construct_legacy_download_link $azure_feed $channel $normalized_architecture $specific_version) || valid_legacy_download_link=false legacy_download_link="$(construct_legacy_download_link "$azure_feed" "$channel" "$normalized_architecture" "$specific_version")" || valid_legacy_download_link=false
if [ "$valid_legacy_download_link" = true ]; then if [ "$valid_legacy_download_link" = true ]; then
say_verbose "legacy_download_link=$legacy_download_link" say_verbose "legacy_download_link=$legacy_download_link"
@ -660,7 +660,7 @@ calculate_vars() {
say_verbose "Cound not construct a legacy_download_link; omitting..." say_verbose "Cound not construct a legacy_download_link; omitting..."
fi fi
install_root=$(resolve_installation_path $install_dir) install_root="$(resolve_installation_path "$install_dir")"
say_verbose "install_root=$install_root" say_verbose "install_root=$install_root"
} }
@ -668,32 +668,33 @@ install_dotnet() {
eval $invocation eval $invocation
local download_failed=false local download_failed=false
if is_dotnet_package_installed $install_root "sdk" $specific_version; then if is_dotnet_package_installed "$install_root" "sdk" "$specific_version"; then
say ".NET SDK version $specific_version is already installed." say ".NET SDK version $specific_version is already installed."
return 0 return 0
fi fi
mkdir -p $install_root mkdir -p "$install_root"
zip_path=$(mktemp $temporary_file_template) zip_path="$(mktemp "$temporary_file_template")"
say_verbose "Zip path: $zip_path" say_verbose "Zip path: $zip_path"
say "Downloading link: $download_link" say "Downloading link: $download_link"
# Failures are normal in the non-legacy case for ultimately legacy downloads. # Failures are normal in the non-legacy case for ultimately legacy downloads.
# Do not output to stderr, since output to stderr is considered an error. # Do not output to stderr, since output to stderr is considered an error.
download "$download_link" $zip_path 2>&1 || download_failed=true download "$download_link" "$zip_path" 2>&1 || download_failed=true
# if the download fails, download the legacy_download_link # if the download fails, download the legacy_download_link
if [ "$download_failed" = true ] && [ "$valid_legacy_download_link" = true ]; then if [ "$download_failed" = true ] && [ "$valid_legacy_download_link" = true ]; then
say "Cannot download: $download_link" say "Cannot download: $download_link"
download_link=$legacy_download_link download_link="$legacy_download_link"
zip_path=$(mktemp $temporary_file_template) zip_path="$(mktemp "$temporary_file_template")"
say_verbose "Legacy zip path: $zip_path" say_verbose "Legacy zip path: $zip_path"
say "Downloading legacy link: $download_link" say "Downloading legacy link: $download_link"
download "$download_link" $zip_path download "$download_link" "$zip_path"
fi fi
say "Extracting zip from $download_link" say "Extracting zip from $download_link"
extract_dotnet_package $zip_path $install_root extract_dotnet_package "$zip_path" "$install_root"
return 0 return 0
} }
@ -717,11 +718,11 @@ override_non_versioned_files=true
while [ $# -ne 0 ] while [ $# -ne 0 ]
do do
name=$1 name="$1"
case $name in case "$name" in
-c|--channel|-[Cc]hannel) -c|--channel|-[Cc]hannel)
shift shift
channel=$1 channel="$1"
;; ;;
-v|--version|-[Vv]ersion) -v|--version|-[Vv]ersion)
shift shift
@ -764,7 +765,7 @@ do
override_non_versioned_files=false override_non_versioned_files=false
;; ;;
-?|--?|-h|--help|-[Hh]elp) -?|--?|-h|--help|-[Hh]elp)
script_name="$(basename $0)" script_name="$(basename "$0")"
echo ".NET Tools Installer" echo ".NET Tools Installer"
echo "Usage: $script_name [-c|--channel <CHANNEL>] [-v|--version <VERSION>] [-p|--prefix <DESTINATION>]" echo "Usage: $script_name [-c|--channel <CHANNEL>] [-v|--version <VERSION>] [-p|--prefix <DESTINATION>]"
echo " $script_name -h|-?|--help" echo " $script_name -h|-?|--help"
@ -830,17 +831,17 @@ if [ "$dry_run" = true ]; then
if [ "$valid_legacy_download_link" = true ]; then if [ "$valid_legacy_download_link" = true ]; then
say "Legacy payload URL: $legacy_download_link" say "Legacy payload URL: $legacy_download_link"
fi fi
say "Repeatable invocation: ./$(basename $0) --version $specific_version --channel $channel --install-dir $install_dir" say "Repeatable invocation: ./$(basename "$0") --version $specific_version --channel $channel --install-dir $install_dir"
exit 0 exit 0
fi fi
check_pre_reqs check_pre_reqs
install_dotnet install_dotnet
bin_path=$(get_absolute_path $(combine_paths $install_root $bin_folder_relative_path)) bin_path="$(get_absolute_path "$(combine_paths "$install_root" "$bin_folder_relative_path")")"
if [ "$no_path" = false ]; then if [ "$no_path" = false ]; then
say "Adding to current process PATH: \`$bin_path\`. Note: This change will be visible only when sourcing script." say "Adding to current process PATH: \`$bin_path\`. Note: This change will be visible only when sourcing script."
export PATH=$bin_path:$PATH export PATH="$bin_path":"$PATH"
else else
say "Binaries of dotnet can be found in $bin_path" say "Binaries of dotnet can be found in $bin_path"
fi fi