mirror of
https://github.com/actions/setup-dotnet.git
synced 2026-03-24 23:52:17 +08:00
Compare commits
47 Commits
v3.3.0
...
checkfixes
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3f6d8d6c10 | ||
|
|
dbebe359e4 | ||
|
|
6bd8b7f777 | ||
|
|
5d1464d5da | ||
|
|
3e6b9fe393 | ||
|
|
769316e2e4 | ||
|
|
4d6c8fcf3c | ||
|
|
2216f56ae1 | ||
|
|
736bc6dea6 | ||
|
|
f5526c2d1b | ||
|
|
4dba25fa31 | ||
|
|
ada8800330 | ||
|
|
e1749123a8 | ||
|
|
a6be55a915 | ||
|
|
9b40770825 | ||
|
|
48277343a5 | ||
|
|
70fa3206c9 | ||
|
|
7ed547ca75 | ||
|
|
b5ebe9e10a | ||
|
|
89f1766d87 | ||
|
|
d1c99df34e | ||
|
|
faa708d00b | ||
|
|
ea6d1c26e7 | ||
|
|
9471c5df0b | ||
|
|
6eb2af61b6 | ||
|
|
8f71719d12 | ||
|
|
3cdb09485a | ||
|
|
6019612129 | ||
|
|
addb470701 | ||
|
|
820f30d332 | ||
|
|
427804d76a | ||
|
|
89b480a0df | ||
|
|
defac2491f | ||
|
|
916aec40c9 | ||
|
|
2785e21d5e | ||
|
|
80a318b8b8 | ||
|
|
eb0b7f8852 | ||
|
|
5c7ae4f903 | ||
|
|
b7461a1b69 | ||
|
|
cce8e1bad1 | ||
|
|
df506c2d9c | ||
|
|
abf9166e44 | ||
|
|
7e164d3c3b | ||
|
|
3dfe2673eb | ||
|
|
aa85432603 | ||
|
|
6d92b9bd53 | ||
|
|
dd32dd730c |
2
.github/workflows/basic-validation.yml
vendored
2
.github/workflows/basic-validation.yml
vendored
@@ -15,3 +15,5 @@ jobs:
|
|||||||
call-basic-validation:
|
call-basic-validation:
|
||||||
name: Basic validation
|
name: Basic validation
|
||||||
uses: actions/reusable-workflows/.github/workflows/basic-validation.yml@main
|
uses: actions/reusable-workflows/.github/workflows/basic-validation.yml@main
|
||||||
|
with:
|
||||||
|
node-version: '20'
|
||||||
|
|||||||
2
.github/workflows/check-dist.yml
vendored
2
.github/workflows/check-dist.yml
vendored
@@ -15,3 +15,5 @@ jobs:
|
|||||||
call-check-dist:
|
call-check-dist:
|
||||||
name: Check dist/
|
name: Check dist/
|
||||||
uses: actions/reusable-workflows/.github/workflows/check-dist.yml@main
|
uses: actions/reusable-workflows/.github/workflows/check-dist.yml@main
|
||||||
|
with:
|
||||||
|
node-version: '20'
|
||||||
|
|||||||
119
.github/workflows/e2e-tests.yml
vendored
119
.github/workflows/e2e-tests.yml
vendored
@@ -17,10 +17,10 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
operating-system: [ubuntu-latest, windows-latest, macos-13]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Clear toolcache
|
- name: Clear toolcache
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
@@ -40,10 +40,10 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-22.04, windows-latest, macos-13]
|
operating-system: [ubuntu-latest, windows-latest, macos-13]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Clear toolcache
|
- name: Clear toolcache
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
@@ -69,10 +69,10 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
operating-system: [ubuntu-latest, windows-latest, macos-13]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Clear toolcache
|
- name: Clear toolcache
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
@@ -94,10 +94,10 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-22.04, windows-latest, macos-13]
|
operating-system: [ubuntu-latest, windows-latest, macos-13]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Clear toolcache
|
- name: Clear toolcache
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
@@ -114,10 +114,10 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
operating-system: [ubuntu-latest, windows-latest, macos-13]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Clear toolcache
|
- name: Clear toolcache
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
@@ -138,10 +138,10 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
operating-system: [ubuntu-latest, windows-latest, macos-13]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Clear toolcache
|
- name: Clear toolcache
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
@@ -159,10 +159,10 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
operating-system: [ubuntu-latest, windows-latest, macos-13]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Clear toolcache
|
- name: Clear toolcache
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
@@ -183,10 +183,10 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
operating-system: [ubuntu-latest, windows-latest, macos-13]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Clear toolcache
|
- name: Clear toolcache
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
@@ -209,10 +209,10 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
operating-system: [ubuntu-latest, windows-latest, macos-13]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Clear toolcache
|
- name: Clear toolcache
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
@@ -229,15 +229,40 @@ jobs:
|
|||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/verify-dotnet.ps1 -Patterns "^2.2"
|
run: __tests__/verify-dotnet.ps1 -Patterns "^2.2"
|
||||||
|
|
||||||
|
test-global-json-with-comments:
|
||||||
|
runs-on: ${{ matrix.operating-system }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
operating-system: [ubuntu-latest, windows-latest, macos-13]
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Clear toolcache
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
|
- name: Write global.json
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir subdirectory
|
||||||
|
echo '/* should support comments */ {"sdk":{"version": "2.2.207","rollForward": "latestFeature"}} // should support comments' > ./subdirectory/global.json
|
||||||
|
- name: Setup dotnet
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
global-json-file: ./subdirectory/global.json
|
||||||
|
- name: Verify dotnet
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/verify-dotnet.ps1 -Patterns "^2.2"
|
||||||
|
|
||||||
test-setup-with-dotnet-quality:
|
test-setup-with-dotnet-quality:
|
||||||
runs-on: ${{ matrix.operating-system }}
|
runs-on: ${{ matrix.operating-system }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
operating-system: [ubuntu-latest, windows-latest, macos-13]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Clear toolcache
|
- name: Clear toolcache
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
@@ -256,12 +281,12 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-22.04, windows-latest, macos-latest]
|
operating-system: [ubuntu-latest, windows-latest, macos-13]
|
||||||
env:
|
env:
|
||||||
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
|
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Clear toolcache
|
- name: Clear toolcache
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
@@ -287,12 +312,12 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-22.04, windows-latest, macos-latest]
|
operating-system: [ubuntu-latest, windows-latest, macos-13]
|
||||||
env:
|
env:
|
||||||
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
|
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Clear toolcache
|
- name: Clear toolcache
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
@@ -316,10 +341,10 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
operating-system: [ubuntu-latest, windows-latest, macos-13]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Clear toolcache
|
- name: Clear toolcache
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
@@ -342,10 +367,10 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
operating-system: [ubuntu-latest, windows-latest, macos-13]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Clear toolcache
|
- name: Clear toolcache
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
@@ -368,7 +393,7 @@ jobs:
|
|||||||
test-proxy:
|
test-proxy:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
container:
|
container:
|
||||||
image: ubuntu:latest
|
image: ubuntu:22.04
|
||||||
options: --dns 127.0.0.1
|
options: --dns 127.0.0.1
|
||||||
services:
|
services:
|
||||||
squid-proxy:
|
squid-proxy:
|
||||||
@@ -380,7 +405,7 @@ jobs:
|
|||||||
http_proxy: http://squid-proxy:3128
|
http_proxy: http://squid-proxy:3128
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Install Powershell
|
- name: Install Powershell
|
||||||
run: |
|
run: |
|
||||||
apt-get update
|
apt-get update
|
||||||
@@ -406,13 +431,13 @@ jobs:
|
|||||||
__tests__/verify-dotnet.ps1 -Patterns "^6.0" -CheckNugetConfig
|
__tests__/verify-dotnet.ps1 -Patterns "^6.0" -CheckNugetConfig
|
||||||
|
|
||||||
test-bypass-proxy:
|
test-bypass-proxy:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-latest
|
||||||
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
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Clear toolcache
|
- name: Clear toolcache
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
@@ -426,3 +451,33 @@ jobs:
|
|||||||
- name: Verify dotnet
|
- name: Verify dotnet
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/verify-dotnet.ps1 -Patterns "^3.1.201$" -CheckNugetConfig
|
run: __tests__/verify-dotnet.ps1 -Patterns "^3.1.201$" -CheckNugetConfig
|
||||||
|
|
||||||
|
test-sequential-version-installation:
|
||||||
|
runs-on: ${{ matrix.operating-system }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
operating-system: [ubuntu-latest, windows-latest, macos-13]
|
||||||
|
lower-version: ['3.1.426']
|
||||||
|
higher-version: ['7.0.203']
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Clear toolcache
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
|
# Install one version, use it for something, then switch to next version
|
||||||
|
- name: Setup dotnet (lower version)
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
dotnet-version: ${{ matrix.lower-version }}
|
||||||
|
- name: Verify dotnet (lower version)
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/verify-dotnet.ps1 -Patterns "^${{ matrix.lower-version }}$"
|
||||||
|
- name: Setup dotnet (higher version)
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
dotnet-version: ${{ matrix.higher-version }}
|
||||||
|
- name: Verify dotnet (higher version)
|
||||||
|
shell: pwsh
|
||||||
|
run: __tests__/verify-dotnet.ps1 -Patterns "^${{ matrix.lower-version }}$", "^${{ matrix.higher-version }}$"
|
||||||
|
|||||||
4
.github/workflows/test-dotnet.yml
vendored
4
.github/workflows/test-dotnet.yml
vendored
@@ -17,11 +17,11 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
operating-system: [ubuntu-latest, windows-latest, macos-13]
|
||||||
dotnet-version: ['2.1', '2.2', '3.0', '3.1', '5.0', '6.0', '7.0', '8.0']
|
dotnet-version: ['2.1', '2.2', '3.0', '3.1', '5.0', '6.0', '7.0', '8.0']
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Clear toolcache
|
- name: Clear toolcache
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
|
|||||||
BIN
.licenses/npm/@actions/cache.dep.yml
generated
BIN
.licenses/npm/@actions/cache.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@actions/core.dep.yml
generated
BIN
.licenses/npm/@actions/core.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@actions/github.dep.yml
generated
BIN
.licenses/npm/@actions/github.dep.yml
generated
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/@actions/http-client.dep.yml
generated
BIN
.licenses/npm/@actions/http-client.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@actions/io.dep.yml
generated
BIN
.licenses/npm/@actions/io.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@azure/core-auth.dep.yml
generated
BIN
.licenses/npm/@azure/core-auth.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@azure/core-http.dep.yml
generated
BIN
.licenses/npm/@azure/core-http.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@azure/core-lro.dep.yml
generated
BIN
.licenses/npm/@azure/core-lro.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@azure/core-util.dep.yml
generated
BIN
.licenses/npm/@azure/core-util.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@azure/ms-rest-js.dep.yml
generated
BIN
.licenses/npm/@azure/ms-rest-js.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@azure/storage-blob.dep.yml
generated
BIN
.licenses/npm/@azure/storage-blob.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@fastify/busboy.dep.yml
generated
Normal file
BIN
.licenses/npm/@fastify/busboy.dep.yml
generated
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/@octokit/endpoint.dep.yml
generated
BIN
.licenses/npm/@octokit/endpoint.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@octokit/graphql.dep.yml
generated
BIN
.licenses/npm/@octokit/graphql.dep.yml
generated
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/@octokit/request-error.dep.yml
generated
BIN
.licenses/npm/@octokit/request-error.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@octokit/request.dep.yml
generated
BIN
.licenses/npm/@octokit/request.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@octokit/types.dep.yml
generated
Normal file
BIN
.licenses/npm/@octokit/types.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@opentelemetry/api.dep.yml
generated
BIN
.licenses/npm/@opentelemetry/api.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@types/node-fetch.dep.yml
generated
BIN
.licenses/npm/@types/node-fetch.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@types/node.dep.yml
generated
BIN
.licenses/npm/@types/node.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/atob-lite.dep.yml
generated
BIN
.licenses/npm/atob-lite.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/before-after-hook.dep.yml
generated
BIN
.licenses/npm/before-after-hook.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/btoa-lite.dep.yml
generated
BIN
.licenses/npm/btoa-lite.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/cross-spawn.dep.yml
generated
BIN
.licenses/npm/cross-spawn.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/fast-xml-parser.dep.yml
generated
BIN
.licenses/npm/fast-xml-parser.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/form-data-3.0.1.dep.yml
generated
BIN
.licenses/npm/form-data-3.0.1.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/is-plain-object.dep.yml
generated
BIN
.licenses/npm/is-plain-object.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/is-stream.dep.yml
generated
BIN
.licenses/npm/is-stream.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/isobject.dep.yml
generated
BIN
.licenses/npm/isobject.dep.yml
generated
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/lodash.get.dep.yml
generated
BIN
.licenses/npm/lodash.get.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/lodash.set.dep.yml
generated
BIN
.licenses/npm/lodash.set.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/lodash.uniq.dep.yml
generated
BIN
.licenses/npm/lodash.uniq.dep.yml
generated
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/macos-release.dep.yml
generated
BIN
.licenses/npm/macos-release.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/node-fetch.dep.yml
generated
BIN
.licenses/npm/node-fetch.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/npm-run-path.dep.yml
generated
BIN
.licenses/npm/npm-run-path.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/octokit-pagination-methods.dep.yml
generated
BIN
.licenses/npm/octokit-pagination-methods.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/p-finally.dep.yml
generated
BIN
.licenses/npm/p-finally.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/path-key.dep.yml
generated
BIN
.licenses/npm/path-key.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/psl.dep.yml
generated
BIN
.licenses/npm/psl.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/punycode.dep.yml
generated
BIN
.licenses/npm/punycode.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/sax.dep.yml
generated
BIN
.licenses/npm/sax.dep.yml
generated
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/shebang-command.dep.yml
generated
BIN
.licenses/npm/shebang-command.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/shebang-regex.dep.yml
generated
BIN
.licenses/npm/shebang-regex.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/signal-exit.dep.yml
generated
BIN
.licenses/npm/signal-exit.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/strip-eof.dep.yml
generated
BIN
.licenses/npm/strip-eof.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/tough-cookie.dep.yml
generated
BIN
.licenses/npm/tough-cookie.dep.yml
generated
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/universal-user-agent-2.1.0.dep.yml
generated
BIN
.licenses/npm/universal-user-agent-2.1.0.dep.yml
generated
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/windows-release.dep.yml
generated
BIN
.licenses/npm/windows-release.dep.yml
generated
Binary file not shown.
Binary file not shown.
56
README.md
56
README.md
@@ -12,7 +12,7 @@ This action sets up a [.NET CLI](https://github.com/dotnet/sdk) environment for
|
|||||||
> **Note**: GitHub hosted runners have some versions of the .NET SDK
|
> **Note**: GitHub hosted runners have some versions of the .NET SDK
|
||||||
preinstalled. Installed versions are subject to change. Please refer to the
|
preinstalled. Installed versions are subject to change. Please refer to the
|
||||||
documentation:
|
documentation:
|
||||||
[Software installed on github hosted runners](https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-software)
|
[Software installed on github hosted runners](https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#supported-software)
|
||||||
for .NET SDK versions that are currently available.
|
for .NET SDK versions that are currently available.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
@@ -22,20 +22,20 @@ See [action.yml](action.yml)
|
|||||||
**Basic**:
|
**Basic**:
|
||||||
```yaml
|
```yaml
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-dotnet@v3
|
- uses: actions/setup-dotnet@v4
|
||||||
with:
|
with:
|
||||||
dotnet-version: '3.1.x'
|
dotnet-version: '3.1.x'
|
||||||
- run: dotnet build <my project>
|
- run: dotnet build <my project>
|
||||||
```
|
```
|
||||||
> **Warning**: Unless a concrete version is specified in the [`global.json`](https://learn.microsoft.com/en-us/dotnet/core/tools/global-json) file, **_the latest .NET version installed on the runner (including preinstalled versions) will be used [by default](https://learn.microsoft.com/en-us/dotnet/core/versions/selection#the-sdk-uses-the-latest-installed-version)_**. Please refer to the [documentation](https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-software) for the currently preinstalled .NET SDK versions.
|
> **Warning**: Unless a concrete version is specified in the [`global.json`](https://learn.microsoft.com/en-us/dotnet/core/tools/global-json) file, **_the latest .NET version installed on the runner (including preinstalled versions) will be used [by default](https://learn.microsoft.com/en-us/dotnet/core/versions/selection#the-sdk-uses-the-latest-installed-version)_**. Please refer to the [documentation](https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#supported-software) for the currently preinstalled .NET SDK versions.
|
||||||
|
|
||||||
**Multiple version installation**:
|
**Multiple version installation**:
|
||||||
```yml
|
```yml
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- name: Setup dotnet
|
- name: Setup dotnet
|
||||||
uses: actions/setup-dotnet@v3
|
uses: actions/setup-dotnet@v4
|
||||||
with:
|
with:
|
||||||
dotnet-version: |
|
dotnet-version: |
|
||||||
3.1.x
|
3.1.x
|
||||||
@@ -59,8 +59,8 @@ This input sets up the action to install the latest build of the specified quali
|
|||||||
|
|
||||||
```yml
|
```yml
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-dotnet@v3
|
- uses: actions/setup-dotnet@v4
|
||||||
with:
|
with:
|
||||||
dotnet-version: '6.0.x'
|
dotnet-version: '6.0.x'
|
||||||
dotnet-quality: 'preview'
|
dotnet-quality: 'preview'
|
||||||
@@ -74,8 +74,8 @@ steps:
|
|||||||
|
|
||||||
```yml
|
```yml
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-dotnet@v3
|
- uses: actions/setup-dotnet@v4
|
||||||
with:
|
with:
|
||||||
global-json-file: csharp/global.json
|
global-json-file: csharp/global.json
|
||||||
- run: dotnet build <my project>
|
- run: dotnet build <my project>
|
||||||
@@ -91,8 +91,8 @@ The action searches for [NuGet Lock files](https://learn.microsoft.com/nuget/con
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-dotnet@v3
|
- uses: actions/setup-dotnet@v4
|
||||||
with:
|
with:
|
||||||
dotnet-version: 6.x
|
dotnet-version: 6.x
|
||||||
cache: true
|
cache: true
|
||||||
@@ -116,8 +116,8 @@ steps:
|
|||||||
env:
|
env:
|
||||||
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
|
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-dotnet@v3
|
- uses: actions/setup-dotnet@v4
|
||||||
with:
|
with:
|
||||||
dotnet-version: 6.x
|
dotnet-version: 6.x
|
||||||
cache: true
|
cache: true
|
||||||
@@ -130,8 +130,8 @@ steps:
|
|||||||
env:
|
env:
|
||||||
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
|
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-dotnet@v3
|
- uses: actions/setup-dotnet@v4
|
||||||
with:
|
with:
|
||||||
dotnet-version: 6.x
|
dotnet-version: 6.x
|
||||||
cache: true
|
cache: true
|
||||||
@@ -150,9 +150,9 @@ jobs:
|
|||||||
dotnet: [ '2.1.x', '3.1.x', '5.0.x' ]
|
dotnet: [ '2.1.x', '3.1.x', '5.0.x' ]
|
||||||
name: Dotnet ${{ matrix.dotnet }} sample
|
name: Dotnet ${{ matrix.dotnet }} sample
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- name: Setup dotnet
|
- name: Setup dotnet
|
||||||
uses: actions/setup-dotnet@v3
|
uses: actions/setup-dotnet@v4
|
||||||
with:
|
with:
|
||||||
dotnet-version: ${{ matrix.dotnet }}
|
dotnet-version: ${{ matrix.dotnet }}
|
||||||
- name: Execute dotnet
|
- name: Execute dotnet
|
||||||
@@ -170,9 +170,9 @@ jobs:
|
|||||||
dotnet: [ '2.1.x', '3.1.x', '5.0.x' ]
|
dotnet: [ '2.1.x', '3.1.x', '5.0.x' ]
|
||||||
name: Dotnet ${{ matrix.dotnet }} sample
|
name: Dotnet ${{ matrix.dotnet }} sample
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- name: Setup dotnet
|
- name: Setup dotnet
|
||||||
uses: actions/setup-dotnet@v3
|
uses: actions/setup-dotnet@v4
|
||||||
id: stepid
|
id: stepid
|
||||||
with:
|
with:
|
||||||
dotnet-version: ${{ matrix.dotnet }}
|
dotnet-version: ${{ matrix.dotnet }}
|
||||||
@@ -186,8 +186,8 @@ jobs:
|
|||||||
### Github Package Registry (GPR)
|
### Github Package Registry (GPR)
|
||||||
```yml
|
```yml
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-dotnet@v3
|
- uses: actions/setup-dotnet@v4
|
||||||
with:
|
with:
|
||||||
dotnet-version: '3.1.x'
|
dotnet-version: '3.1.x'
|
||||||
source-url: https://nuget.pkg.github.com/<owner>/index.json
|
source-url: https://nuget.pkg.github.com/<owner>/index.json
|
||||||
@@ -202,7 +202,7 @@ steps:
|
|||||||
|
|
||||||
### Azure Artifacts
|
### Azure Artifacts
|
||||||
```yml
|
```yml
|
||||||
- uses: actions/setup-dotnet@v3
|
- uses: actions/setup-dotnet@v4
|
||||||
with:
|
with:
|
||||||
source-url: https://pkgs.dev.azure.com/<your-organization>/_packaging/<your-feed-name>/nuget/v3/index.json
|
source-url: https://pkgs.dev.azure.com/<your-organization>/_packaging/<your-feed-name>/nuget/v3/index.json
|
||||||
env:
|
env:
|
||||||
@@ -213,7 +213,7 @@ steps:
|
|||||||
|
|
||||||
### nuget.org
|
### nuget.org
|
||||||
```yml
|
```yml
|
||||||
- uses: actions/setup-dotnet@v3
|
- uses: actions/setup-dotnet@v4
|
||||||
with:
|
with:
|
||||||
dotnet-version: 3.1.x
|
dotnet-version: 3.1.x
|
||||||
- name: Publish the package to nuget.org
|
- name: Publish the package to nuget.org
|
||||||
@@ -236,7 +236,7 @@ Using the **dotnet-version** output it's possible to get the installed by the ac
|
|||||||
In case of a single version installation, the `dotnet-version` output contains the version that is installed by the action.
|
In case of a single version installation, the `dotnet-version` output contains the version that is installed by the action.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- uses: actions/setup-dotnet@v3
|
- uses: actions/setup-dotnet@v4
|
||||||
id: stepid
|
id: stepid
|
||||||
with:
|
with:
|
||||||
dotnet-version: 3.1.422
|
dotnet-version: 3.1.422
|
||||||
@@ -248,7 +248,7 @@ In case of a single version installation, the `dotnet-version` output contains t
|
|||||||
In case of a multiple version installation, the `dotnet-version` output contains the latest version that is installed by the action.
|
In case of a multiple version installation, the `dotnet-version` output contains the latest version that is installed by the action.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- uses: actions/setup-dotnet@v3
|
- uses: actions/setup-dotnet@v4
|
||||||
id: stepid
|
id: stepid
|
||||||
with:
|
with:
|
||||||
dotnet-version: |
|
dotnet-version: |
|
||||||
@@ -261,7 +261,7 @@ In case of a multiple version installation, the `dotnet-version` output contains
|
|||||||
When the `dotnet-version` input is used along with the `global-json-file` input, the `dotnet-version` output contains the version resolved from the `global.json`.
|
When the `dotnet-version` input is used along with the `global-json-file` input, the `dotnet-version` output contains the version resolved from the `global.json`.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- uses: actions/setup-dotnet@v3
|
- uses: actions/setup-dotnet@v4
|
||||||
id: stepid
|
id: stepid
|
||||||
with:
|
with:
|
||||||
dotnet-version: |
|
dotnet-version: |
|
||||||
@@ -302,7 +302,7 @@ build:
|
|||||||
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
|
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@main
|
- uses: actions/checkout@main
|
||||||
- uses: actions/setup-dotnet@v3
|
- uses: actions/setup-dotnet@v4
|
||||||
with:
|
with:
|
||||||
dotnet-version: '3.1.x'
|
dotnet-version: '3.1.x'
|
||||||
cache: true
|
cache: true
|
||||||
|
|||||||
@@ -1,184 +1,184 @@
|
|||||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
exports[`authutil tests existing config not in repo root, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
exports[`authutil tests existing config not in repo root, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
||||||
"<?xml version=\\"1.0\\"?>
|
"<?xml version="1.0"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<config>
|
<config>
|
||||||
<add key=\\"defaultPushSource\\" value=\\"https://nuget.pkg.github.com/OwnerName/index.json\\"/>
|
<add key="defaultPushSource" value="https://nuget.pkg.github.com/OwnerName/index.json"/>
|
||||||
</config>
|
</config>
|
||||||
<packageSourceCredentials>
|
<packageSourceCredentials>
|
||||||
<GPR>
|
<GPR>
|
||||||
<add key=\\"Username\\" value=\\"OwnerName\\"/>
|
<add key="Username" value="OwnerName"/>
|
||||||
<add key=\\"ClearTextPassword\\" value=\\"TEST_FAKE_AUTH_TOKEN\\"/>
|
<add key="ClearTextPassword" value="TEST_FAKE_AUTH_TOKEN"/>
|
||||||
</GPR>
|
</GPR>
|
||||||
</packageSourceCredentials>
|
</packageSourceCredentials>
|
||||||
</configuration>"
|
</configuration>"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`authutil tests existing config w/ Azure Artifacts source and NuGet.org, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
exports[`authutil tests existing config w/ Azure Artifacts source and NuGet.org, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
||||||
"<?xml version=\\"1.0\\"?>
|
"<?xml version="1.0"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<config>
|
<config>
|
||||||
<add key=\\"defaultPushSource\\" value=\\"https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json\\"/>
|
<add key="defaultPushSource" value="https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json"/>
|
||||||
</config>
|
</config>
|
||||||
<packageSourceCredentials>
|
<packageSourceCredentials>
|
||||||
<AzureArtifacts>
|
<AzureArtifacts>
|
||||||
<add key=\\"Username\\" value=\\"OwnerName\\"/>
|
<add key="Username" value="OwnerName"/>
|
||||||
<add key=\\"ClearTextPassword\\" value=\\"TEST_FAKE_AUTH_TOKEN\\"/>
|
<add key="ClearTextPassword" value="TEST_FAKE_AUTH_TOKEN"/>
|
||||||
</AzureArtifacts>
|
</AzureArtifacts>
|
||||||
</packageSourceCredentials>
|
</packageSourceCredentials>
|
||||||
</configuration>"
|
</configuration>"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`authutil tests existing config w/ GPR source and NuGet.org, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
exports[`authutil tests existing config w/ GPR source and NuGet.org, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
||||||
"<?xml version=\\"1.0\\"?>
|
"<?xml version="1.0"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<config>
|
<config>
|
||||||
<add key=\\"defaultPushSource\\" value=\\"https://nuget.pkg.github.com/OwnerName/index.json\\"/>
|
<add key="defaultPushSource" value="https://nuget.pkg.github.com/OwnerName/index.json"/>
|
||||||
</config>
|
</config>
|
||||||
<packageSourceCredentials>
|
<packageSourceCredentials>
|
||||||
<GPR>
|
<GPR>
|
||||||
<add key=\\"Username\\" value=\\"OwnerName\\"/>
|
<add key="Username" value="OwnerName"/>
|
||||||
<add key=\\"ClearTextPassword\\" value=\\"TEST_FAKE_AUTH_TOKEN\\"/>
|
<add key="ClearTextPassword" value="TEST_FAKE_AUTH_TOKEN"/>
|
||||||
</GPR>
|
</GPR>
|
||||||
</packageSourceCredentials>
|
</packageSourceCredentials>
|
||||||
</configuration>"
|
</configuration>"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`authutil tests existing config w/ no GPR sources, sets up a full NuGet.config with URL and user/PAT for GPR 1`] = `
|
exports[`authutil tests existing config w/ no GPR sources, sets up a full NuGet.config with URL and user/PAT for GPR 1`] = `
|
||||||
"<?xml version=\\"1.0\\"?>
|
"<?xml version="1.0"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<config>
|
<config>
|
||||||
<add key=\\"defaultPushSource\\" value=\\"https://nuget.pkg.github.com/OwnerName/index.json\\"/>
|
<add key="defaultPushSource" value="https://nuget.pkg.github.com/OwnerName/index.json"/>
|
||||||
</config>
|
</config>
|
||||||
<packageSources>
|
<packageSources>
|
||||||
<add key=\\"Source\\" value=\\"https://nuget.pkg.github.com/OwnerName/index.json\\"/>
|
<add key="Source" value="https://nuget.pkg.github.com/OwnerName/index.json"/>
|
||||||
</packageSources>
|
</packageSources>
|
||||||
<packageSourceCredentials>
|
<packageSourceCredentials>
|
||||||
<Source>
|
<Source>
|
||||||
<add key=\\"Username\\" value=\\"OwnerName\\"/>
|
<add key="Username" value="OwnerName"/>
|
||||||
<add key=\\"ClearTextPassword\\" value=\\"TEST_FAKE_AUTH_TOKEN\\"/>
|
<add key="ClearTextPassword" value="TEST_FAKE_AUTH_TOKEN"/>
|
||||||
</Source>
|
</Source>
|
||||||
</packageSourceCredentials>
|
</packageSourceCredentials>
|
||||||
</configuration>"
|
</configuration>"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`authutil tests existing config w/ no sources, sets up a full NuGet.config with URL and user/PAT for GPR 1`] = `
|
exports[`authutil tests existing config w/ no sources, sets up a full NuGet.config with URL and user/PAT for GPR 1`] = `
|
||||||
"<?xml version=\\"1.0\\"?>
|
"<?xml version="1.0"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<config>
|
<config>
|
||||||
<add key=\\"defaultPushSource\\" value=\\"https://nuget.pkg.github.com/OwnerName/index.json\\"/>
|
<add key="defaultPushSource" value="https://nuget.pkg.github.com/OwnerName/index.json"/>
|
||||||
</config>
|
</config>
|
||||||
<packageSources>
|
<packageSources>
|
||||||
<add key=\\"Source\\" value=\\"https://nuget.pkg.github.com/OwnerName/index.json\\"/>
|
<add key="Source" value="https://nuget.pkg.github.com/OwnerName/index.json"/>
|
||||||
</packageSources>
|
</packageSources>
|
||||||
<packageSourceCredentials>
|
<packageSourceCredentials>
|
||||||
<Source>
|
<Source>
|
||||||
<add key=\\"Username\\" value=\\"OwnerName\\"/>
|
<add key="Username" value="OwnerName"/>
|
||||||
<add key=\\"ClearTextPassword\\" value=\\"TEST_FAKE_AUTH_TOKEN\\"/>
|
<add key="ClearTextPassword" value="TEST_FAKE_AUTH_TOKEN"/>
|
||||||
</Source>
|
</Source>
|
||||||
</packageSourceCredentials>
|
</packageSourceCredentials>
|
||||||
</configuration>"
|
</configuration>"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`authutil tests existing config w/ only Azure Artifacts source, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
exports[`authutil tests existing config w/ only Azure Artifacts source, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
||||||
"<?xml version=\\"1.0\\"?>
|
"<?xml version="1.0"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<config>
|
<config>
|
||||||
<add key=\\"defaultPushSource\\" value=\\"https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json\\"/>
|
<add key="defaultPushSource" value="https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json"/>
|
||||||
</config>
|
</config>
|
||||||
<packageSourceCredentials>
|
<packageSourceCredentials>
|
||||||
<AzureArtifacts>
|
<AzureArtifacts>
|
||||||
<add key=\\"Username\\" value=\\"OwnerName\\"/>
|
<add key="Username" value="OwnerName"/>
|
||||||
<add key=\\"ClearTextPassword\\" value=\\"TEST_FAKE_AUTH_TOKEN\\"/>
|
<add key="ClearTextPassword" value="TEST_FAKE_AUTH_TOKEN"/>
|
||||||
</AzureArtifacts>
|
</AzureArtifacts>
|
||||||
</packageSourceCredentials>
|
</packageSourceCredentials>
|
||||||
</configuration>"
|
</configuration>"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`authutil tests existing config w/ only GPR source, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
exports[`authutil tests existing config w/ only GPR source, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
||||||
"<?xml version=\\"1.0\\"?>
|
"<?xml version="1.0"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<config>
|
<config>
|
||||||
<add key=\\"defaultPushSource\\" value=\\"https://nuget.pkg.github.com/OwnerName/index.json\\"/>
|
<add key="defaultPushSource" value="https://nuget.pkg.github.com/OwnerName/index.json"/>
|
||||||
</config>
|
</config>
|
||||||
<packageSourceCredentials>
|
<packageSourceCredentials>
|
||||||
<GPR>
|
<GPR>
|
||||||
<add key=\\"Username\\" value=\\"OwnerName\\"/>
|
<add key="Username" value="OwnerName"/>
|
||||||
<add key=\\"ClearTextPassword\\" value=\\"TEST_FAKE_AUTH_TOKEN\\"/>
|
<add key="ClearTextPassword" value="TEST_FAKE_AUTH_TOKEN"/>
|
||||||
</GPR>
|
</GPR>
|
||||||
</packageSourceCredentials>
|
</packageSourceCredentials>
|
||||||
</configuration>"
|
</configuration>"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`authutil tests existing config w/ two GPR sources, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
exports[`authutil tests existing config w/ two GPR sources, sets up a partial NuGet.config user/PAT for GPR 1`] = `
|
||||||
"<?xml version=\\"1.0\\"?>
|
"<?xml version="1.0"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<config>
|
<config>
|
||||||
<add key=\\"defaultPushSource\\" value=\\"https://nuget.pkg.github.com\\"/>
|
<add key="defaultPushSource" value="https://nuget.pkg.github.com"/>
|
||||||
</config>
|
</config>
|
||||||
<packageSourceCredentials>
|
<packageSourceCredentials>
|
||||||
<GPR-GitHub>
|
<GPR-GitHub>
|
||||||
<add key=\\"Username\\" value=\\"OwnerName\\"/>
|
<add key="Username" value="OwnerName"/>
|
||||||
<add key=\\"ClearTextPassword\\" value=\\"TEST_FAKE_AUTH_TOKEN\\"/>
|
<add key="ClearTextPassword" value="TEST_FAKE_AUTH_TOKEN"/>
|
||||||
</GPR-GitHub>
|
</GPR-GitHub>
|
||||||
<GPR-Actions>
|
<GPR-Actions>
|
||||||
<add key=\\"Username\\" value=\\"OwnerName\\"/>
|
<add key="Username" value="OwnerName"/>
|
||||||
<add key=\\"ClearTextPassword\\" value=\\"TEST_FAKE_AUTH_TOKEN\\"/>
|
<add key="ClearTextPassword" value="TEST_FAKE_AUTH_TOKEN"/>
|
||||||
</GPR-Actions>
|
</GPR-Actions>
|
||||||
</packageSourceCredentials>
|
</packageSourceCredentials>
|
||||||
</configuration>"
|
</configuration>"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`authutil tests no existing config, sets up a full NuGet.config with URL and other owner/PAT for GPR 1`] = `
|
exports[`authutil tests no existing config, sets up a full NuGet.config with URL and other owner/PAT for GPR 1`] = `
|
||||||
"<?xml version=\\"1.0\\"?>
|
"<?xml version="1.0"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<config>
|
<config>
|
||||||
<add key=\\"defaultPushSource\\" value=\\"https://nuget.pkg.github.com/otherorg/index.json\\"/>
|
<add key="defaultPushSource" value="https://nuget.pkg.github.com/otherorg/index.json"/>
|
||||||
</config>
|
</config>
|
||||||
<packageSources>
|
<packageSources>
|
||||||
<add key=\\"Source\\" value=\\"https://nuget.pkg.github.com/otherorg/index.json\\"/>
|
<add key="Source" value="https://nuget.pkg.github.com/otherorg/index.json"/>
|
||||||
</packageSources>
|
</packageSources>
|
||||||
<packageSourceCredentials>
|
<packageSourceCredentials>
|
||||||
<Source>
|
<Source>
|
||||||
<add key=\\"Username\\" value=\\"otherorg\\"/>
|
<add key="Username" value="otherorg"/>
|
||||||
<add key=\\"ClearTextPassword\\" value=\\"TEST_FAKE_AUTH_TOKEN\\"/>
|
<add key="ClearTextPassword" value="TEST_FAKE_AUTH_TOKEN"/>
|
||||||
</Source>
|
</Source>
|
||||||
</packageSourceCredentials>
|
</packageSourceCredentials>
|
||||||
</configuration>"
|
</configuration>"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`authutil tests no existing config, sets up a full NuGet.config with URL and token for other source 1`] = `
|
exports[`authutil tests no existing config, sets up a full NuGet.config with URL and token for other source 1`] = `
|
||||||
"<?xml version=\\"1.0\\"?>
|
"<?xml version="1.0"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<config>
|
<config>
|
||||||
<add key=\\"defaultPushSource\\" value=\\"https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json\\"/>
|
<add key="defaultPushSource" value="https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json"/>
|
||||||
</config>
|
</config>
|
||||||
<packageSources>
|
<packageSources>
|
||||||
<add key=\\"Source\\" value=\\"https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json\\"/>
|
<add key="Source" value="https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json"/>
|
||||||
</packageSources>
|
</packageSources>
|
||||||
<packageSourceCredentials>
|
<packageSourceCredentials>
|
||||||
<Source>
|
<Source>
|
||||||
<add key=\\"Username\\" value=\\"OwnerName\\"/>
|
<add key="Username" value="OwnerName"/>
|
||||||
<add key=\\"ClearTextPassword\\" value=\\"TEST_FAKE_AUTH_TOKEN\\"/>
|
<add key="ClearTextPassword" value="TEST_FAKE_AUTH_TOKEN"/>
|
||||||
</Source>
|
</Source>
|
||||||
</packageSourceCredentials>
|
</packageSourceCredentials>
|
||||||
</configuration>"
|
</configuration>"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`authutil tests no existing config, sets up a full NuGet.config with URL and user/PAT for GPR 1`] = `
|
exports[`authutil tests no existing config, sets up a full NuGet.config with URL and user/PAT for GPR 1`] = `
|
||||||
"<?xml version=\\"1.0\\"?>
|
"<?xml version="1.0"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<config>
|
<config>
|
||||||
<add key=\\"defaultPushSource\\" value=\\"https://nuget.pkg.github.com/OwnerName/index.json\\"/>
|
<add key="defaultPushSource" value="https://nuget.pkg.github.com/OwnerName/index.json"/>
|
||||||
</config>
|
</config>
|
||||||
<packageSources>
|
<packageSources>
|
||||||
<add key=\\"Source\\" value=\\"https://nuget.pkg.github.com/OwnerName/index.json\\"/>
|
<add key="Source" value="https://nuget.pkg.github.com/OwnerName/index.json"/>
|
||||||
</packageSources>
|
</packageSources>
|
||||||
<packageSourceCredentials>
|
<packageSourceCredentials>
|
||||||
<Source>
|
<Source>
|
||||||
<add key=\\"Username\\" value=\\"OwnerName\\"/>
|
<add key="Username" value="OwnerName"/>
|
||||||
<add key=\\"ClearTextPassword\\" value=\\"TEST_FAKE_AUTH_TOKEN\\"/>
|
<add key="ClearTextPassword" value="TEST_FAKE_AUTH_TOKEN"/>
|
||||||
</Source>
|
</Source>
|
||||||
</packageSourceCredentials>
|
</packageSourceCredentials>
|
||||||
</configuration>"
|
</configuration>"
|
||||||
|
|||||||
@@ -102,8 +102,15 @@ describe('installer tests', () => {
|
|||||||
|
|
||||||
await dotnetInstaller.installDotnet();
|
await dotnetInstaller.installDotnet();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* First time script would be called to
|
||||||
|
* install runtime, here we checking only the
|
||||||
|
* second one that installs actual SDK. i.e. 1
|
||||||
|
*/
|
||||||
|
const callIndex = 1;
|
||||||
|
|
||||||
const scriptArguments = (
|
const scriptArguments = (
|
||||||
getExecOutputSpy.mock.calls[0][1] as string[]
|
getExecOutputSpy.mock.calls[callIndex][1] as string[]
|
||||||
).join(' ');
|
).join(' ');
|
||||||
const expectedArgument = IS_WINDOWS
|
const expectedArgument = IS_WINDOWS
|
||||||
? `-Version ${inputVersion}`
|
? `-Version ${inputVersion}`
|
||||||
@@ -185,8 +192,15 @@ describe('installer tests', () => {
|
|||||||
|
|
||||||
await dotnetInstaller.installDotnet();
|
await dotnetInstaller.installDotnet();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* First time script would be called to
|
||||||
|
* install runtime, here we checking only the
|
||||||
|
* second one that installs actual SDK. i.e. 1
|
||||||
|
*/
|
||||||
|
const callIndex = 1;
|
||||||
|
|
||||||
const scriptArguments = (
|
const scriptArguments = (
|
||||||
getExecOutputSpy.mock.calls[0][1] as string[]
|
getExecOutputSpy.mock.calls[callIndex][1] as string[]
|
||||||
).join(' ');
|
).join(' ');
|
||||||
const expectedArgument = IS_WINDOWS
|
const expectedArgument = IS_WINDOWS
|
||||||
? `-Quality ${inputQuality}`
|
? `-Quality ${inputQuality}`
|
||||||
@@ -218,8 +232,15 @@ describe('installer tests', () => {
|
|||||||
|
|
||||||
await dotnetInstaller.installDotnet();
|
await dotnetInstaller.installDotnet();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* First time script would be called to
|
||||||
|
* install runtime, here we checking only the
|
||||||
|
* second one that installs actual SDK. i.e. 1
|
||||||
|
*/
|
||||||
|
const callIndex = 1;
|
||||||
|
|
||||||
const scriptArguments = (
|
const scriptArguments = (
|
||||||
getExecOutputSpy.mock.calls[0][1] as string[]
|
getExecOutputSpy.mock.calls[callIndex][1] as string[]
|
||||||
).join(' ');
|
).join(' ');
|
||||||
const expectedArgument = IS_WINDOWS
|
const expectedArgument = IS_WINDOWS
|
||||||
? `-Channel 6.0`
|
? `-Channel 6.0`
|
||||||
@@ -252,8 +273,15 @@ describe('installer tests', () => {
|
|||||||
|
|
||||||
await dotnetInstaller.installDotnet();
|
await dotnetInstaller.installDotnet();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* First time script would be called to
|
||||||
|
* install runtime, here we checking only the
|
||||||
|
* second one that installs actual SDK. i.e. 1
|
||||||
|
*/
|
||||||
|
const callIndex = 1;
|
||||||
|
|
||||||
const scriptArguments = (
|
const scriptArguments = (
|
||||||
getExecOutputSpy.mock.calls[0][1] as string[]
|
getExecOutputSpy.mock.calls[callIndex][1] as string[]
|
||||||
).join(' ');
|
).join(' ');
|
||||||
|
|
||||||
expect(scriptArguments).toContain(
|
expect(scriptArguments).toContain(
|
||||||
@@ -283,8 +311,15 @@ describe('installer tests', () => {
|
|||||||
|
|
||||||
await dotnetInstaller.installDotnet();
|
await dotnetInstaller.installDotnet();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* First time script would be called to
|
||||||
|
* install runtime, here we checking only the
|
||||||
|
* second one that installs actual SDK. i.e. 1
|
||||||
|
*/
|
||||||
|
const callIndex = 1;
|
||||||
|
|
||||||
const scriptArguments = (
|
const scriptArguments = (
|
||||||
getExecOutputSpy.mock.calls[0][1] as string[]
|
getExecOutputSpy.mock.calls[callIndex][1] as string[]
|
||||||
).join(' ');
|
).join(' ');
|
||||||
|
|
||||||
expect(scriptArguments).toContain(
|
expect(scriptArguments).toContain(
|
||||||
@@ -297,14 +332,14 @@ describe('installer tests', () => {
|
|||||||
describe('addToPath() tests', () => {
|
describe('addToPath() tests', () => {
|
||||||
it(`should export DOTNET_ROOT env.var with value from DOTNET_INSTALL_DIR env.var`, async () => {
|
it(`should export DOTNET_ROOT env.var with value from DOTNET_INSTALL_DIR env.var`, async () => {
|
||||||
process.env['DOTNET_INSTALL_DIR'] = 'fictitious/dotnet/install/dir';
|
process.env['DOTNET_INSTALL_DIR'] = 'fictitious/dotnet/install/dir';
|
||||||
installer.DotnetCoreInstaller.addToPath();
|
installer.DotnetInstallDir.addToPath();
|
||||||
const dotnet_root = process.env['DOTNET_ROOT'];
|
const dotnet_root = process.env['DOTNET_ROOT'];
|
||||||
expect(dotnet_root).toBe(process.env['DOTNET_INSTALL_DIR']);
|
expect(dotnet_root).toBe(process.env['DOTNET_INSTALL_DIR']);
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should export value from DOTNET_INSTALL_DIR env.var to the PATH`, async () => {
|
it(`should export value from DOTNET_INSTALL_DIR env.var to the PATH`, async () => {
|
||||||
process.env['DOTNET_INSTALL_DIR'] = 'fictitious/dotnet/install/dir';
|
process.env['DOTNET_INSTALL_DIR'] = 'fictitious/dotnet/install/dir';
|
||||||
installer.DotnetCoreInstaller.addToPath();
|
installer.DotnetInstallDir.addToPath();
|
||||||
const path = process.env['PATH'];
|
const path = process.env['PATH'];
|
||||||
expect(path).toContain(process.env['DOTNET_INSTALL_DIR']);
|
expect(path).toContain(process.env['DOTNET_INSTALL_DIR']);
|
||||||
});
|
});
|
||||||
@@ -312,7 +347,7 @@ describe('installer tests', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe('DotnetVersionResolver tests', () => {
|
describe('DotnetVersionResolver tests', () => {
|
||||||
describe('createDotNetVersion() tests', () => {
|
describe('createDotnetVersion() tests', () => {
|
||||||
each([
|
each([
|
||||||
'3.1',
|
'3.1',
|
||||||
'3.x',
|
'3.x',
|
||||||
@@ -329,7 +364,7 @@ describe('installer tests', () => {
|
|||||||
version
|
version
|
||||||
);
|
);
|
||||||
const versionObject =
|
const versionObject =
|
||||||
await dotnetVersionResolver.createDotNetVersion();
|
await dotnetVersionResolver.createDotnetVersion();
|
||||||
|
|
||||||
expect(!!versionObject.value).toBe(true);
|
expect(!!versionObject.value).toBe(true);
|
||||||
}
|
}
|
||||||
@@ -368,7 +403,7 @@ describe('installer tests', () => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
await expect(
|
await expect(
|
||||||
async () => await dotnetVersionResolver.createDotNetVersion()
|
async () => await dotnetVersionResolver.createDotnetVersion()
|
||||||
).rejects.toThrow();
|
).rejects.toThrow();
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -380,7 +415,7 @@ describe('installer tests', () => {
|
|||||||
version
|
version
|
||||||
);
|
);
|
||||||
const versionObject =
|
const versionObject =
|
||||||
await dotnetVersionResolver.createDotNetVersion();
|
await dotnetVersionResolver.createDotnetVersion();
|
||||||
|
|
||||||
expect(versionObject.type.toLowerCase().includes('channel')).toBe(
|
expect(versionObject.type.toLowerCase().includes('channel')).toBe(
|
||||||
true
|
true
|
||||||
@@ -395,7 +430,7 @@ describe('installer tests', () => {
|
|||||||
version
|
version
|
||||||
);
|
);
|
||||||
const versionObject =
|
const versionObject =
|
||||||
await dotnetVersionResolver.createDotNetVersion();
|
await dotnetVersionResolver.createDotnetVersion();
|
||||||
|
|
||||||
expect(versionObject.type.toLowerCase().includes('channel')).toBe(
|
expect(versionObject.type.toLowerCase().includes('channel')).toBe(
|
||||||
true
|
true
|
||||||
@@ -411,7 +446,7 @@ describe('installer tests', () => {
|
|||||||
version
|
version
|
||||||
);
|
);
|
||||||
const versionObject =
|
const versionObject =
|
||||||
await dotnetVersionResolver.createDotNetVersion();
|
await dotnetVersionResolver.createDotnetVersion();
|
||||||
|
|
||||||
expect(versionObject.type.toLowerCase().includes('version')).toBe(
|
expect(versionObject.type.toLowerCase().includes('version')).toBe(
|
||||||
true
|
true
|
||||||
@@ -427,7 +462,7 @@ describe('installer tests', () => {
|
|||||||
version
|
version
|
||||||
);
|
);
|
||||||
const versionObject =
|
const versionObject =
|
||||||
await dotnetVersionResolver.createDotNetVersion();
|
await dotnetVersionResolver.createDotnetVersion();
|
||||||
const windowsRegEx = new RegExp(/^-(Version|Channel)/);
|
const windowsRegEx = new RegExp(/^-(Version|Channel)/);
|
||||||
const nonWindowsRegEx = new RegExp(/^--(version|channel)/);
|
const nonWindowsRegEx = new RegExp(/^--(version|channel)/);
|
||||||
|
|
||||||
@@ -447,7 +482,7 @@ describe('installer tests', () => {
|
|||||||
version
|
version
|
||||||
);
|
);
|
||||||
await expect(
|
await expect(
|
||||||
async () => await dotnetVersionResolver.createDotNetVersion()
|
async () => await dotnetVersionResolver.createDotnetVersion()
|
||||||
).rejects.toThrow(
|
).rejects.toThrow(
|
||||||
`'dotnet-version' was supplied in invalid format: ${version}! The A.B.Cxx syntax is available since the .NET 5.0 release.`
|
`'dotnet-version' was supplied in invalid format: ${version}! The A.B.Cxx syntax is available since the .NET 5.0 release.`
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import semver from 'semver';
|
|||||||
import * as auth from '../src/authutil';
|
import * as auth from '../src/authutil';
|
||||||
|
|
||||||
import * as setup from '../src/setup-dotnet';
|
import * as setup from '../src/setup-dotnet';
|
||||||
import {DotnetCoreInstaller} from '../src/installer';
|
import {DotnetCoreInstaller, DotnetInstallDir} from '../src/installer';
|
||||||
import * as cacheUtils from '../src/cache-utils';
|
import * as cacheUtils from '../src/cache-utils';
|
||||||
import * as cacheRestore from '../src/cache-restore';
|
import * as cacheRestore from '../src/cache-restore';
|
||||||
|
|
||||||
@@ -28,22 +28,25 @@ describe('setup-dotnet tests', () => {
|
|||||||
DotnetCoreInstaller.prototype,
|
DotnetCoreInstaller.prototype,
|
||||||
'installDotnet'
|
'installDotnet'
|
||||||
);
|
);
|
||||||
const addToPathSpy = jest.spyOn(DotnetCoreInstaller, 'addToPath');
|
|
||||||
const isCacheFeatureAvailableSpy = jest.spyOn(
|
const isCacheFeatureAvailableSpy = jest.spyOn(
|
||||||
cacheUtils,
|
cacheUtils,
|
||||||
'isCacheFeatureAvailable'
|
'isCacheFeatureAvailable'
|
||||||
);
|
);
|
||||||
const restoreCacheSpy = jest.spyOn(cacheRestore, 'restoreCache');
|
const restoreCacheSpy = jest.spyOn(cacheRestore, 'restoreCache');
|
||||||
const configAuthenticationSpy = jest.spyOn(auth, 'configAuthentication');
|
const configAuthenticationSpy = jest.spyOn(auth, 'configAuthentication');
|
||||||
|
const addToPathOriginal = DotnetInstallDir.addToPath;
|
||||||
|
|
||||||
describe('run() tests', () => {
|
describe('run() tests', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
|
DotnetInstallDir.addToPath = jest.fn();
|
||||||
getMultilineInputSpy.mockImplementation(input => inputs[input as string]);
|
getMultilineInputSpy.mockImplementation(input => inputs[input as string]);
|
||||||
getInputSpy.mockImplementation(input => inputs[input as string]);
|
getInputSpy.mockImplementation(input => inputs[input as string]);
|
||||||
getBooleanInputSpy.mockImplementation(input => inputs[input as string]);
|
getBooleanInputSpy.mockImplementation(input => inputs[input as string]);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
|
DotnetInstallDir.addToPath = addToPathOriginal;
|
||||||
jest.clearAllMocks();
|
jest.clearAllMocks();
|
||||||
jest.resetAllMocks();
|
jest.resetAllMocks();
|
||||||
});
|
});
|
||||||
@@ -104,10 +107,9 @@ describe('setup-dotnet tests', () => {
|
|||||||
inputs['dotnet-quality'] = '';
|
inputs['dotnet-quality'] = '';
|
||||||
|
|
||||||
installDotnetSpy.mockImplementation(() => Promise.resolve(''));
|
installDotnetSpy.mockImplementation(() => Promise.resolve(''));
|
||||||
addToPathSpy.mockImplementation(() => {});
|
|
||||||
|
|
||||||
await setup.run();
|
await setup.run();
|
||||||
expect(addToPathSpy).toHaveBeenCalledTimes(1);
|
expect(DotnetInstallDir.addToPath).toHaveBeenCalledTimes(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should call auth.configAuthentication() if source-url input is provided', async () => {
|
it('should call auth.configAuthentication() if source-url input is provided', async () => {
|
||||||
@@ -148,10 +150,9 @@ describe('setup-dotnet tests', () => {
|
|||||||
installDotnetSpy.mockImplementation(() =>
|
installDotnetSpy.mockImplementation(() =>
|
||||||
Promise.resolve(`${inputs['dotnet-version']}`)
|
Promise.resolve(`${inputs['dotnet-version']}`)
|
||||||
);
|
);
|
||||||
addToPathSpy.mockImplementation(() => {});
|
|
||||||
|
|
||||||
await setup.run();
|
await setup.run();
|
||||||
expect(setOutputSpy).toHaveBeenCalledTimes(1);
|
expect(DotnetInstallDir.addToPath).toHaveBeenCalledTimes(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`shouldn't call setOutput() if parsing dotnet-installer logs failed`, async () => {
|
it(`shouldn't call setOutput() if parsing dotnet-installer logs failed`, async () => {
|
||||||
@@ -159,7 +160,6 @@ describe('setup-dotnet tests', () => {
|
|||||||
const warningMessage = `Failed to output the installed version of .NET. The 'dotnet-version' output will not be set.`;
|
const warningMessage = `Failed to output the installed version of .NET. The 'dotnet-version' output will not be set.`;
|
||||||
|
|
||||||
installDotnetSpy.mockImplementation(() => Promise.resolve(null));
|
installDotnetSpy.mockImplementation(() => Promise.resolve(null));
|
||||||
addToPathSpy.mockImplementation(() => {});
|
|
||||||
|
|
||||||
await setup.run();
|
await setup.run();
|
||||||
expect(warningSpy).toHaveBeenCalledWith(warningMessage);
|
expect(warningSpy).toHaveBeenCalledWith(warningMessage);
|
||||||
@@ -170,8 +170,6 @@ describe('setup-dotnet tests', () => {
|
|||||||
inputs['dotnet-version'] = [];
|
inputs['dotnet-version'] = [];
|
||||||
const warningMessage = `The 'dotnet-version' output will not be set.`;
|
const warningMessage = `The 'dotnet-version' output will not be set.`;
|
||||||
|
|
||||||
addToPathSpy.mockImplementation(() => {});
|
|
||||||
|
|
||||||
await setup.run();
|
await setup.run();
|
||||||
|
|
||||||
expect(infoSpy).toHaveBeenCalledWith(warningMessage);
|
expect(infoSpy).toHaveBeenCalledWith(warningMessage);
|
||||||
@@ -185,7 +183,6 @@ describe('setup-dotnet tests', () => {
|
|||||||
inputs['cache-dependency-path'] = 'fictitious.package.lock.json';
|
inputs['cache-dependency-path'] = 'fictitious.package.lock.json';
|
||||||
|
|
||||||
installDotnetSpy.mockImplementation(() => Promise.resolve(''));
|
installDotnetSpy.mockImplementation(() => Promise.resolve(''));
|
||||||
addToPathSpy.mockImplementation(() => {});
|
|
||||||
|
|
||||||
isCacheFeatureAvailableSpy.mockImplementation(() => true);
|
isCacheFeatureAvailableSpy.mockImplementation(() => true);
|
||||||
restoreCacheSpy.mockImplementation(() => Promise.resolve());
|
restoreCacheSpy.mockImplementation(() => Promise.resolve());
|
||||||
@@ -203,7 +200,6 @@ describe('setup-dotnet tests', () => {
|
|||||||
inputs['cache'] = false;
|
inputs['cache'] = false;
|
||||||
|
|
||||||
installDotnetSpy.mockImplementation(() => Promise.resolve(''));
|
installDotnetSpy.mockImplementation(() => Promise.resolve(''));
|
||||||
addToPathSpy.mockImplementation(() => {});
|
|
||||||
|
|
||||||
isCacheFeatureAvailableSpy.mockImplementation(() => true);
|
isCacheFeatureAvailableSpy.mockImplementation(() => true);
|
||||||
restoreCacheSpy.mockImplementation(() => Promise.resolve());
|
restoreCacheSpy.mockImplementation(() => Promise.resolve());
|
||||||
@@ -218,7 +214,6 @@ describe('setup-dotnet tests', () => {
|
|||||||
inputs['cache'] = true;
|
inputs['cache'] = true;
|
||||||
|
|
||||||
installDotnetSpy.mockImplementation(() => Promise.resolve(''));
|
installDotnetSpy.mockImplementation(() => Promise.resolve(''));
|
||||||
addToPathSpy.mockImplementation(() => {});
|
|
||||||
|
|
||||||
isCacheFeatureAvailableSpy.mockImplementation(() => false);
|
isCacheFeatureAvailableSpy.mockImplementation(() => false);
|
||||||
restoreCacheSpy.mockImplementation(() => Promise.resolve());
|
restoreCacheSpy.mockImplementation(() => Promise.resolve());
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ outputs:
|
|||||||
dotnet-version:
|
dotnet-version:
|
||||||
description: 'Contains the installed by action .NET SDK version for reuse.'
|
description: 'Contains the installed by action .NET SDK version for reuse.'
|
||||||
runs:
|
runs:
|
||||||
using: 'node16'
|
using: 'node20'
|
||||||
main: 'dist/setup/index.js'
|
main: 'dist/setup/index.js'
|
||||||
post: 'dist/cache-save/index.js'
|
post: 'dist/cache-save/index.js'
|
||||||
post-if: success()
|
post-if: success()
|
||||||
|
|||||||
31356
dist/cache-save/index.js
vendored
31356
dist/cache-save/index.js
vendored
File diff suppressed because one or more lines are too long
47628
dist/setup/index.js
vendored
47628
dist/setup/index.js
vendored
File diff suppressed because one or more lines are too long
655
externals/install-dotnet.ps1
vendored
655
externals/install-dotnet.ps1
vendored
@@ -111,13 +111,13 @@
|
|||||||
#>
|
#>
|
||||||
[cmdletbinding()]
|
[cmdletbinding()]
|
||||||
param(
|
param(
|
||||||
[string]$Channel = "LTS",
|
[string]$Channel="LTS",
|
||||||
[string]$Quality,
|
[string]$Quality,
|
||||||
[string]$Version = "Latest",
|
[string]$Version="Latest",
|
||||||
[switch]$Internal,
|
[switch]$Internal,
|
||||||
[string]$JSonFile,
|
[string]$JSonFile,
|
||||||
[Alias('i')][string]$InstallDir = "<auto>",
|
[Alias('i')][string]$InstallDir="<auto>",
|
||||||
[string]$Architecture = "<auto>",
|
[string]$Architecture="<auto>",
|
||||||
[string]$Runtime,
|
[string]$Runtime,
|
||||||
[Obsolete("This parameter may be removed in a future version of this script. The recommended alternative is '-Runtime dotnet'.")]
|
[Obsolete("This parameter may be removed in a future version of this script. The recommended alternative is '-Runtime dotnet'.")]
|
||||||
[switch]$SharedRuntime,
|
[switch]$SharedRuntime,
|
||||||
@@ -128,18 +128,18 @@ param(
|
|||||||
[string]$FeedCredential,
|
[string]$FeedCredential,
|
||||||
[string]$ProxyAddress,
|
[string]$ProxyAddress,
|
||||||
[switch]$ProxyUseDefaultCredentials,
|
[switch]$ProxyUseDefaultCredentials,
|
||||||
[string[]]$ProxyBypassList = @(),
|
[string[]]$ProxyBypassList=@(),
|
||||||
[switch]$SkipNonVersionedFiles,
|
[switch]$SkipNonVersionedFiles,
|
||||||
[switch]$NoCdn,
|
[switch]$NoCdn,
|
||||||
[int]$DownloadTimeout = 1200,
|
[int]$DownloadTimeout=1200,
|
||||||
[switch]$KeepZip,
|
[switch]$KeepZip,
|
||||||
[string]$ZipPath = [System.IO.Path]::combine([System.IO.Path]::GetTempPath(), [System.IO.Path]::GetRandomFileName()),
|
[string]$ZipPath=[System.IO.Path]::combine([System.IO.Path]::GetTempPath(), [System.IO.Path]::GetRandomFileName()),
|
||||||
[switch]$Help
|
[switch]$Help
|
||||||
)
|
)
|
||||||
|
|
||||||
Set-StrictMode -Version Latest
|
Set-StrictMode -Version Latest
|
||||||
$ErrorActionPreference = "Stop"
|
$ErrorActionPreference="Stop"
|
||||||
$ProgressPreference = "SilentlyContinue"
|
$ProgressPreference="SilentlyContinue"
|
||||||
|
|
||||||
function Say($str) {
|
function Say($str) {
|
||||||
try {
|
try {
|
||||||
@@ -186,7 +186,7 @@ function Say-Verbose($str) {
|
|||||||
function Measure-Action($name, $block) {
|
function Measure-Action($name, $block) {
|
||||||
$time = Measure-Command $block
|
$time = Measure-Command $block
|
||||||
$totalSeconds = $time.TotalSeconds
|
$totalSeconds = $time.TotalSeconds
|
||||||
Say-Verbose "Action '$name' took $totalSeconds seconds"
|
Say-Verbose "⏱ Action '$name' took $totalSeconds seconds"
|
||||||
}
|
}
|
||||||
|
|
||||||
function Get-Remote-File-Size($zipUri) {
|
function Get-Remote-File-Size($zipUri) {
|
||||||
@@ -243,13 +243,14 @@ function Get-Machine-Architecture() {
|
|||||||
# To get the correct architecture, we need to use PROCESSOR_ARCHITEW6432.
|
# To get the correct architecture, we need to use PROCESSOR_ARCHITEW6432.
|
||||||
# PS x64 doesn't define this, so we fall back to PROCESSOR_ARCHITECTURE.
|
# PS x64 doesn't define this, so we fall back to PROCESSOR_ARCHITECTURE.
|
||||||
# Possible values: amd64, x64, x86, arm64, arm
|
# Possible values: amd64, x64, x86, arm64, arm
|
||||||
if ( $ENV:PROCESSOR_ARCHITEW6432 -ne $null ) {
|
if( $ENV:PROCESSOR_ARCHITEW6432 -ne $null ) {
|
||||||
return $ENV:PROCESSOR_ARCHITEW6432
|
return $ENV:PROCESSOR_ARCHITEW6432
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if ( ((Get-CimInstance -ClassName CIM_OperatingSystem).OSArchitecture) -like "ARM*") {
|
if( ((Get-CimInstance -ClassName CIM_OperatingSystem).OSArchitecture) -like "ARM*") {
|
||||||
if ( [Environment]::Is64BitOperatingSystem ) {
|
if( [Environment]::Is64BitOperatingSystem )
|
||||||
|
{
|
||||||
return "arm64"
|
return "arm64"
|
||||||
}
|
}
|
||||||
return "arm"
|
return "arm"
|
||||||
@@ -278,13 +279,13 @@ function Get-CLIArchitecture-From-Architecture([string]$Architecture) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function ValidateFeedCredential([string] $FeedCredential) {
|
function ValidateFeedCredential([string] $FeedCredential)
|
||||||
|
{
|
||||||
if ($Internal -and [string]::IsNullOrWhitespace($FeedCredential)) {
|
if ($Internal -and [string]::IsNullOrWhitespace($FeedCredential)) {
|
||||||
$message = "Provide credentials via -FeedCredential parameter."
|
$message = "Provide credentials via -FeedCredential parameter."
|
||||||
if ($DryRun) {
|
if ($DryRun) {
|
||||||
Say-Warning "$message"
|
Say-Warning "$message"
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
throw "$message"
|
throw "$message"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -376,7 +377,8 @@ function Load-Assembly([string] $Assembly) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function GetHTTPResponse([Uri] $Uri, [bool]$HeaderOnly, [bool]$DisableRedirect, [bool]$DisableFeedCredential) {
|
function GetHTTPResponse([Uri] $Uri, [bool]$HeaderOnly, [bool]$DisableRedirect, [bool]$DisableFeedCredential)
|
||||||
|
{
|
||||||
$cts = New-Object System.Threading.CancellationTokenSource
|
$cts = New-Object System.Threading.CancellationTokenSource
|
||||||
|
|
||||||
$downloadScript = {
|
$downloadScript = {
|
||||||
@@ -387,21 +389,19 @@ function GetHTTPResponse([Uri] $Uri, [bool]$HeaderOnly, [bool]$DisableRedirect,
|
|||||||
# HttpClient is used vs Invoke-WebRequest in order to support Nano Server which doesn't support the Invoke-WebRequest cmdlet.
|
# HttpClient is used vs Invoke-WebRequest in order to support Nano Server which doesn't support the Invoke-WebRequest cmdlet.
|
||||||
Load-Assembly -Assembly System.Net.Http
|
Load-Assembly -Assembly System.Net.Http
|
||||||
|
|
||||||
if (-not $ProxyAddress) {
|
if(-not $ProxyAddress) {
|
||||||
try {
|
try {
|
||||||
# Despite no proxy being explicitly specified, we may still be behind a default proxy
|
# Despite no proxy being explicitly specified, we may still be behind a default proxy
|
||||||
$DefaultProxy = [System.Net.WebRequest]::DefaultWebProxy;
|
$DefaultProxy = [System.Net.WebRequest]::DefaultWebProxy;
|
||||||
if ($DefaultProxy -and (-not $DefaultProxy.IsBypassed($Uri))) {
|
if($DefaultProxy -and (-not $DefaultProxy.IsBypassed($Uri))) {
|
||||||
if ($null -ne $DefaultProxy.GetProxy($Uri)) {
|
if ($null -ne $DefaultProxy.GetProxy($Uri)) {
|
||||||
$ProxyAddress = $DefaultProxy.GetProxy($Uri).OriginalString
|
$ProxyAddress = $DefaultProxy.GetProxy($Uri).OriginalString
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
$ProxyAddress = $null
|
$ProxyAddress = $null
|
||||||
}
|
}
|
||||||
$ProxyUseDefaultCredentials = $true
|
$ProxyUseDefaultCredentials = $true
|
||||||
}
|
}
|
||||||
}
|
} catch {
|
||||||
catch {
|
|
||||||
# Eat the exception and move forward as the above code is an attempt
|
# Eat the exception and move forward as the above code is an attempt
|
||||||
# at resolving the DefaultProxy that may not have been a problem.
|
# at resolving the DefaultProxy that may not have been a problem.
|
||||||
$ProxyAddress = $null
|
$ProxyAddress = $null
|
||||||
@@ -410,14 +410,15 @@ function GetHTTPResponse([Uri] $Uri, [bool]$HeaderOnly, [bool]$DisableRedirect,
|
|||||||
}
|
}
|
||||||
|
|
||||||
$HttpClientHandler = New-Object System.Net.Http.HttpClientHandler
|
$HttpClientHandler = New-Object System.Net.Http.HttpClientHandler
|
||||||
if ($ProxyAddress) {
|
if($ProxyAddress) {
|
||||||
$HttpClientHandler.Proxy = New-Object System.Net.WebProxy -Property @{
|
$HttpClientHandler.Proxy = New-Object System.Net.WebProxy -Property @{
|
||||||
Address = $ProxyAddress;
|
Address=$ProxyAddress;
|
||||||
UseDefaultCredentials = $ProxyUseDefaultCredentials;
|
UseDefaultCredentials=$ProxyUseDefaultCredentials;
|
||||||
BypassList = $ProxyBypassList;
|
BypassList = $ProxyBypassList;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($DisableRedirect) {
|
if ($DisableRedirect)
|
||||||
|
{
|
||||||
$HttpClientHandler.AllowAutoRedirect = $false
|
$HttpClientHandler.AllowAutoRedirect = $false
|
||||||
}
|
}
|
||||||
$HttpClient = New-Object System.Net.Http.HttpClient -ArgumentList $HttpClientHandler
|
$HttpClient = New-Object System.Net.Http.HttpClient -ArgumentList $HttpClientHandler
|
||||||
@@ -426,7 +427,7 @@ function GetHTTPResponse([Uri] $Uri, [bool]$HeaderOnly, [bool]$DisableRedirect,
|
|||||||
# Defaulting to 20 minutes allows it to work over much slower connections.
|
# Defaulting to 20 minutes allows it to work over much slower connections.
|
||||||
$HttpClient.Timeout = New-TimeSpan -Seconds $DownloadTimeout
|
$HttpClient.Timeout = New-TimeSpan -Seconds $DownloadTimeout
|
||||||
|
|
||||||
if ($HeaderOnly) {
|
if ($HeaderOnly){
|
||||||
$completionOption = [System.Net.Http.HttpCompletionOption]::ResponseHeadersRead
|
$completionOption = [System.Net.Http.HttpCompletionOption]::ResponseHeadersRead
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -451,7 +452,8 @@ function GetHTTPResponse([Uri] $Uri, [bool]$HeaderOnly, [bool]$DisableRedirect,
|
|||||||
$DownloadException.Data["StatusCode"] = [int] $Response.StatusCode
|
$DownloadException.Data["StatusCode"] = [int] $Response.StatusCode
|
||||||
$DownloadException.Data["ErrorMessage"] = "Unable to download $Uri. Returned HTTP status code: " + $DownloadException.Data["StatusCode"]
|
$DownloadException.Data["ErrorMessage"] = "Unable to download $Uri. Returned HTTP status code: " + $DownloadException.Data["StatusCode"]
|
||||||
|
|
||||||
if (404 -eq [int] $Response.StatusCode) {
|
if (404 -eq [int] $Response.StatusCode)
|
||||||
|
{
|
||||||
$cts.Cancel()
|
$cts.Cancel()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -490,8 +492,10 @@ function GetHTTPResponse([Uri] $Uri, [bool]$HeaderOnly, [bool]$DisableRedirect,
|
|||||||
try {
|
try {
|
||||||
return Invoke-With-Retry $downloadScript $cts.Token
|
return Invoke-With-Retry $downloadScript $cts.Token
|
||||||
}
|
}
|
||||||
finally {
|
finally
|
||||||
if ($null -ne $cts) {
|
{
|
||||||
|
if ($null -ne $cts)
|
||||||
|
{
|
||||||
$cts.Dispose()
|
$cts.Dispose()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -609,9 +613,11 @@ function Get-Download-Link([string]$AzureFeed, [string]$SpecificVersion, [string
|
|||||||
elseif ($Runtime -eq "windowsdesktop") {
|
elseif ($Runtime -eq "windowsdesktop") {
|
||||||
# The windows desktop runtime is part of the core runtime layout prior to 5.0
|
# The windows desktop runtime is part of the core runtime layout prior to 5.0
|
||||||
$PayloadURL = "$AzureFeed/Runtime/$SpecificVersion/windowsdesktop-runtime-$SpecificProductVersion-win-$CLIArchitecture.zip"
|
$PayloadURL = "$AzureFeed/Runtime/$SpecificVersion/windowsdesktop-runtime-$SpecificProductVersion-win-$CLIArchitecture.zip"
|
||||||
if ($SpecificVersion -match '^(\d+)\.(.*)$') {
|
if ($SpecificVersion -match '^(\d+)\.(.*)$')
|
||||||
|
{
|
||||||
$majorVersion = [int]$Matches[1]
|
$majorVersion = [int]$Matches[1]
|
||||||
if ($majorVersion -ge 5) {
|
if ($majorVersion -ge 5)
|
||||||
|
{
|
||||||
$PayloadURL = "$AzureFeed/WindowsDesktop/$SpecificVersion/windowsdesktop-runtime-$SpecificProductVersion-win-$CLIArchitecture.zip"
|
$PayloadURL = "$AzureFeed/WindowsDesktop/$SpecificVersion/windowsdesktop-runtime-$SpecificProductVersion-win-$CLIArchitecture.zip"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -661,7 +667,8 @@ function Get-Product-Version([string]$AzureFeed, [string]$SpecificVersion, [stri
|
|||||||
|
|
||||||
if ($productVersionResponse.StatusCode -eq 200) {
|
if ($productVersionResponse.StatusCode -eq 200) {
|
||||||
$productVersion = $productVersionResponse.Content.ReadAsStringAsync().Result.Trim()
|
$productVersion = $productVersionResponse.Content.ReadAsStringAsync().Result.Trim()
|
||||||
if ($productVersion -ne $SpecificVersion) {
|
if ($productVersion -ne $SpecificVersion)
|
||||||
|
{
|
||||||
Say "Using alternate version $productVersion found in $ProductVersionTxtURL"
|
Say "Using alternate version $productVersion found in $ProductVersionTxtURL"
|
||||||
}
|
}
|
||||||
return $productVersion
|
return $productVersion
|
||||||
@@ -676,7 +683,8 @@ function Get-Product-Version([string]$AzureFeed, [string]$SpecificVersion, [stri
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Getting the version number with productVersion.txt has failed. Try parsing the download link for a version number.
|
# Getting the version number with productVersion.txt has failed. Try parsing the download link for a version number.
|
||||||
if ([string]::IsNullOrEmpty($PackageDownloadLink)) {
|
if ([string]::IsNullOrEmpty($PackageDownloadLink))
|
||||||
|
{
|
||||||
Say-Verbose "Using the default value '$SpecificVersion' as the product version."
|
Say-Verbose "Using the default value '$SpecificVersion' as the product version."
|
||||||
return $SpecificVersion
|
return $SpecificVersion
|
||||||
}
|
}
|
||||||
@@ -688,21 +696,21 @@ function Get-Product-Version([string]$AzureFeed, [string]$SpecificVersion, [stri
|
|||||||
function Get-Product-Version-Url([string]$AzureFeed, [string]$SpecificVersion, [string]$PackageDownloadLink, [bool]$Flattened) {
|
function Get-Product-Version-Url([string]$AzureFeed, [string]$SpecificVersion, [string]$PackageDownloadLink, [bool]$Flattened) {
|
||||||
Say-Invocation $MyInvocation
|
Say-Invocation $MyInvocation
|
||||||
|
|
||||||
$majorVersion = $null
|
$majorVersion=$null
|
||||||
if ($SpecificVersion -match '^(\d+)\.(.*)') {
|
if ($SpecificVersion -match '^(\d+)\.(.*)') {
|
||||||
$majorVersion = $Matches[1] -as [int]
|
$majorVersion = $Matches[1] -as[int]
|
||||||
}
|
}
|
||||||
|
|
||||||
$pvFileName = 'productVersion.txt'
|
$pvFileName='productVersion.txt'
|
||||||
if ($Flattened) {
|
if($Flattened) {
|
||||||
if (-not $Runtime) {
|
if(-not $Runtime) {
|
||||||
$pvFileName = 'sdk-productVersion.txt'
|
$pvFileName='sdk-productVersion.txt'
|
||||||
}
|
}
|
||||||
elseif ($Runtime -eq "dotnet") {
|
elseif($Runtime -eq "dotnet") {
|
||||||
$pvFileName = 'runtime-productVersion.txt'
|
$pvFileName='runtime-productVersion.txt'
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$pvFileName = "$Runtime-productVersion.txt"
|
$pvFileName="$Runtime-productVersion.txt"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -736,14 +744,16 @@ function Get-Product-Version-Url([string]$AzureFeed, [string]$SpecificVersion, [
|
|||||||
return $ProductVersionTxtURL
|
return $ProductVersionTxtURL
|
||||||
}
|
}
|
||||||
|
|
||||||
function Get-ProductVersionFromDownloadLink([string]$PackageDownloadLink, [string]$SpecificVersion) {
|
function Get-ProductVersionFromDownloadLink([string]$PackageDownloadLink, [string]$SpecificVersion)
|
||||||
|
{
|
||||||
Say-Invocation $MyInvocation
|
Say-Invocation $MyInvocation
|
||||||
|
|
||||||
#product specific version follows the product name
|
#product specific version follows the product name
|
||||||
#for filename 'dotnet-sdk-3.1.404-win-x64.zip': the product version is 3.1.400
|
#for filename 'dotnet-sdk-3.1.404-win-x64.zip': the product version is 3.1.400
|
||||||
$filename = $PackageDownloadLink.Substring($PackageDownloadLink.LastIndexOf("/") + 1)
|
$filename = $PackageDownloadLink.Substring($PackageDownloadLink.LastIndexOf("/") + 1)
|
||||||
$filenameParts = $filename.Split('-')
|
$filenameParts = $filename.Split('-')
|
||||||
if ($filenameParts.Length -gt 2) {
|
if ($filenameParts.Length -gt 2)
|
||||||
|
{
|
||||||
$productVersion = $filenameParts[2]
|
$productVersion = $filenameParts[2]
|
||||||
Say-Verbose "Extracted product version '$productVersion' from download link '$PackageDownloadLink'."
|
Say-Verbose "Extracted product version '$productVersion' from download link '$PackageDownloadLink'."
|
||||||
}
|
}
|
||||||
@@ -761,9 +771,6 @@ function Get-User-Share-Path() {
|
|||||||
if (!$InstallRoot) {
|
if (!$InstallRoot) {
|
||||||
$InstallRoot = "$env:LocalAppData\Microsoft\dotnet"
|
$InstallRoot = "$env:LocalAppData\Microsoft\dotnet"
|
||||||
}
|
}
|
||||||
elseif ($InstallRoot -like "$env:ProgramFiles\dotnet\?*") {
|
|
||||||
Say-Warning "The install root specified by the environment variable DOTNET_INSTALL_DIR points to the sub folder of $env:ProgramFiles\dotnet which is the default dotnet install root using .NET SDK installer. It is better to keep aligned with .NET SDK installer."
|
|
||||||
}
|
|
||||||
return $InstallRoot
|
return $InstallRoot
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -776,19 +783,6 @@ function Resolve-Installation-Path([string]$InstallDir) {
|
|||||||
return $InstallDir
|
return $InstallDir
|
||||||
}
|
}
|
||||||
|
|
||||||
function Test-User-Write-Access([string]$InstallDir) {
|
|
||||||
try {
|
|
||||||
$tempFileName = [guid]::NewGuid().ToString()
|
|
||||||
$tempFilePath = Join-Path -Path $InstallDir -ChildPath $tempFileName
|
|
||||||
New-Item -Path $tempFilePath -ItemType File -Force
|
|
||||||
Remove-Item $tempFilePath -Force
|
|
||||||
return $true
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
return $false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Is-Dotnet-Package-Installed([string]$InstallRoot, [string]$RelativePathToPackage, [string]$SpecificVersion) {
|
function Is-Dotnet-Package-Installed([string]$InstallRoot, [string]$RelativePathToPackage, [string]$SpecificVersion) {
|
||||||
Say-Invocation $MyInvocation
|
Say-Invocation $MyInvocation
|
||||||
|
|
||||||
@@ -864,7 +858,7 @@ function Extract-Dotnet-Package([string]$ZipPath, [string]$OutPath) {
|
|||||||
if (($null -eq $PathWithVersion) -Or ($DirectoriesToUnpack -contains $PathWithVersion)) {
|
if (($null -eq $PathWithVersion) -Or ($DirectoriesToUnpack -contains $PathWithVersion)) {
|
||||||
$DestinationPath = Get-Absolute-Path $(Join-Path -Path $OutPath -ChildPath $entry.FullName)
|
$DestinationPath = Get-Absolute-Path $(Join-Path -Path $OutPath -ChildPath $entry.FullName)
|
||||||
$DestinationDir = Split-Path -Parent $DestinationPath
|
$DestinationDir = Split-Path -Parent $DestinationPath
|
||||||
$OverrideFiles = $OverrideNonVersionedFiles -Or (-Not (Test-Path $DestinationPath))
|
$OverrideFiles=$OverrideNonVersionedFiles -Or (-Not (Test-Path $DestinationPath))
|
||||||
if ((-Not $DestinationPath.EndsWith("\")) -And $OverrideFiles) {
|
if ((-Not $DestinationPath.EndsWith("\")) -And $OverrideFiles) {
|
||||||
New-Item -ItemType Directory -Force -Path $DestinationDir | Out-Null
|
New-Item -ItemType Directory -Force -Path $DestinationDir | Out-Null
|
||||||
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($entry, $DestinationPath, $OverrideNonVersionedFiles)
|
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($entry, $DestinationPath, $OverrideNonVersionedFiles)
|
||||||
@@ -872,7 +866,8 @@ function Extract-Dotnet-Package([string]$ZipPath, [string]$OutPath) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch {
|
catch
|
||||||
|
{
|
||||||
Say-Error "Failed to extract package. Exception: $_"
|
Say-Error "Failed to extract package. Exception: $_"
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
@@ -959,8 +954,7 @@ function Prepend-Sdk-InstallRoot-To-Path([string]$InstallRoot) {
|
|||||||
if (-Not $env:path.Contains($SuffixedBinPath)) {
|
if (-Not $env:path.Contains($SuffixedBinPath)) {
|
||||||
Say "Adding to current process PATH: `"$BinPath`". Note: This change will not be visible if PowerShell was run as a child process."
|
Say "Adding to current process PATH: `"$BinPath`". Note: This change will not be visible if PowerShell was run as a child process."
|
||||||
$env:path = $SuffixedBinPath + $env:path
|
$env:path = $SuffixedBinPath + $env:path
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
Say-Verbose "Current process PATH already contains `"$BinPath`""
|
Say-Verbose "Current process PATH already contains `"$BinPath`""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -969,60 +963,36 @@ function Prepend-Sdk-InstallRoot-To-Path([string]$InstallRoot) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function PrintDryRunOutput($Invocation, $DownloadLinks) {
|
function PrintDryRunOutput($Invocation, $DownloadLinks)
|
||||||
|
{
|
||||||
Say "Payload URLs:"
|
Say "Payload URLs:"
|
||||||
|
|
||||||
for ($linkIndex = 0; $linkIndex -lt $DownloadLinks.count; $linkIndex++) {
|
for ($linkIndex=0; $linkIndex -lt $DownloadLinks.count; $linkIndex++) {
|
||||||
Say "URL #$linkIndex - $($DownloadLinks[$linkIndex].type): $($DownloadLinks[$linkIndex].downloadLink)"
|
Say "URL #$linkIndex - $($DownloadLinks[$linkIndex].type): $($DownloadLinks[$linkIndex].downloadLink)"
|
||||||
}
|
}
|
||||||
$RepeatableCommand = ".\$ScriptName -Version `"$SpecificVersion`" -InstallDir `"$InstallRoot`" -Architecture `"$CLIArchitecture`""
|
$RepeatableCommand = ".\$ScriptName -Version `"$SpecificVersion`" -InstallDir `"$InstallRoot`" -Architecture `"$CLIArchitecture`""
|
||||||
if ($Runtime -eq "dotnet") {
|
if ($Runtime -eq "dotnet") {
|
||||||
$RepeatableCommand += " -Runtime `"dotnet`""
|
$RepeatableCommand+=" -Runtime `"dotnet`""
|
||||||
}
|
}
|
||||||
elseif ($Runtime -eq "aspnetcore") {
|
elseif ($Runtime -eq "aspnetcore") {
|
||||||
$RepeatableCommand += " -Runtime `"aspnetcore`""
|
$RepeatableCommand+=" -Runtime `"aspnetcore`""
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($key in $Invocation.BoundParameters.Keys) {
|
foreach ($key in $Invocation.BoundParameters.Keys) {
|
||||||
if (-not (@("Architecture", "Channel", "DryRun", "InstallDir", "Runtime", "SharedRuntime", "Version", "Quality", "FeedCredential") -contains $key)) {
|
if (-not (@("Architecture","Channel","DryRun","InstallDir","Runtime","SharedRuntime","Version","Quality","FeedCredential") -contains $key)) {
|
||||||
$RepeatableCommand += " -$key `"$($Invocation.BoundParameters[$key])`""
|
$RepeatableCommand+=" -$key `"$($Invocation.BoundParameters[$key])`""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($Invocation.BoundParameters.Keys -contains "FeedCredential") {
|
if ($Invocation.BoundParameters.Keys -contains "FeedCredential") {
|
||||||
$RepeatableCommand += " -FeedCredential `"<feedCredential>`""
|
$RepeatableCommand+=" -FeedCredential `"<feedCredential>`""
|
||||||
}
|
}
|
||||||
Say "Repeatable invocation: $RepeatableCommand"
|
Say "Repeatable invocation: $RepeatableCommand"
|
||||||
if ($SpecificVersion -ne $EffectiveVersion) {
|
if ($SpecificVersion -ne $EffectiveVersion)
|
||||||
|
{
|
||||||
Say "NOTE: Due to finding a version manifest with this runtime, it would actually install with version '$EffectiveVersion'"
|
Say "NOTE: Due to finding a version manifest with this runtime, it would actually install with version '$EffectiveVersion'"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# grab the 'stem' of the redirect and check it against all of our configured feeds,
|
|
||||||
# if it matches, we can be sure that the redirect is valid and we should use it for
|
|
||||||
# subsequent processing
|
|
||||||
function Sanitize-RedirectUrl([string]$url) {
|
|
||||||
$urlSegments = ([System.Uri]$url).Segments;
|
|
||||||
$urlStem = $urlSegments[2..($urlSegments.Length - 1)] -join "";
|
|
||||||
Write-Verbose "Checking configured feeds for the asset at $urlStem"
|
|
||||||
foreach ($prospectiveFeed in $feeds) {
|
|
||||||
$trialUrl = "$prospectiveFeed/$urlStem";
|
|
||||||
Write-Verbose "Checking $trialUrl"
|
|
||||||
try {
|
|
||||||
$trialResponse = Invoke-WebRequest -Uri $trialUrl -Method HEAD
|
|
||||||
if ($trialResponse.StatusCode -eq 200) {
|
|
||||||
Write-Verbose "Found a match at $trialUrl"
|
|
||||||
return $trialUrl;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Write-Verbose "No match at $trialUrl"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
Write-Verbose "Failed to check $trialUrl"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Get-AkaMSDownloadLink([string]$Channel, [string]$Quality, [bool]$Internal, [string]$Product, [string]$Architecture) {
|
function Get-AkaMSDownloadLink([string]$Channel, [string]$Quality, [bool]$Internal, [string]$Product, [string]$Architecture) {
|
||||||
Say-Invocation $MyInvocation
|
Say-Invocation $MyInvocation
|
||||||
|
|
||||||
@@ -1040,18 +1010,19 @@ function Get-AkaMSDownloadLink([string]$Channel, [string]$Quality, [bool]$Intern
|
|||||||
}
|
}
|
||||||
$akaMsLink += "/$Channel"
|
$akaMsLink += "/$Channel"
|
||||||
if (-not [string]::IsNullOrEmpty($Quality)) {
|
if (-not [string]::IsNullOrEmpty($Quality)) {
|
||||||
$akaMsLink += "/$Quality"
|
$akaMsLink +="/$Quality"
|
||||||
}
|
}
|
||||||
$akaMsLink += "/$Product-win-$Architecture.zip"
|
$akaMsLink +="/$Product-win-$Architecture.zip"
|
||||||
Say-Verbose "Constructed aka.ms link: '$akaMsLink'."
|
Say-Verbose "Constructed aka.ms link: '$akaMsLink'."
|
||||||
$akaMsDownloadLink = $null
|
$akaMsDownloadLink=$null
|
||||||
|
|
||||||
for ($maxRedirections = 9; $maxRedirections -ge 0; $maxRedirections--) {
|
for ($maxRedirections = 9; $maxRedirections -ge 0; $maxRedirections--)
|
||||||
|
{
|
||||||
#get HTTP response
|
#get HTTP response
|
||||||
#do not pass credentials as a part of the $akaMsLink and do not apply credentials in the GetHTTPResponse function
|
#do not pass credentials as a part of the $akaMsLink and do not apply credentials in the GetHTTPResponse function
|
||||||
#otherwise the redirect link would have credentials as well
|
#otherwise the redirect link would have credentials as well
|
||||||
#it would result in applying credentials twice to the resulting link and thus breaking it, and in echoing credentials to the output as a part of redirect link
|
#it would result in applying credentials twice to the resulting link and thus breaking it, and in echoing credentials to the output as a part of redirect link
|
||||||
$Response = GetHTTPResponse -Uri $akaMsLink -HeaderOnly $true -DisableRedirect $true -DisableFeedCredential $true
|
$Response= GetHTTPResponse -Uri $akaMsLink -HeaderOnly $true -DisableRedirect $true -DisableFeedCredential $true
|
||||||
Say-Verbose "Received response:`n$Response"
|
Say-Verbose "Received response:`n$Response"
|
||||||
|
|
||||||
if ([string]::IsNullOrEmpty($Response)) {
|
if ([string]::IsNullOrEmpty($Response)) {
|
||||||
@@ -1060,7 +1031,8 @@ function Get-AkaMSDownloadLink([string]$Channel, [string]$Quality, [bool]$Intern
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if HTTP code is 301 (Moved Permanently), the redirect link exists
|
#if HTTP code is 301 (Moved Permanently), the redirect link exists
|
||||||
if ($Response.StatusCode -eq 301) {
|
if ($Response.StatusCode -eq 301)
|
||||||
|
{
|
||||||
try {
|
try {
|
||||||
$akaMsDownloadLink = $Response.Headers.GetValues("Location")[0]
|
$akaMsDownloadLink = $Response.Headers.GetValues("Location")[0]
|
||||||
|
|
||||||
@@ -1079,13 +1051,9 @@ function Get-AkaMSDownloadLink([string]$Channel, [string]$Quality, [bool]$Intern
|
|||||||
return $null
|
return $null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elseif ((($Response.StatusCode -lt 300) -or ($Response.StatusCode -ge 400)) -and (-not [string]::IsNullOrEmpty($akaMsDownloadLink))) {
|
elseif ((($Response.StatusCode -lt 300) -or ($Response.StatusCode -ge 400)) -and (-not [string]::IsNullOrEmpty($akaMsDownloadLink)))
|
||||||
|
{
|
||||||
# Redirections have ended.
|
# Redirections have ended.
|
||||||
$actualRedirectUrl = Sanitize-RedirectUrl $akaMsDownloadLink
|
|
||||||
if ($null -ne $actualRedirectUrl) {
|
|
||||||
$akaMsDownloadLink = $actualRedirectUrl
|
|
||||||
}
|
|
||||||
|
|
||||||
return $akaMsDownloadLink
|
return $akaMsDownloadLink
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1101,7 +1069,7 @@ function Get-AkaMSDownloadLink([string]$Channel, [string]$Quality, [bool]$Intern
|
|||||||
function Get-AkaMsLink-And-Version([string] $NormalizedChannel, [string] $NormalizedQuality, [bool] $Internal, [string] $ProductName, [string] $Architecture) {
|
function Get-AkaMsLink-And-Version([string] $NormalizedChannel, [string] $NormalizedQuality, [bool] $Internal, [string] $ProductName, [string] $Architecture) {
|
||||||
$AkaMsDownloadLink = Get-AkaMSDownloadLink -Channel $NormalizedChannel -Quality $NormalizedQuality -Internal $Internal -Product $ProductName -Architecture $Architecture
|
$AkaMsDownloadLink = Get-AkaMSDownloadLink -Channel $NormalizedChannel -Quality $NormalizedQuality -Internal $Internal -Product $ProductName -Architecture $Architecture
|
||||||
|
|
||||||
if ([string]::IsNullOrEmpty($AkaMsDownloadLink)) {
|
if ([string]::IsNullOrEmpty($AkaMsDownloadLink)){
|
||||||
if (-not [string]::IsNullOrEmpty($NormalizedQuality)) {
|
if (-not [string]::IsNullOrEmpty($NormalizedQuality)) {
|
||||||
# if quality is specified - exit with error - there is no fallback approach
|
# if quality is specified - exit with error - there is no fallback approach
|
||||||
Say-Error "Failed to locate the latest version in the channel '$NormalizedChannel' with '$NormalizedQuality' quality for '$ProductName', os: 'win', architecture: '$Architecture'."
|
Say-Error "Failed to locate the latest version in the channel '$NormalizedChannel' with '$NormalizedQuality' quality for '$ProductName', os: 'win', architecture: '$Architecture'."
|
||||||
@@ -1134,11 +1102,10 @@ function Get-AkaMsLink-And-Version([string] $NormalizedChannel, [string] $Normal
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function Get-Feeds-To-Use() {
|
function 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"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -1157,8 +1124,6 @@ function Get-Feeds-To-Use() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Write-Verbose "Initialized feeds: $feeds"
|
|
||||||
|
|
||||||
return $feeds
|
return $feeds
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1212,7 +1177,8 @@ function Prepare-Install-Directory {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($Help) {
|
if ($Help)
|
||||||
|
{
|
||||||
Get-Help $PSCommandPath -Examples
|
Get-Help $PSCommandPath -Examples
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
@@ -1240,10 +1206,6 @@ Measure-Action "Product discovery" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$InstallRoot = Resolve-Installation-Path $InstallDir
|
$InstallRoot = Resolve-Installation-Path $InstallDir
|
||||||
if (-not (Test-User-Write-Access $InstallRoot)) {
|
|
||||||
Say-Error "The current user doesn't have write access to the installation root '$InstallRoot' to install .NET. Please try specifying a different installation directory using the -InstallDir parameter, or ensure the selected directory has the appropriate permissions."
|
|
||||||
throw
|
|
||||||
}
|
|
||||||
Say-Verbose "InstallRoot: $InstallRoot"
|
Say-Verbose "InstallRoot: $InstallRoot"
|
||||||
$ScriptName = $MyInvocation.MyCommand.Name
|
$ScriptName = $MyInvocation.MyCommand.Name
|
||||||
($assetName, $dotnetPackageRelativePath) = Resolve-AssetName-And-RelativePath -Runtime $Runtime
|
($assetName, $dotnetPackageRelativePath) = Resolve-AssetName-And-RelativePath -Runtime $Runtime
|
||||||
@@ -1260,12 +1222,13 @@ if ([string]::IsNullOrEmpty($JSonFile) -and ($Version -eq "latest")) {
|
|||||||
($DownloadLink, $SpecificVersion, $EffectiveVersion) = Get-AkaMsLink-And-Version $NormalizedChannel $NormalizedQuality $Internal $NormalizedProduct $CLIArchitecture
|
($DownloadLink, $SpecificVersion, $EffectiveVersion) = Get-AkaMsLink-And-Version $NormalizedChannel $NormalizedQuality $Internal $NormalizedProduct $CLIArchitecture
|
||||||
|
|
||||||
if ($null -ne $DownloadLink) {
|
if ($null -ne $DownloadLink) {
|
||||||
$DownloadLinks += New-Object PSObject -Property @{downloadLink = "$DownloadLink"; specificVersion = "$SpecificVersion"; effectiveVersion = "$EffectiveVersion"; type = 'aka.ms' }
|
$DownloadLinks += New-Object PSObject -Property @{downloadLink="$DownloadLink";specificVersion="$SpecificVersion";effectiveVersion="$EffectiveVersion";type='aka.ms'}
|
||||||
Say-Verbose "Generated aka.ms link $DownloadLink with version $EffectiveVersion"
|
Say-Verbose "Generated aka.ms link $DownloadLink with version $EffectiveVersion"
|
||||||
|
|
||||||
if (-Not $DryRun) {
|
if (-Not $DryRun) {
|
||||||
Say-Verbose "Checking if the version $EffectiveVersion is already installed"
|
Say-Verbose "Checking if the version $EffectiveVersion is already installed"
|
||||||
if (Is-Dotnet-Package-Installed -InstallRoot $InstallRoot -RelativePathToPackage $dotnetPackageRelativePath -SpecificVersion $EffectiveVersion) {
|
if (Is-Dotnet-Package-Installed -InstallRoot $InstallRoot -RelativePathToPackage $dotnetPackageRelativePath -SpecificVersion $EffectiveVersion)
|
||||||
|
{
|
||||||
Say "$assetName with version '$EffectiveVersion' is already installed."
|
Say "$assetName with version '$EffectiveVersion' is already installed."
|
||||||
Prepend-Sdk-InstallRoot-To-Path -InstallRoot $InstallRoot
|
Prepend-Sdk-InstallRoot-To-Path -InstallRoot $InstallRoot
|
||||||
return
|
return
|
||||||
@@ -1276,31 +1239,34 @@ if ([string]::IsNullOrEmpty($JSonFile) -and ($Version -eq "latest")) {
|
|||||||
|
|
||||||
# Primary and legacy links cannot be used if a quality was specified.
|
# Primary and legacy links cannot be used if a quality was specified.
|
||||||
# If we already have an aka.ms link, no need to search the blob feeds.
|
# If we already have an aka.ms link, no need to search the blob feeds.
|
||||||
if ([string]::IsNullOrEmpty($NormalizedQuality) -and 0 -eq $DownloadLinks.count) {
|
if ([string]::IsNullOrEmpty($NormalizedQuality) -and 0 -eq $DownloadLinks.count)
|
||||||
|
{
|
||||||
foreach ($feed in $feeds) {
|
foreach ($feed in $feeds) {
|
||||||
try {
|
try {
|
||||||
$SpecificVersion = Get-Specific-Version-From-Version -AzureFeed $feed -Channel $Channel -Version $Version -JSonFile $JSonFile
|
$SpecificVersion = Get-Specific-Version-From-Version -AzureFeed $feed -Channel $Channel -Version $Version -JSonFile $JSonFile
|
||||||
$DownloadLink, $EffectiveVersion = Get-Download-Link -AzureFeed $feed -SpecificVersion $SpecificVersion -CLIArchitecture $CLIArchitecture
|
$DownloadLink, $EffectiveVersion = Get-Download-Link -AzureFeed $feed -SpecificVersion $SpecificVersion -CLIArchitecture $CLIArchitecture
|
||||||
$LegacyDownloadLink = Get-LegacyDownload-Link -AzureFeed $feed -SpecificVersion $SpecificVersion -CLIArchitecture $CLIArchitecture
|
$LegacyDownloadLink = Get-LegacyDownload-Link -AzureFeed $feed -SpecificVersion $SpecificVersion -CLIArchitecture $CLIArchitecture
|
||||||
|
|
||||||
$DownloadLinks += New-Object PSObject -Property @{downloadLink = "$DownloadLink"; specificVersion = "$SpecificVersion"; effectiveVersion = "$EffectiveVersion"; type = 'primary' }
|
$DownloadLinks += New-Object PSObject -Property @{downloadLink="$DownloadLink";specificVersion="$SpecificVersion";effectiveVersion="$EffectiveVersion";type='primary'}
|
||||||
Say-Verbose "Generated primary link $DownloadLink with version $EffectiveVersion"
|
Say-Verbose "Generated primary link $DownloadLink with version $EffectiveVersion"
|
||||||
|
|
||||||
if (-not [string]::IsNullOrEmpty($LegacyDownloadLink)) {
|
if (-not [string]::IsNullOrEmpty($LegacyDownloadLink)) {
|
||||||
$DownloadLinks += New-Object PSObject -Property @{downloadLink = "$LegacyDownloadLink"; specificVersion = "$SpecificVersion"; effectiveVersion = "$EffectiveVersion"; type = 'legacy' }
|
$DownloadLinks += New-Object PSObject -Property @{downloadLink="$LegacyDownloadLink";specificVersion="$SpecificVersion";effectiveVersion="$EffectiveVersion";type='legacy'}
|
||||||
Say-Verbose "Generated legacy link $LegacyDownloadLink with version $EffectiveVersion"
|
Say-Verbose "Generated legacy link $LegacyDownloadLink with version $EffectiveVersion"
|
||||||
}
|
}
|
||||||
|
|
||||||
if (-Not $DryRun) {
|
if (-Not $DryRun) {
|
||||||
Say-Verbose "Checking if the version $EffectiveVersion is already installed"
|
Say-Verbose "Checking if the version $EffectiveVersion is already installed"
|
||||||
if (Is-Dotnet-Package-Installed -InstallRoot $InstallRoot -RelativePathToPackage $dotnetPackageRelativePath -SpecificVersion $EffectiveVersion) {
|
if (Is-Dotnet-Package-Installed -InstallRoot $InstallRoot -RelativePathToPackage $dotnetPackageRelativePath -SpecificVersion $EffectiveVersion)
|
||||||
|
{
|
||||||
Say "$assetName with version '$EffectiveVersion' is already installed."
|
Say "$assetName with version '$EffectiveVersion' is already installed."
|
||||||
Prepend-Sdk-InstallRoot-To-Path -InstallRoot $InstallRoot
|
Prepend-Sdk-InstallRoot-To-Path -InstallRoot $InstallRoot
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch {
|
catch
|
||||||
|
{
|
||||||
Say-Verbose "Failed to acquire download links from feed $feed. Exception: $_"
|
Say-Verbose "Failed to acquire download links from feed $feed. Exception: $_"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1323,7 +1289,8 @@ $DownloadSucceeded = $false
|
|||||||
$DownloadedLink = $null
|
$DownloadedLink = $null
|
||||||
$ErrorMessages = @()
|
$ErrorMessages = @()
|
||||||
|
|
||||||
foreach ($link in $DownloadLinks) {
|
foreach ($link in $DownloadLinks)
|
||||||
|
{
|
||||||
Say-Verbose "Downloading `"$($link.type)`" link $($link.downloadLink)"
|
Say-Verbose "Downloading `"$($link.type)`" link $($link.downloadLink)"
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -1343,8 +1310,7 @@ foreach ($link in $DownloadLinks) {
|
|||||||
|
|
||||||
if ($PSItem.Exception.Data.Contains("ErrorMessage")) {
|
if ($PSItem.Exception.Data.Contains("ErrorMessage")) {
|
||||||
$ErrorMessage = $PSItem.Exception.Data["ErrorMessage"]
|
$ErrorMessage = $PSItem.Exception.Data["ErrorMessage"]
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
$ErrorMessage = $PSItem.Exception.Message
|
$ErrorMessage = $PSItem.Exception.Message
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1395,225 +1361,224 @@ if (-not $KeepZip) {
|
|||||||
|
|
||||||
Measure-Action "Setting up shell environment" { Prepend-Sdk-InstallRoot-To-Path -InstallRoot $InstallRoot }
|
Measure-Action "Setting up shell environment" { Prepend-Sdk-InstallRoot-To-Path -InstallRoot $InstallRoot }
|
||||||
|
|
||||||
Say "Note that the script does not ensure your Windows version is supported during the installation."
|
Say "Note that the script does not resolve dependencies during installation."
|
||||||
Say "To check the list of supported versions, go to https://learn.microsoft.com/dotnet/core/install/windows#supported-versions"
|
Say "To check the list of dependencies, go to https://learn.microsoft.com/dotnet/core/install/windows#dependencies"
|
||||||
Say "Installed version is $($DownloadedLink.effectiveVersion)"
|
Say "Installed version is $($DownloadedLink.effectiveVersion)"
|
||||||
Say "Installation finished"
|
Say "Installation finished"
|
||||||
# SIG # Begin signature block
|
# SIG # Begin signature block
|
||||||
# MIIoVQYJKoZIhvcNAQcCoIIoRjCCKEICAQExDzANBglghkgBZQMEAgEFADB5Bgor
|
# MIIoLAYJKoZIhvcNAQcCoIIoHTCCKBkCAQExDzANBglghkgBZQMEAgEFADB5Bgor
|
||||||
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
|
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
|
||||||
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAYvsOYTXPcgaBF
|
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAcjJpspXTX0Wfr
|
||||||
# C8M6oYBHzvQKaqKPOJVvd3P0sSBCw6CCDYUwggYDMIID66ADAgECAhMzAAAEA73V
|
# XrmBKKJAMp5FGvSyRcbMwr8jAJ2D2qCCDXYwggX0MIID3KADAgECAhMzAAADrzBA
|
||||||
# lV0POxitAAAAAAQDMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
|
# DkyjTQVBAAAAAAOvMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
|
||||||
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
|
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
|
||||||
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
|
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
|
||||||
# bmcgUENBIDIwMTEwHhcNMjQwOTEyMjAxMTEzWhcNMjUwOTExMjAxMTEzWjB0MQsw
|
# bmcgUENBIDIwMTEwHhcNMjMxMTE2MTkwOTAwWhcNMjQxMTE0MTkwOTAwWjB0MQsw
|
||||||
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
|
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
|
||||||
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
|
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
|
||||||
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
|
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
|
||||||
# AQCfdGddwIOnbRYUyg03O3iz19XXZPmuhEmW/5uyEN+8mgxl+HJGeLGBR8YButGV
|
# AQDOS8s1ra6f0YGtg0OhEaQa/t3Q+q1MEHhWJhqQVuO5amYXQpy8MDPNoJYk+FWA
|
||||||
# LVK38RxcVcPYyFGQXcKcxgih4w4y4zJi3GvawLYHlsNExQwz+v0jgY/aejBS2EJY
|
# hePP5LxwcSge5aen+f5Q6WNPd6EDxGzotvVpNi5ve0H97S3F7C/axDfKxyNh21MG
|
||||||
# oUhLVE+UzRihV8ooxoftsmKLb2xb7BoFS6UAo3Zz4afnOdqI7FGoi7g4vx/0MIdi
|
# 0W8Sb0vxi/vorcLHOL9i+t2D6yvvDzLlEefUCbQV/zGCBjXGlYJcUj6RAzXyeNAN
|
||||||
# kwTn5N56TdIv3mwfkZCFmrsKpN0zR8HD8WYsvH3xKkG7u/xdqmhPPqMmnI2jOFw/
|
# xSpKXAGd7Fh+ocGHPPphcD9LQTOJgG7Y7aYztHqBLJiQQ4eAgZNU4ac6+8LnEGAL
|
||||||
# /n2aL8W7i1Pasja8PnRXH/QaVH0M1nanL+LI9TsMb/enWfXOW65Gne5cqMN9Uofv
|
# go1ydC5BJEuJQjYKbNTy959HrKSu7LO3Ws0w8jw6pYdC1IMpdTkk2puTgY2PDNzB
|
||||||
# ENtdwwEmJ3bZrcI9u4LZAkujAgMBAAGjggGCMIIBfjAfBgNVHSUEGDAWBgorBgEE
|
# tLM4evG7FYer3WX+8t1UMYNTAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE
|
||||||
# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQU6m4qAkpz4641iK2irF8eWsSBcBkw
|
# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQURxxxNPIEPGSO8kqz+bgCAQWGXsEw
|
||||||
# VAYDVR0RBE0wS6RJMEcxLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJh
|
# RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW
|
||||||
# dGlvbnMgTGltaXRlZDEWMBQGA1UEBRMNMjMwMDEyKzUwMjkyNjAfBgNVHSMEGDAW
|
# MBQGA1UEBRMNMjMwMDEyKzUwMTgyNjAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci
|
||||||
# gBRIbmTlUAXTgqoXNzcitW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8v
|
# tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
|
||||||
# d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIw
|
# b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG
|
||||||
# MTEtMDctMDguY3JsMGEGCCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDov
|
# CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu
|
||||||
# L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDEx
|
# Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0
|
||||||
# XzIwMTEtMDctMDguY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIB
|
# MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAISxFt/zR2frTFPB45Yd
|
||||||
# AFFo/6E4LX51IqFuoKvUsi80QytGI5ASQ9zsPpBa0z78hutiJd6w154JkcIx/f7r
|
# mhZpB2nNJoOoi+qlgcTlnO4QwlYN1w/vYwbDy/oFJolD5r6FMJd0RGcgEM8q9TgQ
|
||||||
# EBK4NhD4DIFNfRiVdI7EacEs7OAS6QHF7Nt+eFRNOTtgHb9PExRy4EI/jnMwzQJV
|
# 2OC7gQEmhweVJ7yuKJlQBH7P7Pg5RiqgV3cSonJ+OM4kFHbP3gPLiyzssSQdRuPY
|
||||||
# NokTxu2WgHr/fBsWs6G9AcIgvHjWNN3qRSrhsgEdqHc0bRDUf8UILAdEZOMBvKLC
|
# 1mIWoGg9i7Y4ZC8ST7WhpSyc0pns2XsUe1XsIjaUcGu7zd7gg97eCUiLRdVklPmp
|
||||||
# rmf+kJPEvPldgK7hFO/L9kmcVe67BnKejDKO73Sa56AJOhM7CkeATrJFxO9GLXos
|
# XobH9CEAWakRUGNICYN2AgjhRTC4j3KJfqMkU04R6Toyh4/Toswm1uoDcGr5laYn
|
||||||
# oKvrwBvynxAg18W+pagTAkJefzneuWSmniTurPCUE2JnvW7DalvONDOtG01sIVAB
|
# TfcX3u5WnJqJLhuPe8Uj9kGAOcyo0O1mNwDa+LhFEzB6CB32+wfJMumfr6degvLT
|
||||||
# +ahO2wcUPa2Zm9AiDVBWTMz9XUoKMcvngi2oqbsDLhbK+pYrRUgRpNt0y1sxZsXO
|
# e8x55urQLeTjimBQgS49BSUkhFN7ois3cZyNpnrMca5AZaC7pLI72vuqSsSlLalG
|
||||||
# raGRF8lM2cWvtEkV5UL+TQM1ppv5unDHkW8JS+QnfPbB8dZVRyRmMQ4aY/tx5x5+
|
# OcZmPHZGYJqZ0BacN274OZ80Q8B11iNokns9Od348bMb5Z4fihxaBWebl8kWEi2O
|
||||||
# sX6semJ//FbiclSMxSI+zINu1jYerdUwuCi+P6p7SmQmClhDM+6Q+btE2FtpsU0W
|
# PvQImOAeq3nt7UWJBzJYLAGEpfasaA3ZQgIcEXdD+uwo6ymMzDY6UamFOfYqYWXk
|
||||||
# +r6RdYFf/P+nK6j2otl9Nvr3tWLu+WXmz8MGM+18ynJ+lYbSmFWcAj7SYziAfT0s
|
# ntxDGu7ngD2ugKUuccYKJJRiiz+LAUcj90BVcSHRLQop9N8zoALr/1sJuwPrVAtx
|
||||||
# IwlQRFkyC71tsIZUhBHtxPliGUu362lIO0Lpe0DOrg8lspnEWOkHnCT5JEnWCbzu
|
# HNEgSW+AKBqIxYWM4Ev32l6agSUAezLMbq5f3d8x9qzT031jMDT+sUAoCw0M5wVt
|
||||||
# iVt8RX1IV07uIveNZuOBWLVCzWJjEGa+HhaEtavjy6i7MIIHejCCBWKgAwIBAgIK
|
# CUQcqINPuYjbS1WgJyZIiEkBMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq
|
||||||
# YQ6Q0gAAAAAAAzANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNV
|
# hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x
|
||||||
# BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv
|
# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
|
||||||
# c29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlm
|
# bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
|
||||||
# aWNhdGUgQXV0aG9yaXR5IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEw
|
# IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG
|
||||||
# OTA5WjB+MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
|
# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
|
||||||
# BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYD
|
# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg
|
||||||
# VQQDEx9NaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG
|
# Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
|
||||||
# 9w0BAQEFAAOCAg8AMIICCgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+la
|
# CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03
|
||||||
# UKq4BjgaBEm6f8MMHt03a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc
|
# a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr
|
||||||
# 6Whe0t+bU7IKLMOv2akrrnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4D
|
# rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg
|
||||||
# dato88tt8zpcoRb0RrrgOGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+
|
# OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy
|
||||||
# lD3v++MrWhAfTVYoonpy4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nk
|
# 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9
|
||||||
# kDstrjNYxbc+/jLTswM9sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6
|
# sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh
|
||||||
# A4aN91/w0FK/jJSHvMAhdCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmd
|
# dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k
|
||||||
# X4jiJV3TIUs+UsS1Vz8kA/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL
|
# A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB
|
||||||
# 5zmhD+kjSbwYuER8ReTBw3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zd
|
# w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn
|
||||||
# sGbiwZeBe+3W7UvnSSmnEyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3
|
# Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90
|
||||||
# T8HhhUSJxAlMxdSlQy90lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS
|
# lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w
|
||||||
# 4NaIjAsCAwEAAaOCAe0wggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRI
|
# ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o
|
||||||
# bmTlUAXTgqoXNzcitW2oynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAL
|
# ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD
|
||||||
# BgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBD
|
# VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa
|
||||||
# uRQFTuHqp8cx0SOJNDBaBgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jv
|
# BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny
|
||||||
# c29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFf
|
# bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG
|
||||||
# MDNfMjIuY3JsMF4GCCsGAQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3
|
# AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t
|
||||||
# dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFf
|
# L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV
|
||||||
# MDNfMjIuY3J0MIGfBgNVHSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEF
|
# HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3
|
||||||
# BQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1h
|
# dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG
|
||||||
# cnljcHMuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkA
|
# AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl
|
||||||
# YwB5AF8AcwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn
|
# AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb
|
||||||
# 8oalmOBUeRou09h0ZyKbC5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7
|
# C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l
|
||||||
# v0epo/Np22O/IjWll11lhJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0b
|
# hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6
|
||||||
# pdS1HXeUOeLpZMlEPXh6I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/
|
# I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0
|
||||||
# KmtYSWMfCWluWpiW5IP0wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvy
|
# wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560
|
||||||
# CInWH8MyGOLwxS3OW560STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBp
|
# STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam
|
||||||
# mLJZiWhub6e3dMNABQamASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJi
|
# ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa
|
||||||
# hsMdYzaXht/a8/jyFqGaJ+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYb
|
# J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah
|
||||||
# BL7fQccOKO7eZS/sl/ahXJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbS
|
# XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA
|
||||||
# oqKfenoi+kiVH6v7RyOA9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sL
|
# 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt
|
||||||
# gOppO6/8MO0ETI7f33VtY5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtX
|
# Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr
|
||||||
# cVZOSEXAQsmbdlsKgEhr/Xmfwb1tbWrJUnMTDXpQzTGCGiYwghoiAgEBMIGVMH4x
|
# /Xmfwb1tbWrJUnMTDXpQzTGCGgwwghoIAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw
|
||||||
# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt
|
# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
|
||||||
# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01p
|
# aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp
|
||||||
# Y3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTECEzMAAAQDvdWVXQ87GK0AAAAA
|
# Z25pbmcgUENBIDIwMTECEzMAAAOvMEAOTKNNBUEAAAAAA68wDQYJYIZIAWUDBAIB
|
||||||
# BAMwDQYJYIZIAWUDBAIBBQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw
|
# BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO
|
||||||
# HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEINfL
|
# MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEILE0f3lJHQgU2RZWXUC1oqZH
|
||||||
# pWARcSI2v5ypXRaeSwvLuu7hP0XgYbvQaaOIuiKWMEIGCisGAQQBgjcCAQwxNDAy
|
# SyMVCuT1h5mXGiSSjTDHMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A
|
||||||
# oBSAEgBNAGkAYwByAG8AcwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
|
# cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB
|
||||||
# b20wDQYJKoZIhvcNAQEBBQAEggEADr/V9EQlvMcNLQduKLU/gz5PRRSoE8txgN52
|
# BQAEggEANxDFgCiCDFasXK4jelzA8ed3cn/ZebTOsL/D/5LQTgwhbjtfp1Dp7awF
|
||||||
# OuBIJS4+jPp3y82+4/09umeMdQ7+pwRQiuPAvmyZG0zGRoTz3PzpouceetqHnIHn
|
# 8vESgjYXq22XMBz5vV12f2f14XzxG1kW17bP9OR+D2C3GUlN2xQstIhslXJRKVwi
|
||||||
# ij0lT0y4hUQ0DqmZT1AA24GJmoPnM9ab2EcRTfUp7p0t1Fq5ITOEdFvvh6EPkyc/
|
# lpFqHGFKy8o6sssvdrtsatlfrtC+ZChbQ1nyJmYWiCotVTwoi6UMA3EiXfQ/6KGo
|
||||||
# spxmI5bTlE0+anj9PmnLyFYnFtrGlmSywrDpIsjqnE8+ODtTabllcpAhLrZxInqu
|
# o8MykKgtMWaolI63lITY2EWtUowSgg7IToyrZEYOH3p45F3Rb3mfVl5GE9u8BPBZ
|
||||||
# bHXIrT3cGjATJsRAg+38R5tYP7i6aI5sS9QGmeXhuvrJeFrOIqC2gxbV7iCJIrkE
|
# WyZ3JZPojeJZPBwoh746RijTpga+MIPTLMT5/pyEFF37XoTfKy+pmIy2g27fGF0f
|
||||||
# 5OGFIBZQkxLRZxt3VYdGAjBLj+pCY7OEjXpXvkdg47Xo8aQCKqGCF7AwghesBgor
|
# dUTMVnaeP3Gsz/QoRIYGwRZHxPIn06GCF5YwgheSBgorBgEEAYI3AwMBMYIXgjCC
|
||||||
# BgEEAYI3AwMBMYIXnDCCF5gGCSqGSIb3DQEHAqCCF4kwgheFAgEDMQ8wDQYJYIZI
|
# F34GCSqGSIb3DQEHAqCCF28wghdrAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFRBgsq
|
||||||
# AWUDBAIBBQAwggFaBgsqhkiG9w0BCRABBKCCAUkEggFFMIIBQQIBAQYKKwYBBAGE
|
# hkiG9w0BCRABBKCCAUAEggE8MIIBOAIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl
|
||||||
# WQoDATAxMA0GCWCGSAFlAwQCAQUABCBVg4bCpxEOAWWIN2/4kB21BawVRDfKQ35G
|
# AwQCAQUABCDsnfXLdwRAAmajQ5qXHFhiKlkumRT841LqpvZZhWG0uwIGZbwTAVg6
|
||||||
# xRhhaLpK/AIGZ2KxlnK4GBMyMDI0MTIyMzE2NDIwNy43NDJaMASAAgH0oIHZpIHW
|
# GBIyMDI0MDIxNDIxMTUyNS45OVowBIACAfSggdGkgc4wgcsxCzAJBgNVBAYTAlVT
|
||||||
# MIHTMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH
|
# MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK
|
||||||
# UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQL
|
# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVy
|
||||||
# EyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsT
|
# aWNhIE9wZXJhdGlvbnMxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjozNzAzLTA1
|
||||||
# Hm5TaGllbGQgVFNTIEVTTjo2QjA1LTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9z
|
# RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaCC
|
||||||
# b2Z0IFRpbWUtU3RhbXAgU2VydmljZaCCEf4wggcoMIIFEKADAgECAhMzAAAB9oMv
|
# Ee0wggcgMIIFCKADAgECAhMzAAAB6pokctVZP2FjAAEAAAHqMA0GCSqGSIb3DQEB
|
||||||
# JmpUXSLBAAEAAAH2MA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYD
|
# CwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH
|
||||||
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
|
# EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNV
|
||||||
# b3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1w
|
# BAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4XDTIzMTIwNjE4NDUz
|
||||||
# IFBDQSAyMDEwMB4XDTI0MDcyNTE4MzEwNFoXDTI1MTAyMjE4MzEwNFowgdMxCzAJ
|
# MFoXDTI1MDMwNTE4NDUzMFowgcsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo
|
||||||
# BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k
|
|
||||||
# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jv
|
|
||||||
# c29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNoaWVs
|
|
||||||
# ZCBUU1MgRVNOOjZCMDUtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGlt
|
|
||||||
# ZS1TdGFtcCBTZXJ2aWNlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
|
|
||||||
# 0UJeLMR/N9WPBZhuKVFF+eWJZ68Wujdj4X6JR05cxO5CepNXo17rVazwWLkm5Aja
|
|
||||||
# Vh19ZVjDChHzimxsoaXxNu8IDggKwpXvpAAItv4Ux50e9S2uVwfKv57p9JKG+Q7V
|
|
||||||
# ONShujl1NCMkcgSrPdmd/8zcsmhzcNobLomrCAIORZ8IwhYy4siVQlf1NKhlyAzm
|
|
||||||
# kWJD0N+60IiogFBzg3yISsvroOx0x1xSi2PiRIQlTXE74MggZDIDKqH/hb9FT2kK
|
|
||||||
# /nV/aXjuo9LMrrRmn44oYYADe/rO95F+SG3uuuhf+H4IriXr0h9ptA6SwHJPS2Vm
|
|
||||||
# bNWCjQWq5G4YkrcqbPMax7vNXUwu7T65E8fFPd1IuE9RsG4TMAV7XkXBopmPNfvL
|
|
||||||
# 0hjxg44kpQn384V46o+zdQqy5K9dDlWm/J6vZtp5yA1PyD3w+HbGubS0niEQ1L6w
|
|
||||||
# GOrPfzIm0FdOn+xFo48ERl+Fxw/3OvXM5CY1EqnzEznPjzJc7OJwhJVR3VQDHjBc
|
|
||||||
# EFTOvS9E0diNu1eocw+ZCkz4Pu/oQv+gqU+bfxL8e7PFktfRDlM6FyOzjP4zuI25
|
|
||||||
# gD8tO9zJg6g6fRpaZc439mAbkl3zCVzTLDgchv6SxQajJtvvoQaZxQf0tRiPcbr2
|
|
||||||
# HWfMoqqd9uiQ0hTUEhG44FBSTeUPZeEenRCWadCW4G8CAwEAAaOCAUkwggFFMB0G
|
|
||||||
# A1UdDgQWBBRIwZsJuOcJfScPWcXZuBA4B89K8jAfBgNVHSMEGDAWgBSfpxVdAF5i
|
|
||||||
# XYP05dJlpxtTNRnpcjBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1pY3Jv
|
|
||||||
# c29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENB
|
|
||||||
# JTIwMjAxMCgxKS5jcmwwbAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBodHRw
|
|
||||||
# Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRp
|
|
||||||
# bWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNydDAMBgNVHRMBAf8EAjAAMBYGA1Ud
|
|
||||||
# JQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQsF
|
|
||||||
# AAOCAgEA13kBirH1cHu1WYR1ysj125omGtQ0PaQkEzwGb70xtqSoI+svQihsgdTY
|
|
||||||
# xaPfp2IVFdgjaMaBi81wB8/nu866FfFKKdhdp3wnMZ91PpP4Ooe7Ncf6qICkgSuw
|
|
||||||
# gdIdQvqE0h8VQ5QW5sDV4Q0Jnj4f7KHYx4NiM8C4jTw8SQtsuxWiTH2Hikf3QYB7
|
|
||||||
# 1a7dB9zgHOkW0hgUEeWO9mh2wWqYS/Q48ASjOqYw/ha54oVOff22WaoH+/Hxd9NT
|
|
||||||
# EU/4vlvsRIMWT0jsnNI71jVArT4Q9Bt6VShWzyqraE6SKUoZrEwBpVsI0LMg2X3h
|
|
||||||
# OLblC1vxM3+wMyOh97aFOs7sFnuemtI2Mfj8qg16BZTJxXlpPurWrG+OBj4BoTDk
|
|
||||||
# C9AxXYB3yEtuwMs7pRWLyxIxw/wV9THKUGm+x+VE0POLwkrSMgjulSXkpfELHWWi
|
|
||||||
# CVslJbFIIB/4Alv+jQJSKAJuo9CErbm2qeDk/zjJYlYaVGMyKuYZ+uSRVKB2qkEP
|
|
||||||
# cEzG1dO9zIa1Mp32J+zzW3P7suJfjw62s3hDOLk+6lMQOR04x+2o17G3LceLkkxJ
|
|
||||||
# m41ErdiTjAmdClen9yl6HgMpGS4okjFCJX+CpOFX7gBA3PVxQWubisAQbL5HgTFB
|
|
||||||
# tQNEzcCdh1GYw/6nzzNNt+0GQnnobBddfOAiqkzvItqXjvGyK1QwggdxMIIFWaAD
|
|
||||||
# AgECAhMzAAAAFcXna54Cm0mZAAAAAAAVMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYD
|
|
||||||
# VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe
|
|
||||||
# MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3Nv
|
|
||||||
# ZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0yMTA5MzAxODIy
|
|
||||||
# MjVaFw0zMDA5MzAxODMyMjVaMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo
|
|
||||||
# aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y
|
# aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y
|
||||||
# cG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEw
|
# cG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMx
|
||||||
# MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5OGmTOe0ciELeaLL1yR5
|
# JzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjozNzAzLTA1RTAtRDk0NzElMCMGA1UE
|
||||||
# vQ7VgtP97pwHB9KpbE51yMo1V/YBf2xK4OK9uT4XYDP/XE/HZveVU3Fa4n5KWv64
|
# AxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZTCCAiIwDQYJKoZIhvcNAQEB
|
||||||
# NmeFRiMMtY0Tz3cywBAY6GB9alKDRLemjkZrBxTzxXb1hlDcwUTIcVxRMTegCjhu
|
# BQADggIPADCCAgoCggIBALULX/FIPyAH1fsu52ijatZvaSypoXrlC0mRtCmaxzob
|
||||||
# je3XD9gmU3w5YQJ6xKr9cmmvHaus9ja+NSZk2pg7uhp7M62AW36MEBydUv626GIl
|
# huDkw6/pY/+4nhc4m8pf9zW3R6PihYGp0YPpVuNdfhPQp/KVO6WvMq2DGfFmHurW
|
||||||
# 3GoPz130/o5Tz9bshVZN7928jaTjkY+yOSxRnOlwaQ3KNi1wjjHINSi947SHJMPg
|
# 4PQPL/DkbQMkM9vqjFCvPq8xXZnfL1nGN9moGcN+oaif/hUMedmF1qzbay9ILkYf
|
||||||
# yY9+tVSP3PoFVZhtaDuaRr3tpK56KTesy+uDRedGbsoy1cCGMFxPLOJiss254o2I
|
# LCxDYn3Qwzsvh5xjxOcsjzmRddNURJvT23Eva0cxisH4ocLLTx2zfpqfshw4Z9Ga
|
||||||
# 5JasAUq7vnGpF1tnYN74kpEeHT39IM9zfUGaRnXNxF803RKJ1v2lIH1+/NmeRd+2
|
# EdsWg9rmib1galUpLzF5PsQDBbtZtcv+Wjmn0pFEiMCWwEEcPVN0YG5ysYLdNBdJ
|
||||||
# ci/bfV+AutuqfjbsNkz2K26oElHovwUDo9Fzpk03dJQcNIIP8BDyt0cY7afomXw/
|
# On2zsOOS+80W5RrQEqzPpSIIvEkZBJmF3aI4lMR8nV/FiTadjpIIqxX5Wa1XlqI/
|
||||||
# TNuvXsLz1dhzPUNOwTM5TI4CvEJoLhDqhFFG4tG9ahhaYQFzymeiXtcodgLiMxhy
|
# Nj+xagVjnjb7POsA+vh6Wu+v24HpyL8pyL/8Q4RFkRRME9cwT+Jr63yOtPbLe6DX
|
||||||
# 16cg8ML6EgrXY28MyTZki1ugpoMhXV8wdJGUlNi5UPkLiWHzNgY1GIRH29wb0f2y
|
# kxIJW6E6w2ua5kXBpEKtEQPTLPhX3CUxMYcglbnmI0zcc9UknX285K+sI/2WwRwT
|
||||||
# 1BzFa/ZcUlFdEtsluq9QBXpsxREdcu+N+VLEhReTwDwV2xo3xwgVGD94q0W29R6H
|
# BZkhDUULI86eQzV+zvzzR1qEBrlSY+oyTlYQrHMM9WnTzVflFDocZVTPpl2BDSNx
|
||||||
# XtqPnhZyacaue7e3PmriLq0CAwEAAaOCAd0wggHZMBIGCSsGAQQBgjcVAQQFAgMB
|
# Pn0Qb4IoM9EPqbHyi/MilL+v/AQc8q3mQ6FiuPJAddz0ocpNZ9ekBWPVLKq3lfie
|
||||||
# AAEwIwYJKwYBBAGCNxUCBBYEFCqnUv5kxJq+gpE8RjUpzxD/LwTuMB0GA1UdDgQW
|
# v4yl65u/438+NAQ+vSJgkONLMmuoguEGzmnK1vq/JHwdRUyn6YADiteM7Dja+Qd9
|
||||||
# BBSfpxVdAF5iXYP05dJlpxtTNRnpcjBcBgNVHSAEVTBTMFEGDCsGAQQBgjdMg30B
|
# AgMBAAGjggFJMIIBRTAdBgNVHQ4EFgQUK4FFJaJR5ukXQFTUxMhyiwVuWV4wHwYD
|
||||||
# ATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
|
# VR0jBBgwFoAUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXwYDVR0fBFgwVjBUoFKgUIZO
|
||||||
# L0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYB
|
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIw
|
||||||
# BAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMB
|
# VGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3JsMGwGCCsGAQUFBwEBBGAwXjBc
|
||||||
# Af8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8wTTBL
|
# BggrBgEFBQcwAoZQaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0
|
||||||
# oEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMv
|
# cy9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcnQwDAYD
|
||||||
# TWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggr
|
# VR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8EBAMC
|
||||||
# BgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNS
|
# B4AwDQYJKoZIhvcNAQELBQADggIBACiDrVZeP37+fFVtfcbfsqC/Kg0Ce67bDceh
|
||||||
# b29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwDQYJKoZIhvcNAQELBQADggIBAJ1Vffwq
|
# ZmPcfRgJ5Ddv0pJlOFVOFbiIVwesqeEUwFtclfi5AjneQ5ZJpYJpXfELOelG3dzj
|
||||||
# reEsH2cBMSRb4Z5yS/ypb+pcFLY+TkdkeLEGk5c9MTO1OdfCcTY/2mRsfNB1OW27
|
# +BKfd287/UY/cwmSkl+CjnoKBL3Ms6I/fWR+alR0+p6RlviK8xHoug9vkc2WrRZs
|
||||||
# DzHkwo/7bNGhlBgi7ulmZzpTTd2YurYeeNg2LpypglYAA7AFvonoaeC6Ce5732pv
|
# GnMVu2xOM2tPJ+qpyoDBzqv30N/ZRBOoNrS/PCkDwLGICDYqVs/IzAE49yv2ElPy
|
||||||
# vinLbtg/SHUB2RjebYIM9W0jVOR4U3UkV7ndn/OOPcbzaN9l9qRWqveVtihVJ9Ak
|
# walf9mEsOHXV1lxtQDNcejVEmitJJ+1Vr2EtafPEbMQZp89TAuagROKE4YuohCUK
|
||||||
# vUCgvxm2EhIRXT0n4ECWOKz3+SmJw7wXsFSFQrP8DJ6LGYnn8AtqgcKBGUIZUnWK
|
# m+v3geJqTQarTBjqV25RCOT+XFngTMDD9wYx6TwndB2I1Ly726NiHUHs0uvq3ciC
|
||||||
# NsIdw2FzLixre24/LAl4FOmRsqlb30mjdAy87JGA0j3mSj5mO0+7hvoyGtmW9I/2
|
# V9JwNXdt1VZ63WK1NSgpVEsiK9EPABPt1EfXcKrfaPYkbkFi79eK1ETxx3NomYNU
|
||||||
# kQH2zsZ0/fZMcm8Qq3UwxTSwethQ/gpY3UA8x1RtnWN0SCyxTkctwRQEcb9k+SS+
|
# HNiGU+X1Be8L7qpHwjo0g3/33XhtOr9LiDoUXh/V2LFTETiqV9Q8yLEavQW3j9LQ
|
||||||
# c23Kjgm9swFXSVRk2XPXfx5bRAGOWhmRaw2fpCjcZxkoJLo4S5pu+yFUa2pFEUep
|
# /h/CaGz5YdGfrY8HiPfMIeLEokKxGf0hHcTEFApB0yLlq6KoHrFAEANR/4XuFIpl
|
||||||
# 8beuyOiJXk+d0tBMdrVXVAmxaQFEfnyhYWxz/gq77EFmPWn9y8FBSX5+k77L+Dvk
|
# 9sDywVIWt4tKqG+P6pRAXzg1zG5rGlslZWmw7XwgvhBu3jkLP9AxrsSYwY2ftrww
|
||||||
# txW/tM4+pTFRhLy/AsGConsXHRWJjXD+57XQKBqJC4822rpM+Zv/Cuk0+CQ1Zyvg
|
# ze5NA6VDLS7pz+OrXXWLUmoyNrJNx5Bk0wEwzkQxzkOvmbdPhsOP1ZM0uA/xIV7c
|
||||||
# DbjmjJnW4SLq8CdCPSWU5nR0W2rRnj7tfqAxM328y+l7vzhwRNGQ8cirOoo6CGJ/
|
# SpNpZUw5MIIHcTCCBVmgAwIBAgITMwAAABXF52ueAptJmQAAAAAAFTANBgkqhkiG
|
||||||
# 2XBjU02N7oJtpQUQwXEGahC0HVUzWLOhcGbyoYIDWTCCAkECAQEwggEBoYHZpIHW
|
# 9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO
|
||||||
# MIHTMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH
|
# BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEy
|
||||||
# UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQL
|
# MDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw
|
||||||
# EyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsT
|
# MTAwHhcNMjEwOTMwMTgyMjI1WhcNMzAwOTMwMTgzMjI1WjB8MQswCQYDVQQGEwJV
|
||||||
# Hm5TaGllbGQgVFNTIEVTTjo2QjA1LTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9z
|
# UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
|
||||||
# b2Z0IFRpbWUtU3RhbXAgU2VydmljZaIjCgEBMAcGBSsOAwIaAxUAFU9eSpdxs0a0
|
# ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGlt
|
||||||
# 6JFIuGFHIj/I+36ggYMwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz
|
# ZS1TdGFtcCBQQ0EgMjAxMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
|
||||||
# aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv
|
# AOThpkzntHIhC3miy9ckeb0O1YLT/e6cBwfSqWxOdcjKNVf2AX9sSuDivbk+F2Az
|
||||||
# cnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAx
|
# /1xPx2b3lVNxWuJ+Slr+uDZnhUYjDLWNE893MsAQGOhgfWpSg0S3po5GawcU88V2
|
||||||
# MDANBgkqhkiG9w0BAQsFAAIFAOsTx1MwIhgPMjAyNDEyMjMxMTI2MTFaGA8yMDI0
|
# 9YZQ3MFEyHFcUTE3oAo4bo3t1w/YJlN8OWECesSq/XJprx2rrPY2vjUmZNqYO7oa
|
||||||
# MTIyNDExMjYxMVowdzA9BgorBgEEAYRZCgQBMS8wLTAKAgUA6xPHUwIBADAKAgEA
|
# ezOtgFt+jBAcnVL+tuhiJdxqD89d9P6OU8/W7IVWTe/dvI2k45GPsjksUZzpcGkN
|
||||||
# AgIEpgIB/zAHAgEAAgIULjAKAgUA6xUY0wIBADA2BgorBgEEAYRZCgQCMSgwJjAM
|
# yjYtcI4xyDUoveO0hyTD4MmPfrVUj9z6BVWYbWg7mka97aSueik3rMvrg0XnRm7K
|
||||||
# BgorBgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEB
|
# MtXAhjBcTyziYrLNueKNiOSWrAFKu75xqRdbZ2De+JKRHh09/SDPc31BmkZ1zcRf
|
||||||
# CwUAA4IBAQDkPou5w9O3fL9lm7NIu3mAwCMpezmpCbx9mCUfLb4cXznb4psGEspn
|
# NN0Sidb9pSB9fvzZnkXftnIv231fgLrbqn427DZM9ituqBJR6L8FA6PRc6ZNN3SU
|
||||||
# XaDg3PGX1yGC3GR5peByH/hiarlvYv5SZbofvP+iiYFxeLGi+usbC8FQnuWrgyqh
|
# HDSCD/AQ8rdHGO2n6Jl8P0zbr17C89XYcz1DTsEzOUyOArxCaC4Q6oRRRuLRvWoY
|
||||||
# 7RV01Fm2Is7PGF3NXQaXbGkSQUZzrekeRr4zdV2nIKshANlifSPb/wAd6BLcKtYS
|
# WmEBc8pnol7XKHYC4jMYctenIPDC+hIK12NvDMk2ZItboKaDIV1fMHSRlJTYuVD5
|
||||||
# 3Kr9xUXgZeHxo6tD88GDxJ5FDsG1RxczsdCO5mVqFZUrQqz6Cs49xt7cq2XlEwMX
|
# C4lh8zYGNRiER9vcG9H9stQcxWv2XFJRXRLbJbqvUAV6bMURHXLvjflSxIUXk8A8
|
||||||
# 53L40YCUrvYYiTgqvxtOzg58ksUkP1YDfeP9Rel7pGXGyzJF0Fo+FAXiY098HPcW
|
# FdsaN8cIFRg/eKtFtvUeh17aj54WcmnGrnu3tz5q4i6tAgMBAAGjggHdMIIB2TAS
|
||||||
# eRCGaVV55Keop55er/x0vYOQK3WYmR9ZMYIEDTCCBAkCAQEwgZMwfDELMAkGA1UE
|
# BgkrBgEEAYI3FQEEBQIDAQABMCMGCSsGAQQBgjcVAgQWBBQqp1L+ZMSavoKRPEY1
|
||||||
# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
|
# Kc8Q/y8E7jAdBgNVHQ4EFgQUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXAYDVR0gBFUw
|
||||||
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0
|
# UzBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNy
|
||||||
# IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAH2gy8malRdIsEAAQAAAfYwDQYJYIZI
|
# b3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMBMGA1UdJQQMMAoG
|
||||||
# AWUDBAIBBQCgggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG
|
# CCsGAQUFBwMIMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIB
|
||||||
# 9w0BCQQxIgQgrAY6roZynzJwSUQzsAfof3O6FxHR94SlM3Hdh+QLWTowgfoGCyqG
|
# hjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNX2VsuP6KJcYmjRPZSQW9fO
|
||||||
# SIb3DQEJEAIvMYHqMIHnMIHkMIG9BCArYUzxlF6m5USLS4f8NXL/8aoNEVdsCZRm
|
# mhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9w
|
||||||
# F+LlQjG2ojCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n
|
# a2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNybDBaBggr
|
||||||
# dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y
|
# BgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0LmNv
|
||||||
# YXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMz
|
# bS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3J0MA0GCSqGSIb3
|
||||||
# AAAB9oMvJmpUXSLBAAEAAAH2MCIEIOEmAHxbUTtc2fET28qfaLGRzaIhD4dw4/ak
|
# DQEBCwUAA4ICAQCdVX38Kq3hLB9nATEkW+Geckv8qW/qXBS2Pk5HZHixBpOXPTEz
|
||||||
# m6mLo6PCMA0GCSqGSIb3DQEBCwUABIICAH4zqNf+CV7yNKXAQwNuEZwzCHs4eJC4
|
# tTnXwnE2P9pkbHzQdTltuw8x5MKP+2zRoZQYIu7pZmc6U03dmLq2HnjYNi6cqYJW
|
||||||
# mNKMRp9e2W++JJaxtY3kLEBoGDKfz+8RYsjcLtNOg83Hd2gEmAmgvWfs/mZlhi8j
|
# AAOwBb6J6Gngugnue99qb74py27YP0h1AdkY3m2CDPVtI1TkeFN1JFe53Z/zjj3G
|
||||||
# tM5Yj9606ukzuF2797CDwZiXz5JTIs1wIm5+rWuAny0azioafaOZtcaxPqnANbUf
|
# 82jfZfakVqr3lbYoVSfQJL1AoL8ZthISEV09J+BAljis9/kpicO8F7BUhUKz/Aye
|
||||||
# UHnAYoZ0W6AkSnz99XrqRueh8b3Z7h2A5saVS1/MV1fjfImxH673GlexKRYORTFP
|
# ixmJ5/ALaoHCgRlCGVJ1ijbCHcNhcy4sa3tuPywJeBTpkbKpW99Jo3QMvOyRgNI9
|
||||||
# A9XH8vCvVTIZobKSWa6y/KG4U5dkWrzJuLbT9Kr3x6yk0bO6epG09yy86HmlnmwQ
|
# 5ko+ZjtPu4b6MhrZlvSP9pEB9s7GdP32THJvEKt1MMU0sHrYUP4KWN1APMdUbZ1j
|
||||||
# bJwBedz4ZpKkvtIJ2U2PYvLti5bztm5WL/hWhDmtXBhoqKy1d/i4LDz7F4vXy9//
|
# dEgssU5HLcEUBHG/ZPkkvnNtyo4JvbMBV0lUZNlz138eW0QBjloZkWsNn6Qo3GcZ
|
||||||
# 5Wy8zHMLw4ZFwfywP8/P5pZP7nlvIrordtefS2z3Ipea0thJxwyFJSU8c7OGvPof
|
# KCS6OEuabvshVGtqRRFHqfG3rsjoiV5PndLQTHa1V1QJsWkBRH58oWFsc/4Ku+xB
|
||||||
# uHhYKMn+Lg1tj5QcIvT7KG0JGp/XWe/CEB9ruOkYZh9VKBlEU2CkDsWeTXFy5heV
|
# Zj1p/cvBQUl+fpO+y/g75LcVv7TOPqUxUYS8vwLBgqJ7Fx0ViY1w/ue10CgaiQuP
|
||||||
# eMPMxRC/GBHPypBHHSrd8BtUsKgehcetdsfQrOI3VLV9gx8SGr8ehSU2Rg0U2UtK
|
# Ntq6TPmb/wrpNPgkNWcr4A245oyZ1uEi6vAnQj0llOZ0dFtq0Z4+7X6gMTN9vMvp
|
||||||
# a4S5THXp0PksrjJLmykIsvBmMgl3uK4KJbu6zh3w5ACSS/OZXzrsowysGjn2QBwb
|
# e784cETRkPHIqzqKOghif9lwY1NNje6CbaUFEMFxBmoQtB1VM1izoXBm8qGCA1Aw
|
||||||
# hoIjCDhmNLLq2gupcAhPCgqUX6Ixmg8H0SlqoRp0mZTss7ZS+ErxTQoFBbLkoX5F
|
# ggI4AgEBMIH5oYHRpIHOMIHLMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu
|
||||||
# 9HjkIOcM6/0F
|
# Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
|
||||||
|
# cmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMScw
|
||||||
|
# JQYDVQQLEx5uU2hpZWxkIFRTUyBFU046MzcwMy0wNUUwLUQ5NDcxJTAjBgNVBAMT
|
||||||
|
# HE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WiIwoBATAHBgUrDgMCGgMVAInb
|
||||||
|
# HtxB+OlGyQnxQYhy04KSYSSPoIGDMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNV
|
||||||
|
# BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv
|
||||||
|
# c29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAg
|
||||||
|
# UENBIDIwMTAwDQYJKoZIhvcNAQELBQACBQDpdwuXMCIYDzIwMjQwMjE0MDk1MTE5
|
||||||
|
# WhgPMjAyNDAyMTUwOTUxMTlaMHcwPQYKKwYBBAGEWQoEATEvMC0wCgIFAOl3C5cC
|
||||||
|
# AQAwCgIBAAICAbgCAf8wBwIBAAICFGEwCgIFAOl4XRcCAQAwNgYKKwYBBAGEWQoE
|
||||||
|
# AjEoMCYwDAYKKwYBBAGEWQoDAqAKMAgCAQACAwehIKEKMAgCAQACAwGGoDANBgkq
|
||||||
|
# hkiG9w0BAQsFAAOCAQEAD3oj3Gr5HTA5vQkFXZE9QSfCqxmL4ez3qxPD1t/UMJ9w
|
||||||
|
# 93APM6n5MjApe6tpBjo4Oe83WMnfsWNA5ZRu8B/XJhyJ8531k5XMROCaVX6eTOrO
|
||||||
|
# 70mkxtszD1E2m5iFx2RYJKS2ldkFAnykkFMc4ezXHa+RAijQA3rQp2VNidnVEFkO
|
||||||
|
# jkaZY2FoA2dbG7v9ZjkQsmrycREGNiakPhAgqqmTiUlDPvul5gJx24VGL0z7JZhP
|
||||||
|
# KUsccmv6HF3sgD6FjhENyZtD1+NrRfVQHTrjitjpC/dX9ux2OP8pjPi3WIdPfEsI
|
||||||
|
# 2PhWNWSEof4cWFv/lLlYAUVeHPDcafr+2umlLYb62zGCBA0wggQJAgEBMIGTMHwx
|
||||||
|
# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt
|
||||||
|
# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1p
|
||||||
|
# Y3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAB6pokctVZP2FjAAEAAAHq
|
||||||
|
# MA0GCWCGSAFlAwQCAQUAoIIBSjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQw
|
||||||
|
# LwYJKoZIhvcNAQkEMSIEIL2oG23lx47V7tAc0IyUsnuhSrJEjOACK32L1AXSjdl/
|
||||||
|
# MIH6BgsqhkiG9w0BCRACLzGB6jCB5zCB5DCBvQQgKY+h1eNkNHiLCDSW0sA1cGHk
|
||||||
|
# bW4qooi+ryyMp6S4ZngwgZgwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMK
|
||||||
|
# V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0
|
||||||
|
# IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0Eg
|
||||||
|
# MjAxMAITMwAAAeqaJHLVWT9hYwABAAAB6jAiBCB7j2iMmFJTNAbY6vZ80pGTL0BC
|
||||||
|
# A2VAW00KF9MbtVlx1zANBgkqhkiG9w0BAQsFAASCAgA1ArfmkqTc7BoI6J+6zHkc
|
||||||
|
# TrfkFzsjKWBJpcPWwOPOZOdxfO850UPyrCLJgTclSkgnDBSSDQLqjhV2Q3EeM5tm
|
||||||
|
# iBFU1IO7RIMeF4hTB2jOzGuvX46zRms8/booKtLBlPRscHvYbXgOUqIn9M2ymtZo
|
||||||
|
# aMp08VpWw+PxTbSa6HN6jQiwVVtRg9nsGd4gY/mO6+agIkbSs6hY2oV6HyhDH3CB
|
||||||
|
# DvEL3z7BCJ5Dx52K3XE2BUDR6nLhkGvxOxRaJ1GmJQXMMILDebq6ULx0ULThmpUQ
|
||||||
|
# y6aifjEa3r60cjg29rKd/4PGmbDBaRAnVs7JEaxdSsTR75Ak7OKQymZ4yPI3bTkx
|
||||||
|
# 1t/LCEKtia/oqv3tFMP8KtSUHZEK8PvmvRCJII2JrAUrxTYzrohxf/TL95sZdmGg
|
||||||
|
# QNyQC2T+h816Kl7i+RrtXi5i6kSYqnTlr7uKFU4idVNRVxqiO/oumXhf6REHp1Wi
|
||||||
|
# V60E8w5gawis5jnaJqZMeCiyHSLhm+zvXaCMm1AHUWQ6zK/GWOp1Y0wHiJRr5pnf
|
||||||
|
# 4wIKAt7oKWL/clx2jikqesxYFfGBq0YnfRUyHt3bscb83xfbFMjcbok/UI8fxWQM
|
||||||
|
# vLsaEzFVp+a7wRqLf4KjiYzF4hORFWoGlZbGglkVYiYswX8Emsx5cn2F5M9cznRn
|
||||||
|
# 4d+LeskiXr3Z0pV6Ooki3w==
|
||||||
# SIG # End signature block
|
# SIG # End signature block
|
||||||
117
externals/install-dotnet.sh
vendored
117
externals/install-dotnet.sh
vendored
@@ -423,17 +423,11 @@ get_normalized_architecture_for_specific_sdk_version() {
|
|||||||
# args:
|
# args:
|
||||||
# version or channel - $1
|
# version or channel - $1
|
||||||
is_arm64_supported() {
|
is_arm64_supported() {
|
||||||
# Extract the major version by splitting on the dot
|
#any channel or version that starts with the specified versions
|
||||||
major_version="${1%%.*}"
|
case "$1" in
|
||||||
|
( "1"* | "2"* | "3"* | "4"* | "5"*)
|
||||||
# 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
|
echo false
|
||||||
return 0
|
return 0
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
esac
|
||||||
|
|
||||||
echo true
|
echo true
|
||||||
@@ -956,37 +950,6 @@ 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
|
||||||
@@ -998,7 +961,15 @@ 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 override_switch="$(get_cp_options "$override")"
|
local osname="$(get_current_os_name)"
|
||||||
|
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}")"
|
||||||
@@ -1272,61 +1243,6 @@ 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
|
||||||
|
|
||||||
@@ -1379,11 +1295,6 @@ 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
|
||||||
@@ -1395,9 +1306,7 @@ 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"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -1826,7 +1735,7 @@ do
|
|||||||
zip_path="$1"
|
zip_path="$1"
|
||||||
;;
|
;;
|
||||||
-?|--?|-h|--help|-[Hh]elp)
|
-?|--?|-h|--help|-[Hh]elp)
|
||||||
script_name="dotnet-install.sh"
|
script_name="$(basename "$0")"
|
||||||
echo ".NET Tools Installer"
|
echo ".NET Tools Installer"
|
||||||
echo "Usage:"
|
echo "Usage:"
|
||||||
echo " # Install a .NET SDK of a given Quality from a given Channel"
|
echo " # Install a .NET SDK of a given Quality from a given Channel"
|
||||||
|
|||||||
9997
package-lock.json
generated
9997
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
45
package.json
45
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "setup-dotnet",
|
"name": "setup-dotnet",
|
||||||
"version": "3.0.2",
|
"version": "4.0.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "setup dotnet action",
|
"description": "setup dotnet action",
|
||||||
"main": "dist/setup/index.js",
|
"main": "dist/setup/index.js",
|
||||||
@@ -26,34 +26,35 @@
|
|||||||
"author": "GitHub",
|
"author": "GitHub",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/cache": "^3.0.0",
|
"@actions/cache": "^3.2.4",
|
||||||
"@actions/core": "^1.10.0",
|
"@actions/core": "^1.10.0",
|
||||||
"@actions/exec": "^1.1.1",
|
"@actions/exec": "^1.1.1",
|
||||||
"@actions/github": "^1.1.0",
|
"@actions/github": "^6.0.0",
|
||||||
"@actions/glob": "^0.3.0",
|
"@actions/glob": "^0.4.0",
|
||||||
"@actions/http-client": "^2.0.1",
|
"@actions/http-client": "^2.2.1",
|
||||||
"@actions/io": "^1.0.2",
|
"@actions/io": "^1.0.2",
|
||||||
"fast-xml-parser": "^4.0.10",
|
"fast-xml-parser": "^4.4.1",
|
||||||
"semver": "^6.3.0"
|
"json5": "^2.2.3",
|
||||||
|
"semver": "^7.6.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^27.5.2",
|
"@types/jest": "^29.5.12",
|
||||||
"@types/node": "^16.11.25",
|
"@types/node": "^20.11.29",
|
||||||
"@types/semver": "^6.2.2",
|
"@types/semver": "^7.5.8",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.54.0",
|
"@typescript-eslint/eslint-plugin": "^7.3.0",
|
||||||
"@typescript-eslint/parser": "^5.54.0",
|
"@typescript-eslint/parser": "^7.3.0",
|
||||||
"@vercel/ncc": "^0.34.0",
|
"@vercel/ncc": "^0.38.1",
|
||||||
"eslint": "^8.35.0",
|
"eslint": "^8.57.0",
|
||||||
"eslint-config-prettier": "^8.6.0",
|
"eslint-config-prettier": "^9.1.0",
|
||||||
"eslint-plugin-jest": "^27.2.1",
|
"eslint-plugin-jest": "^27.9.0",
|
||||||
"eslint-plugin-node": "^11.1.0",
|
"eslint-plugin-node": "^11.1.0",
|
||||||
"husky": "^8.0.1",
|
"husky": "^8.0.1",
|
||||||
"jest": "^27.5.1",
|
"jest": "^29.7.0",
|
||||||
"jest-circus": "^27.5.1",
|
"jest-circus": "^29.7.0",
|
||||||
"jest-each": "^27.5.1",
|
"jest-each": "^29.7.0",
|
||||||
"prettier": "^2.8.4",
|
"prettier": "^3.2.5",
|
||||||
"ts-jest": "^27.0.5",
|
"ts-jest": "^29.1.2",
|
||||||
"typescript": "^4.8.4",
|
"typescript": "^5.4.2",
|
||||||
"wget-improved": "^3.2.1"
|
"wget-improved": "^3.2.1"
|
||||||
},
|
},
|
||||||
"jest": {
|
"jest": {
|
||||||
|
|||||||
270
src/installer.ts
270
src/installer.ts
@@ -7,7 +7,7 @@ import {chmodSync} from 'fs';
|
|||||||
import path from 'path';
|
import path from 'path';
|
||||||
import os from 'os';
|
import os from 'os';
|
||||||
import semver from 'semver';
|
import semver from 'semver';
|
||||||
import {IS_LINUX, IS_WINDOWS} from './utils';
|
import {IS_WINDOWS, PLATFORM} from './utils';
|
||||||
import {QualityOptions} from './setup-dotnet';
|
import {QualityOptions} from './setup-dotnet';
|
||||||
|
|
||||||
export interface DotnetVersion {
|
export interface DotnetVersion {
|
||||||
@@ -81,7 +81,7 @@ export class DotnetVersionResolver {
|
|||||||
parseInt(major) >= QUALITY_INPUT_MINIMAL_MAJOR_TAG ? true : false;
|
parseInt(major) >= QUALITY_INPUT_MINIMAL_MAJOR_TAG ? true : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async createDotNetVersion(): Promise<DotnetVersion> {
|
public async createDotnetVersion(): Promise<DotnetVersion> {
|
||||||
await this.resolveVersionInput();
|
await this.resolveVersionInput();
|
||||||
if (!this.resolvedArgument.type) {
|
if (!this.resolvedArgument.type) {
|
||||||
return this.resolvedArgument;
|
return this.resolvedArgument;
|
||||||
@@ -101,18 +101,9 @@ export class DotnetVersionResolver {
|
|||||||
allowRetries: true,
|
allowRetries: true,
|
||||||
maxRetries: 3
|
maxRetries: 3
|
||||||
});
|
});
|
||||||
|
const response = await httpClient.getJson<any>(
|
||||||
let response;
|
DotnetVersionResolver.DotnetCoreIndexUrl
|
||||||
try {
|
|
||||||
response = await httpClient.getJson<any>(
|
|
||||||
DotnetVersionResolver.DotNetCoreIndexUrl
|
|
||||||
);
|
);
|
||||||
} catch (error) {
|
|
||||||
response = await httpClient.getJson<any>(
|
|
||||||
DotnetVersionResolver.DotnetCoreIndexFallbackUrl
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const result = response.result || {};
|
const result = response.result || {};
|
||||||
const releasesInfo: any[] = result['releases-index'];
|
const releasesInfo: any[] = result['releases-index'];
|
||||||
|
|
||||||
@@ -123,88 +114,37 @@ export class DotnetVersionResolver {
|
|||||||
|
|
||||||
if (!releaseInfo) {
|
if (!releaseInfo) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Could not find info for version with major tag: "${majorTag}" at ${DotnetVersionResolver.DotNetCoreIndexUrl}`
|
`Could not find info for version with major tag: "${majorTag}" at ${DotnetVersionResolver.DotnetCoreIndexUrl}`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return releaseInfo['channel-version'];
|
return releaseInfo['channel-version'];
|
||||||
}
|
}
|
||||||
|
|
||||||
static DotNetCoreIndexUrl =
|
static DotnetCoreIndexUrl =
|
||||||
'https://builds.dotnet.microsoft.com/dotnet/release-metadata/releases-index.json';
|
|
||||||
|
|
||||||
static DotnetCoreIndexFallbackUrl =
|
|
||||||
'https://dotnetcli.azureedge.net/dotnet/release-metadata/releases-index.json';
|
'https://dotnetcli.azureedge.net/dotnet/release-metadata/releases-index.json';
|
||||||
}
|
}
|
||||||
|
|
||||||
export class DotnetCoreInstaller {
|
export class DotnetInstallScript {
|
||||||
private version: string;
|
private scriptName = IS_WINDOWS ? 'install-dotnet.ps1' : 'install-dotnet.sh';
|
||||||
private quality: QualityOptions;
|
private escapedScript: string;
|
||||||
|
private scriptArguments: string[] = [];
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.escapedScript = path
|
||||||
|
.join(__dirname, '..', '..', 'externals', this.scriptName)
|
||||||
|
.replace(/'/g, "''");
|
||||||
|
|
||||||
static {
|
|
||||||
const installationDirectoryWindows = path.join(
|
|
||||||
process.env['PROGRAMFILES'] + '',
|
|
||||||
'dotnet'
|
|
||||||
);
|
|
||||||
const installationDirectoryLinux = '/usr/share/dotnet';
|
|
||||||
const installationDirectoryMac = path.join(
|
|
||||||
process.env['HOME'] + '',
|
|
||||||
'.dotnet'
|
|
||||||
);
|
|
||||||
const dotnetInstallDir: string | undefined =
|
|
||||||
process.env['DOTNET_INSTALL_DIR'];
|
|
||||||
if (dotnetInstallDir) {
|
|
||||||
process.env['DOTNET_INSTALL_DIR'] =
|
|
||||||
this.convertInstallPathToAbsolute(dotnetInstallDir);
|
|
||||||
} else {
|
|
||||||
if (IS_WINDOWS) {
|
if (IS_WINDOWS) {
|
||||||
process.env['DOTNET_INSTALL_DIR'] = installationDirectoryWindows;
|
this.setupScriptPowershell();
|
||||||
} else {
|
return;
|
||||||
process.env['DOTNET_INSTALL_DIR'] = IS_LINUX
|
|
||||||
? installationDirectoryLinux
|
|
||||||
: installationDirectoryMac;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(version: string, quality: QualityOptions) {
|
this.setupScriptBash();
|
||||||
this.version = version;
|
|
||||||
this.quality = quality;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static convertInstallPathToAbsolute(installDir: string): string {
|
private setupScriptPowershell() {
|
||||||
let transformedPath;
|
this.scriptArguments = [
|
||||||
if (path.isAbsolute(installDir)) {
|
|
||||||
transformedPath = installDir;
|
|
||||||
} else {
|
|
||||||
transformedPath = installDir.startsWith('~')
|
|
||||||
? path.join(os.homedir(), installDir.slice(1))
|
|
||||||
: (transformedPath = path.join(process.cwd(), installDir));
|
|
||||||
}
|
|
||||||
return path.normalize(transformedPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
static addToPath() {
|
|
||||||
core.addPath(process.env['DOTNET_INSTALL_DIR']!);
|
|
||||||
core.exportVariable('DOTNET_ROOT', process.env['DOTNET_INSTALL_DIR']);
|
|
||||||
}
|
|
||||||
|
|
||||||
private setQuality(
|
|
||||||
dotnetVersion: DotnetVersion,
|
|
||||||
scriptArguments: string[]
|
|
||||||
): void {
|
|
||||||
const option = IS_WINDOWS ? '-Quality' : '--quality';
|
|
||||||
if (dotnetVersion.qualityFlag) {
|
|
||||||
scriptArguments.push(option, this.quality);
|
|
||||||
} else {
|
|
||||||
core.warning(
|
|
||||||
`The 'dotnet-quality' input can be used only with .NET SDK version in A.B, A.B.x, A, A.x and A.B.Cxx formats where the major tag is higher than 5. You specified: ${this.version}. 'dotnet-quality' input is ignored.`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async installDotnet(): Promise<string | null> {
|
|
||||||
const windowsDefaultOptions = [
|
|
||||||
'-NoLogo',
|
'-NoLogo',
|
||||||
'-Sta',
|
'-Sta',
|
||||||
'-NoProfile',
|
'-NoProfile',
|
||||||
@@ -213,68 +153,160 @@ export class DotnetCoreInstaller {
|
|||||||
'Unrestricted',
|
'Unrestricted',
|
||||||
'-Command'
|
'-Command'
|
||||||
];
|
];
|
||||||
const scriptName = IS_WINDOWS ? 'install-dotnet.ps1' : 'install-dotnet.sh';
|
|
||||||
const escapedScript = path
|
|
||||||
.join(__dirname, '..', '..', 'externals', scriptName)
|
|
||||||
.replace(/'/g, "''");
|
|
||||||
let scriptArguments: string[];
|
|
||||||
let scriptPath = '';
|
|
||||||
|
|
||||||
const versionResolver = new DotnetVersionResolver(this.version);
|
this.scriptArguments.push('&', `'${this.escapedScript}'`);
|
||||||
const dotnetVersion = await versionResolver.createDotNetVersion();
|
|
||||||
|
|
||||||
if (IS_WINDOWS) {
|
|
||||||
scriptArguments = ['&', `'${escapedScript}'`];
|
|
||||||
|
|
||||||
if (dotnetVersion.type) {
|
|
||||||
scriptArguments.push(dotnetVersion.type, dotnetVersion.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.quality) {
|
|
||||||
this.setQuality(dotnetVersion, scriptArguments);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (process.env['https_proxy'] != null) {
|
if (process.env['https_proxy'] != null) {
|
||||||
scriptArguments.push(`-ProxyAddress ${process.env['https_proxy']}`);
|
this.scriptArguments.push(`-ProxyAddress ${process.env['https_proxy']}`);
|
||||||
}
|
}
|
||||||
// This is not currently an option
|
// This is not currently an option
|
||||||
if (process.env['no_proxy'] != null) {
|
if (process.env['no_proxy'] != null) {
|
||||||
scriptArguments.push(`-ProxyBypassList ${process.env['no_proxy']}`);
|
this.scriptArguments.push(`-ProxyBypassList ${process.env['no_proxy']}`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
scriptPath =
|
private setupScriptBash() {
|
||||||
(await io.which('pwsh', false)) || (await io.which('powershell', true));
|
chmodSync(this.escapedScript, '777');
|
||||||
scriptArguments = windowsDefaultOptions.concat(scriptArguments);
|
}
|
||||||
} else {
|
|
||||||
chmodSync(escapedScript, '777');
|
|
||||||
scriptPath = await io.which(escapedScript, true);
|
|
||||||
scriptArguments = [];
|
|
||||||
|
|
||||||
|
private async getScriptPath() {
|
||||||
|
if (IS_WINDOWS) {
|
||||||
|
return (await io.which('pwsh', false)) || io.which('powershell', true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return io.which(this.escapedScript, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public useArguments(...args: string[]) {
|
||||||
|
this.scriptArguments.push(...args);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public useVersion(dotnetVersion: DotnetVersion, quality?: QualityOptions) {
|
||||||
if (dotnetVersion.type) {
|
if (dotnetVersion.type) {
|
||||||
scriptArguments.push(dotnetVersion.type, dotnetVersion.value);
|
this.useArguments(dotnetVersion.type, dotnetVersion.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.quality) {
|
if (quality && !dotnetVersion.qualityFlag) {
|
||||||
this.setQuality(dotnetVersion, scriptArguments);
|
core.warning(
|
||||||
|
`The 'dotnet-quality' input can be used only with .NET SDK version in A.B, A.B.x, A, A.x and A.B.Cxx formats where the major tag is higher than 5. You specified: ${dotnetVersion.value}. 'dotnet-quality' input is ignored.`
|
||||||
|
);
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (quality) {
|
||||||
|
this.useArguments(IS_WINDOWS ? '-Quality' : '--quality', quality);
|
||||||
}
|
}
|
||||||
// process.env must be explicitly passed in for DOTNET_INSTALL_DIR to be used
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async execute() {
|
||||||
const getExecOutputOptions = {
|
const getExecOutputOptions = {
|
||||||
ignoreReturnCode: true,
|
ignoreReturnCode: true,
|
||||||
env: process.env as {string: string}
|
env: process.env as {string: string}
|
||||||
};
|
};
|
||||||
const {exitCode, stdout, stderr} = await exec.getExecOutput(
|
|
||||||
`"${scriptPath}"`,
|
return exec.getExecOutput(
|
||||||
scriptArguments,
|
`"${await this.getScriptPath()}"`,
|
||||||
|
this.scriptArguments,
|
||||||
getExecOutputOptions
|
getExecOutputOptions
|
||||||
);
|
);
|
||||||
if (exitCode) {
|
}
|
||||||
throw new Error(
|
}
|
||||||
`Failed to install dotnet, exit code: ${exitCode}. ${stderr}`
|
|
||||||
|
export abstract class DotnetInstallDir {
|
||||||
|
private static readonly default = {
|
||||||
|
linux: '/usr/share/dotnet',
|
||||||
|
mac: path.join(process.env['HOME'] + '', '.dotnet'),
|
||||||
|
windows: path.join(process.env['PROGRAMFILES'] + '', 'dotnet')
|
||||||
|
};
|
||||||
|
|
||||||
|
public static readonly dirPath = process.env['DOTNET_INSTALL_DIR']
|
||||||
|
? DotnetInstallDir.convertInstallPathToAbsolute(
|
||||||
|
process.env['DOTNET_INSTALL_DIR']
|
||||||
|
)
|
||||||
|
: DotnetInstallDir.default[PLATFORM];
|
||||||
|
|
||||||
|
private static convertInstallPathToAbsolute(installDir: string): string {
|
||||||
|
if (path.isAbsolute(installDir)) return path.normalize(installDir);
|
||||||
|
|
||||||
|
const transformedPath = installDir.startsWith('~')
|
||||||
|
? path.join(os.homedir(), installDir.slice(1))
|
||||||
|
: path.join(process.cwd(), installDir);
|
||||||
|
|
||||||
|
return path.normalize(transformedPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static addToPath() {
|
||||||
|
core.addPath(process.env['DOTNET_INSTALL_DIR']!);
|
||||||
|
core.exportVariable('DOTNET_ROOT', process.env['DOTNET_INSTALL_DIR']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static setEnvironmentVariable() {
|
||||||
|
process.env['DOTNET_INSTALL_DIR'] = DotnetInstallDir.dirPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class DotnetCoreInstaller {
|
||||||
|
static {
|
||||||
|
DotnetInstallDir.setEnvironmentVariable();
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
private version: string,
|
||||||
|
private quality: QualityOptions
|
||||||
|
) {}
|
||||||
|
|
||||||
|
public async installDotnet(): Promise<string | null> {
|
||||||
|
const versionResolver = new DotnetVersionResolver(this.version);
|
||||||
|
const dotnetVersion = await versionResolver.createDotnetVersion();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Install dotnet runitme first in order to get
|
||||||
|
* the latest stable version of dotnet CLI
|
||||||
|
*/
|
||||||
|
const runtimeInstallOutput = await new DotnetInstallScript()
|
||||||
|
// If dotnet CLI is already installed - avoid overwriting it
|
||||||
|
.useArguments(
|
||||||
|
IS_WINDOWS ? '-SkipNonVersionedFiles' : '--skip-non-versioned-files'
|
||||||
|
)
|
||||||
|
// Install only runtime + CLI
|
||||||
|
.useArguments(IS_WINDOWS ? '-Runtime' : '--runtime', 'dotnet')
|
||||||
|
// Use latest stable version
|
||||||
|
.useArguments(IS_WINDOWS ? '-Channel' : '--channel', 'LTS')
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
if (runtimeInstallOutput.exitCode) {
|
||||||
|
/**
|
||||||
|
* dotnetInstallScript will install CLI and runtime even if previous script haven't succeded,
|
||||||
|
* so at this point it's too early to throw an error
|
||||||
|
*/
|
||||||
|
core.warning(
|
||||||
|
`Failed to install dotnet runtime + cli, exit code: ${runtimeInstallOutput.exitCode}. ${runtimeInstallOutput.stderr}`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.parseInstalledVersion(stdout);
|
/**
|
||||||
|
* Install dotnet over the latest version of
|
||||||
|
* dotnet CLI
|
||||||
|
*/
|
||||||
|
const dotnetInstallOutput = await new DotnetInstallScript()
|
||||||
|
// Don't overwrite CLI because it should be already installed
|
||||||
|
.useArguments(
|
||||||
|
IS_WINDOWS ? '-SkipNonVersionedFiles' : '--skip-non-versioned-files'
|
||||||
|
)
|
||||||
|
// Use version provided by user
|
||||||
|
.useVersion(dotnetVersion, this.quality)
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
if (dotnetInstallOutput.exitCode) {
|
||||||
|
throw new Error(
|
||||||
|
`Failed to install dotnet, exit code: ${dotnetInstallOutput.exitCode}. ${dotnetInstallOutput.stderr}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.parseInstalledVersion(dotnetInstallOutput.stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
private parseInstalledVersion(stdout: string): string | null {
|
private parseInstalledVersion(stdout: string): string | null {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import * as core from '@actions/core';
|
import * as core from '@actions/core';
|
||||||
import {DotnetCoreInstaller} from './installer';
|
import {DotnetCoreInstaller, DotnetInstallDir} from './installer';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import semver from 'semver';
|
import semver from 'semver';
|
||||||
@@ -7,6 +7,7 @@ import * as auth from './authutil';
|
|||||||
import {isCacheFeatureAvailable} from './cache-utils';
|
import {isCacheFeatureAvailable} from './cache-utils';
|
||||||
import {restoreCache} from './cache-restore';
|
import {restoreCache} from './cache-restore';
|
||||||
import {Outputs} from './constants';
|
import {Outputs} from './constants';
|
||||||
|
import JSON5 from 'json5';
|
||||||
|
|
||||||
const qualityOptions = [
|
const qualityOptions = [
|
||||||
'daily',
|
'daily',
|
||||||
@@ -72,7 +73,7 @@ export async function run() {
|
|||||||
const installedVersion = await dotnetInstaller.installDotnet();
|
const installedVersion = await dotnetInstaller.installDotnet();
|
||||||
installedDotnetVersions.push(installedVersion);
|
installedDotnetVersions.push(installedVersion);
|
||||||
}
|
}
|
||||||
DotnetCoreInstaller.addToPath();
|
DotnetInstallDir.addToPath();
|
||||||
}
|
}
|
||||||
|
|
||||||
const sourceUrl: string = core.getInput('source-url');
|
const sourceUrl: string = core.getInput('source-url');
|
||||||
@@ -97,9 +98,14 @@ export async function run() {
|
|||||||
|
|
||||||
function getVersionFromGlobalJson(globalJsonPath: string): string {
|
function getVersionFromGlobalJson(globalJsonPath: string): string {
|
||||||
let version = '';
|
let version = '';
|
||||||
const globalJson = JSON.parse(
|
const globalJson = JSON5.parse(
|
||||||
// .trim() is necessary to strip BOM https://github.com/nodejs/node/issues/20649
|
// .trim() is necessary to strip BOM https://github.com/nodejs/node/issues/20649
|
||||||
fs.readFileSync(globalJsonPath, {encoding: 'utf8'}).trim()
|
fs.readFileSync(globalJsonPath, {encoding: 'utf8'}).trim(),
|
||||||
|
// is necessary as JSON5 supports wider variety of options for numbers: https://www.npmjs.com/package/json5#numbers
|
||||||
|
(key, value) => {
|
||||||
|
if (key === 'version' || key === 'rollForward') return String(value);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
);
|
);
|
||||||
if (globalJson.sdk && globalJson.sdk.version) {
|
if (globalJson.sdk && globalJson.sdk.version) {
|
||||||
version = globalJson.sdk.version;
|
version = globalJson.sdk.version;
|
||||||
|
|||||||
@@ -1,2 +1,6 @@
|
|||||||
export const IS_WINDOWS = process.platform === 'win32';
|
export const IS_WINDOWS = process.platform === 'win32';
|
||||||
export const IS_LINUX = process.platform === 'linux';
|
export const PLATFORM = ((): 'windows' | 'linux' | 'mac' => {
|
||||||
|
if (process.platform === 'win32') return 'windows';
|
||||||
|
if (process.platform === 'linux') return 'linux';
|
||||||
|
return 'mac';
|
||||||
|
})();
|
||||||
|
|||||||
Reference in New Issue
Block a user