You've already forked setup-dotnet
							
							
				mirror of
				https://github.com/actions/setup-dotnet.git
				synced 2025-10-30 23:07:55 +07:00 
			
		
		
		
	Compare commits
	
		
			2 Commits
		
	
	
		
			v3.4.1
			...
			remove-fal
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| c1da47a992 | |||
| 71a4fd9b27 | 
							
								
								
									
										2
									
								
								.github/workflows/check-dist.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/check-dist.yml
									
									
									
									
										vendored
									
									
								
							| @ -44,7 +44,7 @@ jobs: | |||||||
|         id: diff |         id: diff | ||||||
|  |  | ||||||
|       # If index.js was different than expected, upload the expected version as an artifact |       # If index.js was different than expected, upload the expected version as an artifact | ||||||
|       - uses: actions/upload-artifact@v2 |       - uses: actions/upload-artifact@v4 | ||||||
|         if: ${{ failure() && steps.diff.conclusion == 'failure' }} |         if: ${{ failure() && steps.diff.conclusion == 'failure' }} | ||||||
|         with: |         with: | ||||||
|           name: dist |           name: dist | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								.github/workflows/test-dotnet.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/test-dotnet.yml
									
									
									
									
										vendored
									
									
								
							| @ -17,7 +17,7 @@ jobs: | |||||||
|     strategy: |     strategy: | ||||||
|       fail-fast: false |       fail-fast: false | ||||||
|       matrix: |       matrix: | ||||||
|         operating-system: [ubuntu-latest, windows-latest, macOS-latest] |         operating-system: [ubuntu-22.04, windows-latest, macOS-latest] | ||||||
|         dotnet-version: ['2.1', '2.2', '3.0', '3.1', '5.0'] |         dotnet-version: ['2.1', '2.2', '3.0', '3.1', '5.0'] | ||||||
|     steps: |     steps: | ||||||
|       - name: Checkout |       - name: Checkout | ||||||
|  | |||||||
							
								
								
									
										24
									
								
								.github/workflows/workflow.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								.github/workflows/workflow.yml
									
									
									
									
										vendored
									
									
								
							| @ -17,7 +17,7 @@ jobs: | |||||||
|     strategy: |     strategy: | ||||||
|       fail-fast: false |       fail-fast: false | ||||||
|       matrix: |       matrix: | ||||||
|         operating-system: [ubuntu-latest, windows-latest, macOS-latest] |         operating-system: [ubuntu-22.04, windows-latest, macos-13] | ||||||
|     steps: |     steps: | ||||||
|     - name: Checkout |     - name: Checkout | ||||||
|       uses: actions/checkout@v2 |       uses: actions/checkout@v2 | ||||||
| @ -38,7 +38,7 @@ jobs: | |||||||
|     strategy: |     strategy: | ||||||
|       fail-fast: false |       fail-fast: false | ||||||
|       matrix: |       matrix: | ||||||
|         operating-system: [ubuntu-latest, windows-latest, macOS-latest] |         operating-system: [ubuntu-22.04, windows-latest, macOS-latest] | ||||||
|     steps: |     steps: | ||||||
|       - name: Checkout |       - name: Checkout | ||||||
|         uses: actions/checkout@v2 |         uses: actions/checkout@v2 | ||||||
| @ -61,7 +61,7 @@ jobs: | |||||||
|     strategy: |     strategy: | ||||||
|       fail-fast: false |       fail-fast: false | ||||||
|       matrix: |       matrix: | ||||||
|         operating-system: [ubuntu-latest, windows-latest, macOS-latest] |         operating-system: [ubuntu-22.04, windows-latest, macos-13] | ||||||
|     steps: |     steps: | ||||||
|       - name: Checkout |       - name: Checkout | ||||||
|         uses: actions/checkout@v2 |         uses: actions/checkout@v2 | ||||||
| @ -94,7 +94,7 @@ jobs: | |||||||
|     strategy: |     strategy: | ||||||
|       fail-fast: false |       fail-fast: false | ||||||
|       matrix: |       matrix: | ||||||
|         operating-system: [ubuntu-latest, windows-latest, macOS-latest] |         operating-system: [ubuntu-22.04, windows-latest, macOS-latest] | ||||||
|     steps: |     steps: | ||||||
|       - name: Checkout |       - name: Checkout | ||||||
|         uses: actions/checkout@v2 |         uses: actions/checkout@v2 | ||||||
| @ -119,7 +119,7 @@ jobs: | |||||||
|     strategy: |     strategy: | ||||||
|       fail-fast: false |       fail-fast: false | ||||||
|       matrix: |       matrix: | ||||||
|         operating-system: [ubuntu-latest, windows-latest, macOS-latest] |         operating-system: [ubuntu-22.04, windows-latest, macOS-latest] | ||||||
|     steps: |     steps: | ||||||
|       - name: Checkout |       - name: Checkout | ||||||
|         uses: actions/checkout@v2 |         uses: actions/checkout@v2 | ||||||
| @ -143,7 +143,7 @@ jobs: | |||||||
|     strategy: |     strategy: | ||||||
|       fail-fast: false |       fail-fast: false | ||||||
|       matrix: |       matrix: | ||||||
|         operating-system: [ubuntu-latest, windows-latest, macOS-latest] |         operating-system: [ubuntu-22.04, windows-latest, macOS-latest] | ||||||
|     steps: |     steps: | ||||||
|       - name: Checkout |       - name: Checkout | ||||||
|         uses: actions/checkout@v2 |         uses: actions/checkout@v2 | ||||||
| @ -163,18 +163,20 @@ jobs: | |||||||
|         run: __tests__/verify-dotnet.ps1 3.1 2.2 |         run: __tests__/verify-dotnet.ps1 3.1 2.2 | ||||||
|  |  | ||||||
|   test-proxy: |   test-proxy: | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-20.04 | ||||||
|     container: |     container: | ||||||
|       image: mcr.microsoft.com/dotnet/core/runtime-deps:3.0-bionic |       image: ubuntu:20.04 | ||||||
|       options: --dns 127.0.0.1 |       options: --dns 127.0.0.1 | ||||||
|     services: |     services: | ||||||
|       squid-proxy: |       squid-proxy: | ||||||
|         image: datadog/squid:latest |         image: ubuntu/squid:latest | ||||||
|         ports: |         ports: | ||||||
|           - 3128:3128 |           - 3128:3128 | ||||||
|     env: |     env: | ||||||
|       https_proxy: http://squid-proxy:3128 |       https_proxy: http://squid-proxy:3128 | ||||||
|       http_proxy: http://squid-proxy:3128 |       http_proxy: http://squid-proxy:3128 | ||||||
|  |       DOTNET_SYSTEM_GLOBALIZATION_INVARIANT: true | ||||||
|  |  | ||||||
|     steps: |     steps: | ||||||
|       - name: Checkout |       - name: Checkout | ||||||
|         uses: actions/checkout@v2 |         uses: actions/checkout@v2 | ||||||
| @ -183,7 +185,7 @@ jobs: | |||||||
|       - name: Install curl |       - name: Install curl | ||||||
|         run: | |         run: | | ||||||
|           apt update |           apt update | ||||||
|           apt -y install curl |           apt -y install curl libssl-dev | ||||||
|       - name: Setup dotnet 3.1.201 |       - name: Setup dotnet 3.1.201 | ||||||
|         uses: ./ |         uses: ./ | ||||||
|         with: |         with: | ||||||
| @ -195,7 +197,7 @@ jobs: | |||||||
|         run: __tests__/verify-dotnet.sh 3.1.201 |         run: __tests__/verify-dotnet.sh 3.1.201 | ||||||
|  |  | ||||||
|   test-bypass-proxy: |   test-bypass-proxy: | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-22.04 | ||||||
|     env: |     env: | ||||||
|       https_proxy: http://no-such-proxy:3128 |       https_proxy: http://no-such-proxy:3128 | ||||||
|       no_proxy: github.com,dotnetcli.blob.core.windows.net,download.visualstudio.microsoft.com,api.nuget.org,dotnetcli.azureedge.net |       no_proxy: github.com,dotnetcli.blob.core.windows.net,download.visualstudio.microsoft.com,api.nuget.org,dotnetcli.azureedge.net | ||||||
|  | |||||||
							
								
								
									
										3
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							| @ -18169,6 +18169,7 @@ class DotnetCoreInstaller { | |||||||
|     getReleasesJsonUrl(httpClient, versionParts) { |     getReleasesJsonUrl(httpClient, versionParts) { | ||||||
|         return __awaiter(this, void 0, void 0, function* () { |         return __awaiter(this, void 0, void 0, function* () { | ||||||
|             const response = yield httpClient.getJson(DotNetCoreIndexUrl); |             const response = yield httpClient.getJson(DotNetCoreIndexUrl); | ||||||
|  |  | ||||||
|             const result = response.result || {}; |             const result = response.result || {}; | ||||||
|             let releasesInfo = result['releases-index']; |             let releasesInfo = result['releases-index']; | ||||||
|             releasesInfo = releasesInfo.filter((info) => { |             releasesInfo = releasesInfo.filter((info) => { | ||||||
| @ -18192,7 +18193,7 @@ class DotnetCoreInstaller { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| exports.DotnetCoreInstaller = DotnetCoreInstaller; | exports.DotnetCoreInstaller = DotnetCoreInstaller; | ||||||
| const DotNetCoreIndexUrl = 'https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/releases-index.json'; | const DotNetCoreIndexUrl = 'https://builds.dotnet.microsoft.com/dotnet/release-metadata/releases-index.json'; | ||||||
|  |  | ||||||
|  |  | ||||||
| /***/ }), | /***/ }), | ||||||
|  | |||||||
							
								
								
									
										3085
									
								
								externals/install-dotnet.ps1
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3085
									
								
								externals/install-dotnet.ps1
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										450
									
								
								externals/install-dotnet.sh
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										450
									
								
								externals/install-dotnet.sh
									
									
									
									
										vendored
									
									
								
							| @ -298,14 +298,43 @@ get_machine_architecture() { | |||||||
|     if command -v uname > /dev/null; then |     if command -v uname > /dev/null; then | ||||||
|         CPUName=$(uname -m) |         CPUName=$(uname -m) | ||||||
|         case $CPUName in |         case $CPUName in | ||||||
|  |         armv1*|armv2*|armv3*|armv4*|armv5*|armv6*) | ||||||
|  |             echo "armv6-or-below" | ||||||
|  |             return 0 | ||||||
|  |             ;; | ||||||
|         armv*l) |         armv*l) | ||||||
|             echo "arm" |             echo "arm" | ||||||
|             return 0 |             return 0 | ||||||
|             ;; |             ;; | ||||||
|         aarch64|arm64) |         aarch64|arm64) | ||||||
|  |             if [ "$(getconf LONG_BIT)" -lt 64 ]; then | ||||||
|  |                 # This is 32-bit OS running on 64-bit CPU (for example Raspberry Pi OS) | ||||||
|  |                 echo "arm" | ||||||
|  |                 return 0 | ||||||
|  |             fi | ||||||
|             echo "arm64" |             echo "arm64" | ||||||
|             return 0 |             return 0 | ||||||
|             ;; |             ;; | ||||||
|  |         s390x) | ||||||
|  |             echo "s390x" | ||||||
|  |             return 0 | ||||||
|  |             ;; | ||||||
|  |         ppc64le) | ||||||
|  |             echo "ppc64le" | ||||||
|  |             return 0 | ||||||
|  |             ;; | ||||||
|  |         loongarch64) | ||||||
|  |             echo "loongarch64" | ||||||
|  |             return 0 | ||||||
|  |             ;; | ||||||
|  |         riscv64) | ||||||
|  |             echo "riscv64" | ||||||
|  |             return 0 | ||||||
|  |             ;; | ||||||
|  |         powerpc|ppc) | ||||||
|  |             echo "ppc" | ||||||
|  |             return 0 | ||||||
|  |             ;; | ||||||
|         esac |         esac | ||||||
|     fi |     fi | ||||||
|  |  | ||||||
| @ -322,7 +351,13 @@ get_normalized_architecture_from_architecture() { | |||||||
|     local architecture="$(to_lowercase "$1")" |     local architecture="$(to_lowercase "$1")" | ||||||
|  |  | ||||||
|     if [[ $architecture == \<auto\> ]]; then |     if [[ $architecture == \<auto\> ]]; then | ||||||
|         echo "$(get_machine_architecture)" |         machine_architecture="$(get_machine_architecture)" | ||||||
|  |         if [[ "$machine_architecture" == "armv6-or-below" ]]; then | ||||||
|  |             say_err "Architecture \`$machine_architecture\` not supported. If you think this is a bug, report it at https://github.com/dotnet/install-scripts/issues" | ||||||
|  |             return 1 | ||||||
|  |         fi | ||||||
|  |  | ||||||
|  |         echo $machine_architecture | ||||||
|         return 0 |         return 0 | ||||||
|     fi |     fi | ||||||
|  |  | ||||||
| @ -339,12 +374,72 @@ get_normalized_architecture_from_architecture() { | |||||||
|             echo "arm64" |             echo "arm64" | ||||||
|             return 0 |             return 0 | ||||||
|             ;; |             ;; | ||||||
|  |         s390x) | ||||||
|  |             echo "s390x" | ||||||
|  |             return 0 | ||||||
|  |             ;; | ||||||
|  |         ppc64le) | ||||||
|  |             echo "ppc64le" | ||||||
|  |             return 0 | ||||||
|  |             ;; | ||||||
|  |         loongarch64) | ||||||
|  |             echo "loongarch64" | ||||||
|  |             return 0 | ||||||
|  |             ;; | ||||||
|     esac |     esac | ||||||
|  |  | ||||||
|     say_err "Architecture \`$architecture\` not supported. If you think this is a bug, report it at https://github.com/dotnet/install-scripts/issues" |     say_err "Architecture \`$architecture\` not supported. If you think this is a bug, report it at https://github.com/dotnet/install-scripts/issues" | ||||||
|     return 1 |     return 1 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | # args: | ||||||
|  | # version - $1 | ||||||
|  | # channel - $2 | ||||||
|  | # architecture - $3 | ||||||
|  | get_normalized_architecture_for_specific_sdk_version() { | ||||||
|  |     eval $invocation | ||||||
|  |  | ||||||
|  |     local is_version_support_arm64="$(is_arm64_supported "$1")" | ||||||
|  |     local is_channel_support_arm64="$(is_arm64_supported "$2")" | ||||||
|  |     local architecture="$3"; | ||||||
|  |     local osname="$(get_current_os_name)" | ||||||
|  |  | ||||||
|  |     if [ "$osname" == "osx" ] && [ "$architecture" == "arm64" ] && { [ "$is_version_support_arm64" = false ] || [ "$is_channel_support_arm64" = false ]; }; then | ||||||
|  |         #check if rosetta is installed | ||||||
|  |         if [ "$(/usr/bin/pgrep oahd >/dev/null 2>&1;echo $?)" -eq 0 ]; then  | ||||||
|  |             say_verbose "Changing user architecture from '$architecture' to 'x64' because .NET SDKs prior to version 6.0 do not support arm64."  | ||||||
|  |             echo "x64" | ||||||
|  |             return 0; | ||||||
|  |         else | ||||||
|  |             say_err "Architecture \`$architecture\` is not supported for .NET SDK version \`$version\`. Please install Rosetta to allow emulation of the \`$architecture\` .NET SDK on this platform" | ||||||
|  |             return 1 | ||||||
|  |         fi | ||||||
|  |     fi | ||||||
|  |  | ||||||
|  |     echo "$architecture" | ||||||
|  |     return 0 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | # args: | ||||||
|  | # version or channel - $1 | ||||||
|  | is_arm64_supported() { | ||||||
|  |     # Extract the major version by splitting on the dot | ||||||
|  |     major_version="${1%%.*}" | ||||||
|  |  | ||||||
|  |     # Check if the major version is a valid number and less than 6 | ||||||
|  |     case "$major_version" in | ||||||
|  |         [0-9]*)   | ||||||
|  |             if [ "$major_version" -lt 6 ]; then | ||||||
|  |                 echo false | ||||||
|  |                 return 0 | ||||||
|  |             fi | ||||||
|  |             ;; | ||||||
|  |     esac | ||||||
|  |  | ||||||
|  |     echo true | ||||||
|  |     return 0 | ||||||
|  | } | ||||||
|  |  | ||||||
| # args: | # args: | ||||||
| # user_defined_os - $1 | # user_defined_os - $1 | ||||||
| get_normalized_os() { | get_normalized_os() { | ||||||
| @ -357,8 +452,13 @@ get_normalized_os() { | |||||||
|                 echo "$osname" |                 echo "$osname" | ||||||
|                 return 0 |                 return 0 | ||||||
|                 ;; |                 ;; | ||||||
|  |             macos) | ||||||
|  |                 osname='osx' | ||||||
|  |                 echo "$osname" | ||||||
|  |                 return 0 | ||||||
|  |                 ;; | ||||||
|             *) |             *) | ||||||
|                 say_err "'$user_defined_os' is not a supported value for --os option, supported values are: osx, linux, linux-musl, freebsd, rhel.6. If you think this is a bug, report it at https://github.com/dotnet/install-scripts/issues." |                 say_err "'$user_defined_os' is not a supported value for --os option, supported values are: osx, macos, linux, linux-musl, freebsd, rhel.6. If you think this is a bug, report it at https://github.com/dotnet/install-scripts/issues." | ||||||
|                 return 1 |                 return 1 | ||||||
|                 ;; |                 ;; | ||||||
|         esac |         esac | ||||||
| @ -401,6 +501,10 @@ get_normalized_channel() { | |||||||
|  |  | ||||||
|     local channel="$(to_lowercase "$1")" |     local channel="$(to_lowercase "$1")" | ||||||
|  |  | ||||||
|  |     if [[ $channel == current ]]; then | ||||||
|  |         say_warning 'Value "Current" is deprecated for -Channel option. Use "STS" instead.' | ||||||
|  |     fi | ||||||
|  |  | ||||||
|     if [[ $channel == release/* ]]; then |     if [[ $channel == release/* ]]; then | ||||||
|         say_warning 'Using branch name with -Channel option is no longer supported with newer releases. Use -Quality option with a channel in X.Y format instead.'; |         say_warning 'Using branch name with -Channel option is no longer supported with newer releases. Use -Quality option with a channel in X.Y format instead.'; | ||||||
|     fi |     fi | ||||||
| @ -411,6 +515,14 @@ get_normalized_channel() { | |||||||
|                 echo "LTS" |                 echo "LTS" | ||||||
|                 return 0 |                 return 0 | ||||||
|                 ;; |                 ;; | ||||||
|  |             sts) | ||||||
|  |                 echo "STS" | ||||||
|  |                 return 0 | ||||||
|  |                 ;; | ||||||
|  |             current) | ||||||
|  |                 echo "STS" | ||||||
|  |                 return 0 | ||||||
|  |                 ;; | ||||||
|             *) |             *) | ||||||
|                 echo "$channel" |                 echo "$channel" | ||||||
|                 return 0 |                 return 0 | ||||||
| @ -476,6 +588,40 @@ is_dotnet_package_installed() { | |||||||
|     fi |     fi | ||||||
| } | } | ||||||
|  |  | ||||||
|  | # args: | ||||||
|  | # downloaded file - $1 | ||||||
|  | # remote_file_size - $2 | ||||||
|  | validate_remote_local_file_sizes()  | ||||||
|  | { | ||||||
|  |     eval $invocation | ||||||
|  |  | ||||||
|  |     local downloaded_file="$1" | ||||||
|  |     local remote_file_size="$2" | ||||||
|  |     local file_size='' | ||||||
|  |  | ||||||
|  |     if [[ "$OSTYPE" == "linux-gnu"* ]]; then | ||||||
|  |         file_size="$(stat -c '%s' "$downloaded_file")" | ||||||
|  |     elif [[ "$OSTYPE" == "darwin"* ]]; then | ||||||
|  |         # hardcode in order to avoid conflicts with GNU stat | ||||||
|  |         file_size="$(/usr/bin/stat -f '%z' "$downloaded_file")" | ||||||
|  |     fi   | ||||||
|  |      | ||||||
|  |     if [ -n "$file_size" ]; then | ||||||
|  |         say "Downloaded file size is $file_size bytes." | ||||||
|  |  | ||||||
|  |         if [ -n "$remote_file_size" ] && [ -n "$file_size" ]; then | ||||||
|  |             if [ "$remote_file_size" -ne "$file_size" ]; then | ||||||
|  |                 say "The remote and local file sizes are not equal. The remote file size is $remote_file_size bytes and the local size is $file_size bytes. The local package may be corrupted." | ||||||
|  |             else | ||||||
|  |                 say "The remote and local file sizes are equal." | ||||||
|  |             fi | ||||||
|  |         fi | ||||||
|  |          | ||||||
|  |     else | ||||||
|  |         say "Either downloaded or local package size can not be measured. One of them may be corrupted."       | ||||||
|  |     fi  | ||||||
|  | } | ||||||
|  |  | ||||||
| # args: | # args: | ||||||
| # azure_feed - $1 | # azure_feed - $1 | ||||||
| # channel - $2 | # channel - $2 | ||||||
| @ -515,7 +661,7 @@ parse_globaljson_file_for_version() { | |||||||
|         return 1 |         return 1 | ||||||
|     fi |     fi | ||||||
|  |  | ||||||
|     sdk_section=$(cat $json_file | awk '/"sdk"/,/}/') |     sdk_section=$(cat $json_file | tr -d "\r" | awk '/"sdk"/,/}/') | ||||||
|     if [ -z "$sdk_section" ]; then |     if [ -z "$sdk_section" ]; then | ||||||
|         say_err "Unable to parse the SDK node in \`$json_file\`" |         say_err "Unable to parse the SDK node in \`$json_file\`" | ||||||
|         return 1 |         return 1 | ||||||
| @ -637,11 +783,13 @@ get_specific_product_version() { | |||||||
|  |  | ||||||
|         if machine_has "curl" |         if machine_has "curl" | ||||||
|         then |         then | ||||||
|             specific_product_version=$(curl -s --fail "${download_link}${feed_credential}" 2>&1) |             if ! specific_product_version=$(curl -s --fail "${download_link}${feed_credential}" 2>&1); then | ||||||
|             if [ $? = 0 ]; then |                 continue | ||||||
|  |             else | ||||||
|                 echo "${specific_product_version//[$'\t\r\n']}" |                 echo "${specific_product_version//[$'\t\r\n']}" | ||||||
|                 return 0 |                 return 0 | ||||||
|             fi |             fi | ||||||
|  |  | ||||||
|         elif machine_has "wget" |         elif machine_has "wget" | ||||||
|         then |         then | ||||||
|             specific_product_version=$(wget -qO- "${download_link}${feed_credential}" 2>&1) |             specific_product_version=$(wget -qO- "${download_link}${feed_credential}" 2>&1) | ||||||
| @ -808,6 +956,37 @@ get_absolute_path() { | |||||||
|     return 0 |     return 0 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | # args: | ||||||
|  | # override - $1 (boolean, true or false) | ||||||
|  | get_cp_options() { | ||||||
|  |     eval $invocation | ||||||
|  |  | ||||||
|  |     local override="$1" | ||||||
|  |     local override_switch="" | ||||||
|  |  | ||||||
|  |     if [ "$override" = false ]; then | ||||||
|  |         override_switch="-n" | ||||||
|  |  | ||||||
|  |         # create temporary files to check if 'cp -u' is supported | ||||||
|  |         tmp_dir="$(mktemp -d)" | ||||||
|  |         tmp_file="$tmp_dir/testfile" | ||||||
|  |         tmp_file2="$tmp_dir/testfile2" | ||||||
|  |  | ||||||
|  |         touch "$tmp_file" | ||||||
|  |  | ||||||
|  |         # use -u instead of -n if it's available | ||||||
|  |         if cp -u "$tmp_file" "$tmp_file2" 2>/dev/null; then | ||||||
|  |             override_switch="-u" | ||||||
|  |         fi | ||||||
|  |  | ||||||
|  |         # clean up | ||||||
|  |         rm -f "$tmp_file" "$tmp_file2" | ||||||
|  |         rm -rf "$tmp_dir" | ||||||
|  |     fi | ||||||
|  |  | ||||||
|  |     echo "$override_switch" | ||||||
|  | } | ||||||
|  |  | ||||||
| # args: | # args: | ||||||
| # input_files - stdin | # input_files - stdin | ||||||
| # root_path - $1 | # root_path - $1 | ||||||
| @ -819,15 +998,7 @@ copy_files_or_dirs_from_list() { | |||||||
|     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 osname="$(get_current_os_name)" |     local override_switch="$(get_cp_options "$override")" | ||||||
|     local override_switch=$( |  | ||||||
|         if [ "$override" = false ]; then |  | ||||||
|             if [ "$osname" = "linux-musl" ]; then |  | ||||||
|                 printf -- "-u"; |  | ||||||
|             else |  | ||||||
|                 printf -- "-n"; |  | ||||||
|             fi |  | ||||||
|         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}")" | ||||||
| @ -842,14 +1013,39 @@ copy_files_or_dirs_from_list() { | |||||||
|     done |     done | ||||||
| } | } | ||||||
|  |  | ||||||
|  | # args: | ||||||
|  | # zip_uri - $1 | ||||||
|  | get_remote_file_size() { | ||||||
|  |     local zip_uri="$1" | ||||||
|  |  | ||||||
|  |     if machine_has "curl"; then | ||||||
|  |         file_size=$(curl -sI  "$zip_uri" | grep -i content-length | awk '{ num = $2 + 0; print num }') | ||||||
|  |     elif machine_has "wget"; then | ||||||
|  |         file_size=$(wget --spider --server-response -O /dev/null "$zip_uri" 2>&1 | grep -i 'Content-Length:' | awk '{ num = $2 + 0; print num }') | ||||||
|  |     else | ||||||
|  |         say "Neither curl nor wget is available on this system." | ||||||
|  |         return | ||||||
|  |     fi | ||||||
|  |  | ||||||
|  |     if [ -n "$file_size" ]; then | ||||||
|  |         say "Remote file $zip_uri size is $file_size bytes." | ||||||
|  |         echo "$file_size" | ||||||
|  |     else | ||||||
|  |         say_verbose "Content-Length header was not extracted for $zip_uri." | ||||||
|  |         echo "" | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  |  | ||||||
| # args: | # args: | ||||||
| # zip_path - $1 | # zip_path - $1 | ||||||
| # out_path - $2 | # out_path - $2 | ||||||
|  | # remote_file_size - $3 | ||||||
| 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 remote_file_size="$3" | ||||||
|  |  | ||||||
|     local temp_out_path="$(mktemp -d "$temporary_file_template")" |     local temp_out_path="$(mktemp -d "$temporary_file_template")" | ||||||
|  |  | ||||||
| @ -859,9 +1055,13 @@ extract_dotnet_package() { | |||||||
|     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" | sort | copy_files_or_dirs_from_list "$temp_out_path" "$out_path" false |     find "$temp_out_path" -type f | grep -Eo "$folders_with_version_regex" | sort | 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" | ||||||
|  |      | ||||||
|  |     validate_remote_local_file_sizes "$zip_path" "$remote_file_size" | ||||||
|  |      | ||||||
|     rm -rf "$temp_out_path" |     rm -rf "$temp_out_path" | ||||||
|     rm -f "$zip_path" && say_verbose "Temporary zip file $zip_path was removed" |     if [ -z ${keep_zip+x} ]; then | ||||||
|  |         rm -f "$zip_path" && say_verbose "Temporary archive file $zip_path was removed" | ||||||
|  |     fi | ||||||
|  |  | ||||||
|     if [ "$failed" = true ]; then |     if [ "$failed" = true ]; then | ||||||
|         say_err "Extraction failed" |         say_err "Extraction failed" | ||||||
| @ -921,9 +1121,15 @@ get_http_header_wget() { | |||||||
|     local remote_path="$1" |     local remote_path="$1" | ||||||
|     local disable_feed_credential="$2" |     local disable_feed_credential="$2" | ||||||
|     local wget_options="-q -S --spider --tries 5 " |     local wget_options="-q -S --spider --tries 5 " | ||||||
|     # Store options that aren't supported on all wget implementations separately. |  | ||||||
|     local wget_options_extra="--waitretry 2 --connect-timeout 15 " |     local wget_options_extra='' | ||||||
|     local wget_result='' |  | ||||||
|  |     # Test for options that aren't supported on all wget implementations. | ||||||
|  |     if [[ $(wget -h 2>&1 | grep -E 'waitretry|connect-timeout') ]]; then | ||||||
|  |         wget_options_extra="--waitretry 2 --connect-timeout 15 " | ||||||
|  |     else | ||||||
|  |         say "wget extra options are unavailable for this environment" | ||||||
|  |     fi | ||||||
|  |  | ||||||
|     remote_path_with_credential="$remote_path" |     remote_path_with_credential="$remote_path" | ||||||
|     if [ "$disable_feed_credential" = false ]; then |     if [ "$disable_feed_credential" = false ]; then | ||||||
| @ -931,15 +1137,8 @@ get_http_header_wget() { | |||||||
|     fi |     fi | ||||||
|  |  | ||||||
|     wget $wget_options $wget_options_extra "$remote_path_with_credential" 2>&1 |     wget $wget_options $wget_options_extra "$remote_path_with_credential" 2>&1 | ||||||
|     wget_result=$? |  | ||||||
|  |  | ||||||
|     if [[ $wget_result == 2 ]]; then |     return $? | ||||||
|         # Parsing of the command has failed. Exclude potentially unrecognized options and retry. |  | ||||||
|         wget $wget_options "$remote_path_with_credential" 2>&1 |  | ||||||
|         return $? |  | ||||||
|     fi |  | ||||||
|  |  | ||||||
|     return $wget_result |  | ||||||
| } | } | ||||||
|  |  | ||||||
| # args: | # args: | ||||||
| @ -979,8 +1178,6 @@ download() { | |||||||
|         sleep $((attempts*10)) |         sleep $((attempts*10)) | ||||||
|     done |     done | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     if [ "$failed" = true ]; then |     if [ "$failed" = true ]; then | ||||||
|         say_verbose "Download failed: $remote_path" |         say_verbose "Download failed: $remote_path" | ||||||
|         return 1 |         return 1 | ||||||
| @ -999,19 +1196,27 @@ downloadcurl() { | |||||||
|     # Avoid passing URI with credentials to functions: note, most of them echoing parameters of invocation in verbose output. |     # Avoid passing URI with credentials to functions: note, most of them echoing parameters of invocation in verbose output. | ||||||
|     local remote_path_with_credential="${remote_path}${feed_credential}" |     local remote_path_with_credential="${remote_path}${feed_credential}" | ||||||
|     local curl_options="--retry 20 --retry-delay 2 --connect-timeout 15 -sSL -f --create-dirs " |     local curl_options="--retry 20 --retry-delay 2 --connect-timeout 15 -sSL -f --create-dirs " | ||||||
|     local failed=false |     local curl_exit_code=0; | ||||||
|     if [ -z "$out_path" ]; then |     if [ -z "$out_path" ]; then | ||||||
|         curl $curl_options "$remote_path_with_credential" 2>&1 || failed=true |         curl $curl_options "$remote_path_with_credential" 2>&1 | ||||||
|  |         curl_exit_code=$? | ||||||
|     else |     else | ||||||
|         curl $curl_options -o "$out_path" "$remote_path_with_credential" 2>&1 || failed=true |         curl $curl_options -o "$out_path" "$remote_path_with_credential" 2>&1 | ||||||
|  |         curl_exit_code=$? | ||||||
|     fi |     fi | ||||||
|     if [ "$failed" = true ]; then |      | ||||||
|         local disable_feed_credential=false |     if [ $curl_exit_code -gt 0 ]; then | ||||||
|         local response=$(get_http_header_curl $remote_path $disable_feed_credential) |  | ||||||
|         http_code=$( echo "$response" | awk '/^HTTP/{print $2}' | tail -1 ) |  | ||||||
|         download_error_msg="Unable to download $remote_path." |         download_error_msg="Unable to download $remote_path." | ||||||
|         if  [[ $http_code != 2* ]]; then |         # Check for curl timeout codes | ||||||
|             download_error_msg+=" Returned HTTP status code: $http_code." |         if [[ $curl_exit_code == 7 || $curl_exit_code == 28 ]]; then | ||||||
|  |             download_error_msg+=" Failed to reach the server: connection timeout." | ||||||
|  |         else | ||||||
|  |             local disable_feed_credential=false | ||||||
|  |             local response=$(get_http_header_curl $remote_path $disable_feed_credential) | ||||||
|  |             http_code=$( echo "$response" | awk '/^HTTP/{print $2}' | tail -1 ) | ||||||
|  |             if  [[ ! -z $http_code && $http_code != 2* ]]; then | ||||||
|  |                 download_error_msg+=" Returned HTTP status code: $http_code." | ||||||
|  |             fi | ||||||
|         fi |         fi | ||||||
|         say_verbose "$download_error_msg" |         say_verbose "$download_error_msg" | ||||||
|         return 1 |         return 1 | ||||||
| @ -1030,10 +1235,17 @@ downloadwget() { | |||||||
|     # Append feed_credential as late as possible before calling wget to avoid logging feed_credential |     # Append feed_credential as late as possible before calling wget to avoid logging feed_credential | ||||||
|     local remote_path_with_credential="${remote_path}${feed_credential}" |     local remote_path_with_credential="${remote_path}${feed_credential}" | ||||||
|     local wget_options="--tries 20 " |     local wget_options="--tries 20 " | ||||||
|     # Store options that aren't supported on all wget implementations separately. |  | ||||||
|     local wget_options_extra="--waitretry 2 --connect-timeout 15 " |     local wget_options_extra='' | ||||||
|     local wget_result='' |     local wget_result='' | ||||||
|  |  | ||||||
|  |     # Test for options that aren't supported on all wget implementations. | ||||||
|  |     if [[ $(wget -h 2>&1 | grep -E 'waitretry|connect-timeout') ]]; then | ||||||
|  |         wget_options_extra="--waitretry 2 --connect-timeout 15 " | ||||||
|  |     else | ||||||
|  |         say "wget extra options are unavailable for this environment" | ||||||
|  |     fi | ||||||
|  |  | ||||||
|     if [ -z "$out_path" ]; then |     if [ -z "$out_path" ]; then | ||||||
|         wget -q $wget_options $wget_options_extra -O - "$remote_path_with_credential" 2>&1 |         wget -q $wget_options $wget_options_extra -O - "$remote_path_with_credential" 2>&1 | ||||||
|         wget_result=$? |         wget_result=$? | ||||||
| @ -1042,24 +1254,16 @@ downloadwget() { | |||||||
|         wget_result=$? |         wget_result=$? | ||||||
|     fi |     fi | ||||||
|  |  | ||||||
|     if [[ $wget_result == 2 ]]; then |  | ||||||
|         # Parsing of the command has failed. Exclude potentially unrecognized options and retry. |  | ||||||
|         if [ -z "$out_path" ]; then |  | ||||||
|             wget -q $wget_options -O - "$remote_path_with_credential" 2>&1 |  | ||||||
|             wget_result=$? |  | ||||||
|         else |  | ||||||
|             wget $wget_options -O "$out_path" "$remote_path_with_credential" 2>&1 |  | ||||||
|             wget_result=$? |  | ||||||
|         fi |  | ||||||
|     fi |  | ||||||
|  |  | ||||||
|     if [[ $wget_result != 0 ]]; then |     if [[ $wget_result != 0 ]]; then | ||||||
|         local disable_feed_credential=false |         local disable_feed_credential=false | ||||||
|         local response=$(get_http_header_wget $remote_path $disable_feed_credential) |         local response=$(get_http_header_wget $remote_path $disable_feed_credential) | ||||||
|         http_code=$( echo "$response" | awk '/^  HTTP/{print $2}' | tail -1 ) |         http_code=$( echo "$response" | awk '/^  HTTP/{print $2}' | tail -1 ) | ||||||
|         download_error_msg="Unable to download $remote_path." |         download_error_msg="Unable to download $remote_path." | ||||||
|         if  [[ $http_code != 2* ]]; then |         if  [[ ! -z $http_code && $http_code != 2* ]]; then | ||||||
|             download_error_msg+=" Returned HTTP status code: $http_code." |             download_error_msg+=" Returned HTTP status code: $http_code." | ||||||
|  |         # wget exit code 4 stands for network-issue | ||||||
|  |         elif [[ $wget_result == 4 ]]; then | ||||||
|  |             download_error_msg+=" Failed to reach the server: connection timeout." | ||||||
|         fi |         fi | ||||||
|         say_verbose "$download_error_msg" |         say_verbose "$download_error_msg" | ||||||
|         return 1 |         return 1 | ||||||
| @ -1068,13 +1272,69 @@ downloadwget() { | |||||||
|     return 0 |     return 0 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | extract_stem() { | ||||||
|  |     local url="$1" | ||||||
|  |     # extract the protocol | ||||||
|  |     proto="$(echo $1 | grep :// | sed -e's,^\(.*://\).*,\1,g')" | ||||||
|  |     # remove the protocol | ||||||
|  |     url="${1/$proto/}" | ||||||
|  |     # extract the path (if any) - since we know all of our feeds have a first path segment, we can skip the first one. otherwise we'd use -f2- to get the full path | ||||||
|  |     full_path="$(echo $url | grep / | cut -d/ -f2-)" | ||||||
|  |     path="$(echo $full_path | cut -d/ -f2-)" | ||||||
|  |     echo $path | ||||||
|  | } | ||||||
|  |  | ||||||
|  | check_url_exists() { | ||||||
|  |     eval $invocation | ||||||
|  |     local url="$1" | ||||||
|  |  | ||||||
|  |     local code="" | ||||||
|  |     if machine_has "curl" | ||||||
|  |     then | ||||||
|  |         code=$(curl --head -o /dev/null -w "%{http_code}" -s --fail "$url"); | ||||||
|  |     elif machine_has "wget" | ||||||
|  |     then | ||||||
|  |         # get the http response, grab the status code | ||||||
|  |         server_response=$(wget -qO- --method=HEAD --server-response "$url" 2>&1) | ||||||
|  |         code=$(echo "$server_response" | grep "HTTP/" | awk '{print $2}') | ||||||
|  |     fi | ||||||
|  |     if [ $code = "200" ]; then | ||||||
|  |         return 0 | ||||||
|  |     else | ||||||
|  |         return 1 | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sanitize_redirect_url() { | ||||||
|  |     eval $invocation | ||||||
|  |  | ||||||
|  |     local url_stem | ||||||
|  |     url_stem=$(extract_stem "$1") | ||||||
|  |     say_verbose "Checking configured feeds for the asset at ${yellow:-}$url_stem${normal:-}" | ||||||
|  |  | ||||||
|  |     for feed in "${feeds[@]}" | ||||||
|  |     do | ||||||
|  |         local trial_url="$feed/$url_stem" | ||||||
|  |         say_verbose "Checking ${yellow:-}$trial_url${normal:-}" | ||||||
|  |         if check_url_exists "$trial_url"; then | ||||||
|  |             say_verbose "Found a match at ${yellow:-}$trial_url${normal:-}" | ||||||
|  |             echo "$trial_url" | ||||||
|  |             return 0 | ||||||
|  |         else | ||||||
|  |             say_verbose "No match at ${yellow:-}$trial_url${normal:-}" | ||||||
|  |         fi | ||||||
|  |     done | ||||||
|  |     return 1 | ||||||
|  | } | ||||||
|  |  | ||||||
| get_download_link_from_aka_ms() { | get_download_link_from_aka_ms() { | ||||||
|     eval $invocation |     eval $invocation | ||||||
|  |  | ||||||
|     #quality is not supported for LTS or current channel |     #quality is not supported for LTS or STS channel | ||||||
|     if [[ ! -z "$normalized_quality"  && ("$normalized_channel" == "LTS" || "$normalized_channel" == "current") ]]; then |     #STS maps to current | ||||||
|  |     if [[ ! -z "$normalized_quality"  && ("$normalized_channel" == "LTS" || "$normalized_channel" == "STS") ]]; then | ||||||
|         normalized_quality="" |         normalized_quality="" | ||||||
|         say_warning "Specifying quality for current or LTS channel is not supported, the quality will be ignored." |         say_warning "Specifying quality for STS or LTS channel is not supported, the quality will be ignored." | ||||||
|     fi |     fi | ||||||
|  |  | ||||||
|     say_verbose "Retrieving primary payload URL from aka.ms for channel: '$normalized_channel', quality: '$normalized_quality', product: '$normalized_product', os: '$normalized_os', architecture: '$normalized_architecture'."  |     say_verbose "Retrieving primary payload URL from aka.ms for channel: '$normalized_channel', quality: '$normalized_quality', product: '$normalized_product', os: '$normalized_os', architecture: '$normalized_architecture'."  | ||||||
| @ -1103,6 +1363,12 @@ get_download_link_from_aka_ms() { | |||||||
|     http_codes=$( echo "$response" | awk '$1 ~ /^HTTP/ {print $2}' ) |     http_codes=$( echo "$response" | awk '$1 ~ /^HTTP/ {print $2}' ) | ||||||
|     # They all need to be 301, otherwise some links are broken (except for the last, which is not a redirect but 200 or 404). |     # They all need to be 301, otherwise some links are broken (except for the last, which is not a redirect but 200 or 404). | ||||||
|     broken_redirects=$( echo "$http_codes" | sed '$d' | grep -v '301' ) |     broken_redirects=$( echo "$http_codes" | sed '$d' | grep -v '301' ) | ||||||
|  |     # The response may end without final code 2xx/4xx/5xx somehow, e.g. network restrictions on www.bing.com causes redirecting to bing.com fails with connection refused. | ||||||
|  |     # In this case it should not exclude the last. | ||||||
|  |     last_http_code=$(  echo "$http_codes" | tail -n 1 ) | ||||||
|  |     if ! [[ $last_http_code =~ ^(2|4|5)[0-9][0-9]$ ]]; then | ||||||
|  |         broken_redirects=$( echo "$http_codes" | grep -v '301' ) | ||||||
|  |     fi | ||||||
|  |  | ||||||
|     # All HTTP codes are 301 (Moved Permanently), the redirect link exists. |     # All HTTP codes are 301 (Moved Permanently), the redirect link exists. | ||||||
|     if [[ -z "$broken_redirects" ]]; then |     if [[ -z "$broken_redirects" ]]; then | ||||||
| @ -1113,6 +1379,11 @@ get_download_link_from_aka_ms() { | |||||||
|             return 1 |             return 1 | ||||||
|         fi |         fi | ||||||
|  |  | ||||||
|  |         sanitized_redirect_url=$(sanitize_redirect_url "$aka_ms_download_link") | ||||||
|  |         if [[ -n "$sanitized_redirect_url" ]]; then | ||||||
|  |             aka_ms_download_link="$sanitized_redirect_url" | ||||||
|  |         fi | ||||||
|  |  | ||||||
|         say_verbose "The redirect location retrieved: '$aka_ms_download_link'." |         say_verbose "The redirect location retrieved: '$aka_ms_download_link'." | ||||||
|         return 0 |         return 0 | ||||||
|     else |     else | ||||||
| @ -1124,7 +1395,9 @@ get_download_link_from_aka_ms() { | |||||||
| get_feeds_to_use() | get_feeds_to_use() | ||||||
| { | { | ||||||
|     feeds=( |     feeds=( | ||||||
|  |     "https://builds.dotnet.microsoft.com/dotnet" | ||||||
|     "https://dotnetcli.azureedge.net/dotnet" |     "https://dotnetcli.azureedge.net/dotnet" | ||||||
|  |     "https://ci.dot.net/public" | ||||||
|     "https://dotnetbuilds.azureedge.net/public" |     "https://dotnetbuilds.azureedge.net/public" | ||||||
|     ) |     ) | ||||||
|  |  | ||||||
| @ -1182,6 +1455,11 @@ generate_akams_links() { | |||||||
|     local valid_aka_ms_link=true; |     local valid_aka_ms_link=true; | ||||||
|  |  | ||||||
|     normalized_version="$(to_lowercase "$version")" |     normalized_version="$(to_lowercase "$version")" | ||||||
|  |     if [[ "$normalized_version" != "latest" ]] && [ -n "$normalized_quality" ]; then | ||||||
|  |         say_err "Quality and Version options are not allowed to be specified simultaneously. See https://learn.microsoft.com/dotnet/core/tools/dotnet-install-script#options for details." | ||||||
|  |         return 1 | ||||||
|  |     fi | ||||||
|  |  | ||||||
|     if [[ -n "$json_file" || "$normalized_version" != "latest" ]]; then |     if [[ -n "$json_file" || "$normalized_version" != "latest" ]]; then | ||||||
|         # aka.ms links are not needed when exact version is specified via command or json file |         # aka.ms links are not needed when exact version is specified via command or json file | ||||||
|         return |         return | ||||||
| @ -1325,6 +1603,8 @@ calculate_vars() { | |||||||
|     install_root="$(resolve_installation_path "$install_dir")" |     install_root="$(resolve_installation_path "$install_dir")" | ||||||
|     say_verbose "InstallRoot: '$install_root'." |     say_verbose "InstallRoot: '$install_root'." | ||||||
|  |  | ||||||
|  |     normalized_architecture="$(get_normalized_architecture_for_specific_sdk_version "$version" "$normalized_channel" "$normalized_architecture")" | ||||||
|  |  | ||||||
|     if [[ "$runtime" == "dotnet" ]]; then |     if [[ "$runtime" == "dotnet" ]]; then | ||||||
|         asset_relative_path="shared/Microsoft.NETCore.App" |         asset_relative_path="shared/Microsoft.NETCore.App" | ||||||
|         asset_name=".NET Core Runtime" |         asset_name=".NET Core Runtime" | ||||||
| @ -1343,10 +1623,11 @@ install_dotnet() { | |||||||
|     eval $invocation |     eval $invocation | ||||||
|     local download_failed=false |     local download_failed=false | ||||||
|     local download_completed=false |     local download_completed=false | ||||||
|  |     local remote_file_size=0 | ||||||
|  |  | ||||||
|     mkdir -p "$install_root" |     mkdir -p "$install_root" | ||||||
|     zip_path="$(mktemp "$temporary_file_template")" |     zip_path="${zip_path:-$(mktemp "$temporary_file_template")}" | ||||||
|     say_verbose "Zip path: $zip_path" |     say_verbose "Archive path: $zip_path" | ||||||
|  |  | ||||||
|     for link_index in "${!download_links[@]}" |     for link_index in "${!download_links[@]}" | ||||||
|     do |     do | ||||||
| @ -1370,7 +1651,7 @@ install_dotnet() { | |||||||
|                 say "Failed to download $link_type link '$download_link': $download_error_msg" |                 say "Failed to download $link_type link '$download_link': $download_error_msg" | ||||||
|                 ;; |                 ;; | ||||||
|             esac |             esac | ||||||
|             rm -f "$zip_path" 2>&1 && say_verbose "Temporary zip file $zip_path was removed" |             rm -f "$zip_path" 2>&1 && say_verbose "Temporary archive file $zip_path was removed" | ||||||
|         else |         else | ||||||
|             download_completed=true |             download_completed=true | ||||||
|             break |             break | ||||||
| @ -1383,8 +1664,10 @@ install_dotnet() { | |||||||
|         return 1 |         return 1 | ||||||
|     fi |     fi | ||||||
|  |  | ||||||
|     say "Extracting zip from $download_link" |     remote_file_size="$(get_remote_file_size "$download_link")" | ||||||
|     extract_dotnet_package "$zip_path" "$install_root" || return 1 |  | ||||||
|  |     say "Extracting archive from $download_link" | ||||||
|  |     extract_dotnet_package "$zip_path" "$install_root" "$remote_file_size" || return 1 | ||||||
|  |  | ||||||
|     #  Check if the SDK version is installed; if not, fail the installation. |     #  Check if the SDK version is installed; if not, fail the installation. | ||||||
|     # if the version contains "RTM" or "servicing"; check if a 'release-type' SDK version is installed. |     # if the version contains "RTM" or "servicing"; check if a 'release-type' SDK version is installed. | ||||||
| @ -1395,6 +1678,7 @@ install_dotnet() { | |||||||
|         unset IFS; |         unset IFS; | ||||||
|         say_verbose "Checking installation: version = $release_version" |         say_verbose "Checking installation: version = $release_version" | ||||||
|         if is_dotnet_package_installed "$install_root" "$asset_relative_path" "$release_version"; then |         if is_dotnet_package_installed "$install_root" "$asset_relative_path" "$release_version"; then | ||||||
|  |             say "Installed version is $effective_version" | ||||||
|             return 0 |             return 0 | ||||||
|         fi |         fi | ||||||
|     fi |     fi | ||||||
| @ -1402,6 +1686,7 @@ install_dotnet() { | |||||||
|     #  Check if the standard SDK version is installed. |     #  Check if the standard SDK version is installed. | ||||||
|     say_verbose "Checking installation: version = $effective_version" |     say_verbose "Checking installation: version = $effective_version" | ||||||
|     if is_dotnet_package_installed "$install_root" "$asset_relative_path" "$effective_version"; then |     if is_dotnet_package_installed "$install_root" "$asset_relative_path" "$effective_version"; then | ||||||
|  |         say "Installed version is $effective_version" | ||||||
|         return 0 |         return 0 | ||||||
|     fi |     fi | ||||||
|  |  | ||||||
| @ -1532,36 +1817,53 @@ do | |||||||
|             override_non_versioned_files=false |             override_non_versioned_files=false | ||||||
|             non_dynamic_parameters+=" $name" |             non_dynamic_parameters+=" $name" | ||||||
|             ;; |             ;; | ||||||
|  |         --keep-zip|-[Kk]eep[Zz]ip) | ||||||
|  |             keep_zip=true | ||||||
|  |             non_dynamic_parameters+=" $name" | ||||||
|  |             ;; | ||||||
|  |         --zip-path|-[Zz]ip[Pp]ath) | ||||||
|  |             shift | ||||||
|  |             zip_path="$1" | ||||||
|  |             ;; | ||||||
|         -?|--?|-h|--help|-[Hh]elp) |         -?|--?|-h|--help|-[Hh]elp) | ||||||
|             script_name="$(basename "$0")" |             script_name="dotnet-install.sh" | ||||||
|             echo ".NET Tools Installer" |             echo ".NET Tools Installer" | ||||||
|             echo "Usage: $script_name [-c|--channel <CHANNEL>] [-v|--version <VERSION>] [-p|--prefix <DESTINATION>]" |             echo "Usage:" | ||||||
|  |             echo "       # Install a .NET SDK of a given Quality from a given Channel" | ||||||
|  |             echo "       $script_name [-c|--channel <CHANNEL>] [-q|--quality <QUALITY>]" | ||||||
|  |             echo "       # Install a .NET SDK of a specific public version" | ||||||
|  |             echo "       $script_name [-v|--version <VERSION>]" | ||||||
|             echo "       $script_name -h|-?|--help" |             echo "       $script_name -h|-?|--help" | ||||||
|             echo "" |             echo "" | ||||||
|             echo "$script_name is a simple command line interface for obtaining dotnet cli." |             echo "$script_name is a simple command line interface for obtaining dotnet cli." | ||||||
|  |             echo "    Note that the intended use of this script is for Continuous Integration (CI) scenarios, where:" | ||||||
|  |             echo "    - The SDK needs to be installed without user interaction and without admin rights." | ||||||
|  |             echo "    - The SDK installation doesn't need to persist across multiple CI runs." | ||||||
|  |             echo "    To set up a development environment or to run apps, use installers rather than this script. Visit https://dotnet.microsoft.com/download to get the installer." | ||||||
|             echo "" |             echo "" | ||||||
|             echo "Options:" |             echo "Options:" | ||||||
|             echo "  -c,--channel <CHANNEL>         Download from the channel specified, Defaults to \`$channel\`." |             echo "  -c,--channel <CHANNEL>         Download from the channel specified, Defaults to \`$channel\`." | ||||||
|             echo "      -Channel" |             echo "      -Channel" | ||||||
|             echo "          Possible values:" |             echo "          Possible values:" | ||||||
|             echo "          - Current - most current release" |             echo "          - STS - the most recent Standard Term Support release" | ||||||
|             echo "          - LTS - most current supported release" |             echo "          - LTS - the most recent Long Term Support release" | ||||||
|             echo "          - 2-part version in a format A.B - represents a specific release" |             echo "          - 2-part version in a format A.B - represents a specific release" | ||||||
|             echo "              examples: 2.0; 1.0" |             echo "              examples: 2.0; 1.0" | ||||||
|             echo "          - 3-part version in a format A.B.Cxx - represents a specific SDK release" |             echo "          - 3-part version in a format A.B.Cxx - represents a specific SDK release" | ||||||
|             echo "              examples: 5.0.1xx, 5.0.2xx." |             echo "              examples: 5.0.1xx, 5.0.2xx." | ||||||
|             echo "              Supported since 5.0 release" |             echo "              Supported since 5.0 release" | ||||||
|  |             echo "          Warning: Value 'Current' is deprecated for the Channel parameter. Use 'STS' instead." | ||||||
|             echo "          Note: The version parameter overrides the channel parameter when any version other than 'latest' is used." |             echo "          Note: The version parameter overrides the channel parameter when any version other than 'latest' is used." | ||||||
|             echo "  -v,--version <VERSION>         Use specific VERSION, Defaults to \`$version\`." |             echo "  -v,--version <VERSION>         Use specific VERSION, Defaults to \`$version\`." | ||||||
|             echo "      -Version" |             echo "      -Version" | ||||||
|             echo "          Possible values:" |             echo "          Possible values:" | ||||||
|             echo "          - latest - most latest build on specific channel" |             echo "          - latest - the latest build on specific channel" | ||||||
|             echo "          - 3-part version in a format A.B.C - represents specific version of build" |             echo "          - 3-part version in a format A.B.C - represents specific version of build" | ||||||
|             echo "              examples: 2.0.0-preview2-006120; 1.1.0" |             echo "              examples: 2.0.0-preview2-006120; 1.1.0" | ||||||
|             echo "  -q,--quality <quality>         Download the latest build of specified quality in the channel." |             echo "  -q,--quality <quality>         Download the latest build of specified quality in the channel." | ||||||
|             echo "      -Quality" |             echo "      -Quality" | ||||||
|             echo "          The possible values are: daily, signed, validated, preview, GA." |             echo "          The possible values are: daily, signed, validated, preview, GA." | ||||||
|             echo "          Works only in combination with channel. Not applicable for current and LTS channels and will be ignored if those channels are used."  |             echo "          Works only in combination with channel. Not applicable for STS and LTS channels and will be ignored if those channels are used."  | ||||||
|             echo "          For SDK use channel in A.B.Cxx format. Using quality for SDK together with channel in A.B format is not supported."  |             echo "          For SDK use channel in A.B.Cxx format. Using quality for SDK together with channel in A.B format is not supported."  | ||||||
|             echo "          Supported since 5.0 release."  |             echo "          Supported since 5.0 release."  | ||||||
|             echo "          Note: The version parameter overrides the channel parameter when any version other than 'latest' is used, and therefore overrides the quality." |             echo "          Note: The version parameter overrides the channel parameter when any version other than 'latest' is used, and therefore overrides the quality." | ||||||
| @ -1572,7 +1874,7 @@ do | |||||||
|             echo "      -InstallDir" |             echo "      -InstallDir" | ||||||
|             echo "  --architecture <ARCHITECTURE>      Architecture of dotnet binaries to be installed, Defaults to \`$architecture\`." |             echo "  --architecture <ARCHITECTURE>      Architecture of dotnet binaries to be installed, Defaults to \`$architecture\`." | ||||||
|             echo "      --arch,-Architecture,-Arch" |             echo "      --arch,-Architecture,-Arch" | ||||||
|             echo "          Possible values: x64, arm, and arm64" |             echo "          Possible values: x64, arm, arm64, s390x, ppc64le and loongarch64" | ||||||
|             echo "  --os <system>                    Specifies operating system to be used when selecting the installer." |             echo "  --os <system>                    Specifies operating system to be used when selecting the installer." | ||||||
|             echo "          Overrides the OS determination approach used by the script. Supported values: osx, linux, linux-musl, freebsd, rhel.6." |             echo "          Overrides the OS determination approach used by the script. Supported values: osx, linux, linux-musl, freebsd, rhel.6." | ||||||
|             echo "          In case any other value is provided, the platform will be determined by the script based on machine configuration." |             echo "          In case any other value is provided, the platform will be determined by the script based on machine configuration." | ||||||
| @ -1597,6 +1899,8 @@ do | |||||||
|             echo "  --no-cdn,-NoCdn                    Disable downloading from the Azure CDN, and use the uncached feed directly." |             echo "  --no-cdn,-NoCdn                    Disable downloading from the Azure CDN, and use the uncached feed directly." | ||||||
|             echo "  --jsonfile <JSONFILE>              Determines the SDK version from a user specified global.json file." |             echo "  --jsonfile <JSONFILE>              Determines the SDK version from a user specified global.json file." | ||||||
|             echo "                                     Note: global.json must have a value for 'SDK:Version'" |             echo "                                     Note: global.json must have a value for 'SDK:Version'" | ||||||
|  |             echo "  --keep-zip,-KeepZip                If set, downloaded file is kept." | ||||||
|  |             echo "  --zip-path, -ZipPath               If set, downloaded file is stored at the specified path." | ||||||
|             echo "  -?,--?,-h,--help,-Help             Shows this help message" |             echo "  -?,--?,-h,--help,-Help             Shows this help message" | ||||||
|             echo "" |             echo "" | ||||||
|             echo "Install Location:" |             echo "Install Location:" | ||||||
| @ -1615,10 +1919,10 @@ do | |||||||
|     shift |     shift | ||||||
| done | done | ||||||
|  |  | ||||||
| say "Note that the intended use of this script is for Continuous Integration (CI) scenarios, where:" | say_verbose "Note that the intended use of this script is for Continuous Integration (CI) scenarios, where:" | ||||||
| say "- The SDK needs to be installed without user interaction and without admin rights." | say_verbose "- The SDK needs to be installed without user interaction and without admin rights." | ||||||
| say "- The SDK installation doesn't need to persist across multiple CI runs." | say_verbose "- The SDK installation doesn't need to persist across multiple CI runs." | ||||||
| say "To set up a development environment or to run apps, use installers rather than this script. Visit https://dotnet.microsoft.com/download to get the installer.\n" | say_verbose "To set up a development environment or to run apps, use installers rather than this script. Visit https://dotnet.microsoft.com/download to get the installer.\n" | ||||||
|  |  | ||||||
| if [ "$internal" = true ] && [ -z "$(echo $feed_credential)" ]; then | if [ "$internal" = true ] && [ -z "$(echo $feed_credential)" ]; then | ||||||
|     message="Provide credentials via --feed-credential parameter." |     message="Provide credentials via --feed-credential parameter." | ||||||
| @ -1651,5 +1955,5 @@ else | |||||||
| fi | fi | ||||||
|  |  | ||||||
| say "Note that the script does not resolve dependencies during installation." | say "Note that the script does not resolve dependencies during installation." | ||||||
| say "To check the list of dependencies, go to https://docs.microsoft.com/dotnet/core/install, select your operating system and check the \"Dependencies\" section." | say "To check the list of dependencies, go to https://learn.microsoft.com/dotnet/core/install, select your operating system and check the \"Dependencies\" section." | ||||||
| say "Installation finished successfully." | say "Installation finished successfully." | ||||||
|  | |||||||
| @ -262,6 +262,7 @@ export class DotnetCoreInstaller { | |||||||
|     versionParts: string[] |     versionParts: string[] | ||||||
|   ): Promise<string> { |   ): Promise<string> { | ||||||
|     const response = await httpClient.getJson<any>(DotNetCoreIndexUrl); |     const response = await httpClient.getJson<any>(DotNetCoreIndexUrl); | ||||||
|  |  | ||||||
|     const result = response.result || {}; |     const result = response.result || {}; | ||||||
|     let releasesInfo: any[] = result['releases-index']; |     let releasesInfo: any[] = result['releases-index']; | ||||||
|  |  | ||||||
| @ -300,4 +301,4 @@ export class DotnetCoreInstaller { | |||||||
| } | } | ||||||
|  |  | ||||||
| const DotNetCoreIndexUrl: string = | const DotNetCoreIndexUrl: string = | ||||||
|   'https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/releases-index.json'; |   'https://builds.dotnet.microsoft.com/dotnet/release-metadata/releases-index.json'; | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	