mirror of
https://github.com/actions/setup-dotnet.git
synced 2026-03-23 23:22:16 +08:00
Compare commits
4 Commits
checkfixes
...
v3.4.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
70918d1a1f | ||
|
|
a6d1e7b915 | ||
|
|
b2ace4b12f | ||
|
|
ea9897a6e5 |
2
.github/workflows/basic-validation.yml
vendored
2
.github/workflows/basic-validation.yml
vendored
@@ -15,5 +15,3 @@ 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,5 +15,3 @@ 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'
|
|
||||||
|
|||||||
121
.github/workflows/e2e-tests.yml
vendored
121
.github/workflows/e2e-tests.yml
vendored
@@ -17,10 +17,10 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-latest, windows-latest, macos-13]
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
- 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-latest, windows-latest, macos-13]
|
operating-system: [ubuntu-22.04, windows-latest, macos-13]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
- 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-latest, windows-latest, macos-13]
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
- 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-latest, windows-latest, macos-13]
|
operating-system: [ubuntu-22.04, windows-latest, macos-13]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
- 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-latest, windows-latest, macos-13]
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
- 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-latest, windows-latest, macos-13]
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
- 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-latest, windows-latest, macos-13]
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
- 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-latest, windows-latest, macos-13]
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
- 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-latest, windows-latest, macos-13]
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
- 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,40 +229,15 @@ 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-latest, windows-latest, macos-13]
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
- name: Clear toolcache
|
- name: Clear toolcache
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
@@ -281,12 +256,12 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-latest, windows-latest, macos-13]
|
operating-system: [ubuntu-22.04, windows-latest, macos-latest]
|
||||||
env:
|
env:
|
||||||
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
|
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
- name: Clear toolcache
|
- name: Clear toolcache
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
@@ -312,12 +287,12 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-latest, windows-latest, macos-13]
|
operating-system: [ubuntu-22.04, windows-latest, macos-latest]
|
||||||
env:
|
env:
|
||||||
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
|
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
- name: Clear toolcache
|
- name: Clear toolcache
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
@@ -341,10 +316,10 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-latest, windows-latest, macos-13]
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
- name: Clear toolcache
|
- name: Clear toolcache
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
@@ -367,10 +342,10 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
operating-system: [ubuntu-latest, windows-latest, macos-13]
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
- name: Clear toolcache
|
- name: Clear toolcache
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
@@ -393,7 +368,7 @@ jobs:
|
|||||||
test-proxy:
|
test-proxy:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
container:
|
container:
|
||||||
image: ubuntu:22.04
|
image: ubuntu:latest
|
||||||
options: --dns 127.0.0.1
|
options: --dns 127.0.0.1
|
||||||
services:
|
services:
|
||||||
squid-proxy:
|
squid-proxy:
|
||||||
@@ -405,7 +380,7 @@ jobs:
|
|||||||
http_proxy: http://squid-proxy:3128
|
http_proxy: http://squid-proxy:3128
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
- name: Install Powershell
|
- name: Install Powershell
|
||||||
run: |
|
run: |
|
||||||
apt-get update
|
apt-get update
|
||||||
@@ -431,13 +406,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-latest
|
runs-on: ubuntu-22.04
|
||||||
env:
|
env:
|
||||||
https_proxy: http://no-such-proxy:3128
|
https_proxy: http://no-such-proxy:3128
|
||||||
no_proxy: github.com,dotnetcli.blob.core.windows.net,download.visualstudio.microsoft.com,api.nuget.org,dotnetcli.azureedge.net
|
no_proxy: github.com,download.visualstudio.microsoft.com,api.nuget.org,builds.dotnet.microsoft.com,ci.dot.net
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
- name: Clear toolcache
|
- name: Clear toolcache
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
|
||||||
@@ -451,33 +426,3 @@ 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 }}$"
|
|
||||||
|
|||||||
20
.github/workflows/publish-immutable-actions.yml
vendored
Normal file
20
.github/workflows/publish-immutable-actions.yml
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
name: 'Publish Immutable Action Version'
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [published]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
publish:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
id-token: write
|
||||||
|
packages: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checking out
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Publish
|
||||||
|
id: publish
|
||||||
|
uses: actions/publish-immutable-action@v0.0.4
|
||||||
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-latest, windows-latest, macos-13]
|
operating-system: [ubuntu-22.04, windows-latest, macOS-latest]
|
||||||
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@v4
|
uses: actions/checkout@v3
|
||||||
- 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
BIN
.licenses/npm/@fastify/busboy.dep.yml
generated
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.
BIN
.licenses/npm/@octokit/plugin-paginate-rest.dep.yml
generated
BIN
.licenses/npm/@octokit/plugin-paginate-rest.dep.yml
generated
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.
Binary file not shown.
BIN
.licenses/npm/@octokit/types.dep.yml
generated
BIN
.licenses/npm/@octokit/types.dep.yml
generated
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/@protobuf-ts/plugin-framework.dep.yml
generated
Normal file
BIN
.licenses/npm/@protobuf-ts/plugin-framework.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@protobuf-ts/plugin.dep.yml
generated
Normal file
BIN
.licenses/npm/@protobuf-ts/plugin.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@protobuf-ts/protoc.dep.yml
generated
Normal file
BIN
.licenses/npm/@protobuf-ts/protoc.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@protobuf-ts/runtime-rpc.dep.yml
generated
Normal file
BIN
.licenses/npm/@protobuf-ts/runtime-rpc.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/@protobuf-ts/runtime.dep.yml
generated
Normal file
BIN
.licenses/npm/@protobuf-ts/runtime.dep.yml
generated
Normal file
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
Normal file
BIN
.licenses/npm/atob-lite.dep.yml
generated
Normal file
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
Normal file
BIN
.licenses/npm/btoa-lite.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/cross-spawn.dep.yml
generated
Normal file
BIN
.licenses/npm/cross-spawn.dep.yml
generated
Normal file
Binary file not shown.
Binary file not shown.
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
Normal file
BIN
.licenses/npm/form-data-3.0.1.dep.yml
generated
Normal file
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/ip-regex.dep.yml
generated
Normal file
BIN
.licenses/npm/ip-regex.dep.yml
generated
Normal file
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
Normal file
BIN
.licenses/npm/is-stream.dep.yml
generated
Normal file
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/isobject.dep.yml
generated
Normal file
BIN
.licenses/npm/isobject.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/lodash.get.dep.yml
generated
Normal file
BIN
.licenses/npm/lodash.get.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/lodash.set.dep.yml
generated
Normal file
BIN
.licenses/npm/lodash.set.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/lodash.uniq.dep.yml
generated
Normal file
BIN
.licenses/npm/lodash.uniq.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/macos-release.dep.yml
generated
Normal file
BIN
.licenses/npm/macos-release.dep.yml
generated
Normal file
Binary file not shown.
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
Normal file
BIN
.licenses/npm/npm-run-path.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/octokit-pagination-methods.dep.yml
generated
Normal file
BIN
.licenses/npm/octokit-pagination-methods.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/os-name.dep.yml
generated
Normal file
BIN
.licenses/npm/os-name.dep.yml
generated
Normal file
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/path-key.dep.yml
generated
Normal file
BIN
.licenses/npm/path-key.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/psl.dep.yml
generated
Normal file
BIN
.licenses/npm/psl.dep.yml
generated
Normal file
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/punycode.dep.yml
generated
Normal file
BIN
.licenses/npm/punycode.dep.yml
generated
Normal file
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.
BIN
.licenses/npm/shebang-command.dep.yml
generated
Normal file
BIN
.licenses/npm/shebang-command.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/shebang-regex.dep.yml
generated
Normal file
BIN
.licenses/npm/shebang-regex.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/signal-exit.dep.yml
generated
Normal file
BIN
.licenses/npm/signal-exit.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/strip-eof.dep.yml
generated
Normal file
BIN
.licenses/npm/strip-eof.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/tough-cookie.dep.yml
generated
Normal file
BIN
.licenses/npm/tough-cookie.dep.yml
generated
Normal file
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/typescript.dep.yml
generated
Normal file
BIN
.licenses/npm/typescript.dep.yml
generated
Normal file
Binary file not shown.
BIN
.licenses/npm/undici.dep.yml
generated
BIN
.licenses/npm/undici.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/universal-user-agent-2.1.0.dep.yml
generated
Normal file
BIN
.licenses/npm/universal-user-agent-2.1.0.dep.yml
generated
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/windows-release.dep.yml
generated
Normal file
BIN
.licenses/npm/windows-release.dep.yml
generated
Normal file
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/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#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@v4
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-dotnet@v4
|
- uses: actions/setup-dotnet@v3
|
||||||
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/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#supported-software) for the currently preinstalled .NET SDK versions.
|
||||||
|
|
||||||
**Multiple version installation**:
|
**Multiple version installation**:
|
||||||
```yml
|
```yml
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
- name: Setup dotnet
|
- name: Setup dotnet
|
||||||
uses: actions/setup-dotnet@v4
|
uses: actions/setup-dotnet@v3
|
||||||
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@v4
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-dotnet@v4
|
- uses: actions/setup-dotnet@v3
|
||||||
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@v4
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-dotnet@v4
|
- uses: actions/setup-dotnet@v3
|
||||||
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@v4
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-dotnet@v4
|
- uses: actions/setup-dotnet@v3
|
||||||
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@v4
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-dotnet@v4
|
- uses: actions/setup-dotnet@v3
|
||||||
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@v4
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-dotnet@v4
|
- uses: actions/setup-dotnet@v3
|
||||||
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@v4
|
- uses: actions/checkout@v3
|
||||||
- name: Setup dotnet
|
- name: Setup dotnet
|
||||||
uses: actions/setup-dotnet@v4
|
uses: actions/setup-dotnet@v3
|
||||||
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@v4
|
- uses: actions/checkout@v3
|
||||||
- name: Setup dotnet
|
- name: Setup dotnet
|
||||||
uses: actions/setup-dotnet@v4
|
uses: actions/setup-dotnet@v3
|
||||||
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@v4
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-dotnet@v4
|
- uses: actions/setup-dotnet@v3
|
||||||
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@v4
|
- uses: actions/setup-dotnet@v3
|
||||||
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@v4
|
- uses: actions/setup-dotnet@v3
|
||||||
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@v4
|
- uses: actions/setup-dotnet@v3
|
||||||
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@v4
|
- uses: actions/setup-dotnet@v3
|
||||||
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@v4
|
- uses: actions/setup-dotnet@v3
|
||||||
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@v4
|
- uses: actions/setup-dotnet@v3
|
||||||
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,15 +102,8 @@ 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[callIndex][1] as string[]
|
getExecOutputSpy.mock.calls[0][1] as string[]
|
||||||
).join(' ');
|
).join(' ');
|
||||||
const expectedArgument = IS_WINDOWS
|
const expectedArgument = IS_WINDOWS
|
||||||
? `-Version ${inputVersion}`
|
? `-Version ${inputVersion}`
|
||||||
@@ -192,15 +185,8 @@ 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[callIndex][1] as string[]
|
getExecOutputSpy.mock.calls[0][1] as string[]
|
||||||
).join(' ');
|
).join(' ');
|
||||||
const expectedArgument = IS_WINDOWS
|
const expectedArgument = IS_WINDOWS
|
||||||
? `-Quality ${inputQuality}`
|
? `-Quality ${inputQuality}`
|
||||||
@@ -232,15 +218,8 @@ 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[callIndex][1] as string[]
|
getExecOutputSpy.mock.calls[0][1] as string[]
|
||||||
).join(' ');
|
).join(' ');
|
||||||
const expectedArgument = IS_WINDOWS
|
const expectedArgument = IS_WINDOWS
|
||||||
? `-Channel 6.0`
|
? `-Channel 6.0`
|
||||||
@@ -273,15 +252,8 @@ 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[callIndex][1] as string[]
|
getExecOutputSpy.mock.calls[0][1] as string[]
|
||||||
).join(' ');
|
).join(' ');
|
||||||
|
|
||||||
expect(scriptArguments).toContain(
|
expect(scriptArguments).toContain(
|
||||||
@@ -311,15 +283,8 @@ 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[callIndex][1] as string[]
|
getExecOutputSpy.mock.calls[0][1] as string[]
|
||||||
).join(' ');
|
).join(' ');
|
||||||
|
|
||||||
expect(scriptArguments).toContain(
|
expect(scriptArguments).toContain(
|
||||||
@@ -332,14 +297,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.DotnetInstallDir.addToPath();
|
installer.DotnetCoreInstaller.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.DotnetInstallDir.addToPath();
|
installer.DotnetCoreInstaller.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']);
|
||||||
});
|
});
|
||||||
@@ -347,7 +312,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',
|
||||||
@@ -364,7 +329,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);
|
||||||
}
|
}
|
||||||
@@ -403,7 +368,7 @@ describe('installer tests', () => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
await expect(
|
await expect(
|
||||||
async () => await dotnetVersionResolver.createDotnetVersion()
|
async () => await dotnetVersionResolver.createDotNetVersion()
|
||||||
).rejects.toThrow();
|
).rejects.toThrow();
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -415,7 +380,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
|
||||||
@@ -430,7 +395,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
|
||||||
@@ -446,7 +411,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
|
||||||
@@ -462,7 +427,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)/);
|
||||||
|
|
||||||
@@ -482,7 +447,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, DotnetInstallDir} from '../src/installer';
|
import {DotnetCoreInstaller} 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,25 +28,22 @@ 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();
|
||||||
});
|
});
|
||||||
@@ -107,9 +104,10 @@ 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(DotnetInstallDir.addToPath).toHaveBeenCalledTimes(1);
|
expect(addToPathSpy).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 () => {
|
||||||
@@ -150,9 +148,10 @@ 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(DotnetInstallDir.addToPath).toHaveBeenCalledTimes(1);
|
expect(setOutputSpy).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 () => {
|
||||||
@@ -160,6 +159,7 @@ 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,6 +170,8 @@ 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);
|
||||||
@@ -183,6 +185,7 @@ 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());
|
||||||
@@ -200,6 +203,7 @@ 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());
|
||||||
@@ -214,6 +218,7 @@ 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: 'node20'
|
using: 'node16'
|
||||||
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()
|
||||||
|
|||||||
14022
dist/cache-save/index.js
vendored
14022
dist/cache-save/index.js
vendored
File diff suppressed because it is too large
Load Diff
30885
dist/setup/index.js
vendored
30885
dist/setup/index.js
vendored
File diff suppressed because one or more lines are too long
621
externals/install-dotnet.ps1
vendored
621
externals/install-dotnet.ps1
vendored
@@ -72,14 +72,12 @@
|
|||||||
.PARAMETER Verbose
|
.PARAMETER Verbose
|
||||||
Displays diagnostics information.
|
Displays diagnostics information.
|
||||||
.PARAMETER AzureFeed
|
.PARAMETER AzureFeed
|
||||||
Default: https://dotnetcli.azureedge.net/dotnet
|
Default: https://builds.dotnet.microsoft.com/dotnet
|
||||||
For internal use only.
|
For internal use only.
|
||||||
Allows using a different storage to download SDK archives from.
|
Allows using a different storage to download SDK archives from.
|
||||||
This parameter is only used if $NoCdn is false.
|
|
||||||
.PARAMETER UncachedFeed
|
.PARAMETER UncachedFeed
|
||||||
For internal use only.
|
For internal use only.
|
||||||
Allows using a different storage to download SDK archives from.
|
Allows using a different storage to download SDK archives from.
|
||||||
This parameter is only used if $NoCdn is true.
|
|
||||||
.PARAMETER ProxyAddress
|
.PARAMETER ProxyAddress
|
||||||
If set, the installer will use the proxy when making web requests
|
If set, the installer will use the proxy when making web requests
|
||||||
.PARAMETER ProxyUseDefaultCredentials
|
.PARAMETER ProxyUseDefaultCredentials
|
||||||
@@ -90,8 +88,6 @@
|
|||||||
.PARAMETER SkipNonVersionedFiles
|
.PARAMETER SkipNonVersionedFiles
|
||||||
Default: false
|
Default: false
|
||||||
Skips installing non-versioned files if they already exist, such as dotnet.exe.
|
Skips installing non-versioned files if they already exist, such as dotnet.exe.
|
||||||
.PARAMETER NoCdn
|
|
||||||
Disable downloading from the Azure CDN, and use the uncached feed directly.
|
|
||||||
.PARAMETER JSonFile
|
.PARAMETER JSonFile
|
||||||
Determines the SDK version from a user specified global.json file
|
Determines the SDK version from a user specified global.json file
|
||||||
Note: global.json must have a value for 'SDK:Version'
|
Note: global.json must have a value for 'SDK:Version'
|
||||||
@@ -111,35 +107,34 @@
|
|||||||
#>
|
#>
|
||||||
[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,
|
||||||
[switch]$DryRun,
|
[switch]$DryRun,
|
||||||
[switch]$NoPath,
|
[switch]$NoPath,
|
||||||
[string]$AzureFeed,
|
[string]$AzureFeed,
|
||||||
[string]$UncachedFeed,
|
[string]$UncachedFeed,
|
||||||
[string]$FeedCredential,
|
[string]$FeedCredential,
|
||||||
[string]$ProxyAddress,
|
[string]$ProxyAddress,
|
||||||
[switch]$ProxyUseDefaultCredentials,
|
[switch]$ProxyUseDefaultCredentials,
|
||||||
[string[]]$ProxyBypassList=@(),
|
[string[]]$ProxyBypassList = @(),
|
||||||
[switch]$SkipNonVersionedFiles,
|
[switch]$SkipNonVersionedFiles,
|
||||||
[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 +181,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,14 +238,13 @@ 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"
|
||||||
@@ -279,13 +273,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -362,7 +356,7 @@ function Get-Version-From-LatestVersion-File-Content([string]$VersionText) {
|
|||||||
|
|
||||||
$VersionInfo = @{
|
$VersionInfo = @{
|
||||||
CommitHash = $(if ($Data.Count -gt 1) { $Data[0] })
|
CommitHash = $(if ($Data.Count -gt 1) { $Data[0] })
|
||||||
Version = $Data[-1] # last line is always the version number.
|
Version = $Data[-1] # last line is always the version number.
|
||||||
}
|
}
|
||||||
return $VersionInfo
|
return $VersionInfo
|
||||||
}
|
}
|
||||||
@@ -377,8 +371,7 @@ 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 = {
|
||||||
@@ -389,19 +382,21 @@ 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,15 +405,14 @@ 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
|
||||||
@@ -427,7 +421,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 {
|
||||||
@@ -452,8 +446,7 @@ 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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -470,8 +463,8 @@ function GetHTTPResponse([Uri] $Uri, [bool]$HeaderOnly, [bool]$DisableRedirect,
|
|||||||
$CurrentException = $PSItem.Exception
|
$CurrentException = $PSItem.Exception
|
||||||
$ErrorMsg = $CurrentException.Message + "`r`n"
|
$ErrorMsg = $CurrentException.Message + "`r`n"
|
||||||
while ($CurrentException.InnerException) {
|
while ($CurrentException.InnerException) {
|
||||||
$CurrentException = $CurrentException.InnerException
|
$CurrentException = $CurrentException.InnerException
|
||||||
$ErrorMsg += $CurrentException.Message + "`r`n"
|
$ErrorMsg += $CurrentException.Message + "`r`n"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Check if there is an issue concerning TLS.
|
# Check if there is an issue concerning TLS.
|
||||||
@@ -483,7 +476,7 @@ function GetHTTPResponse([Uri] $Uri, [bool]$HeaderOnly, [bool]$DisableRedirect,
|
|||||||
throw $DownloadException
|
throw $DownloadException
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
if ($null -ne $HttpClient) {
|
if ($null -ne $HttpClient) {
|
||||||
$HttpClient.Dispose()
|
$HttpClient.Dispose()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -492,10 +485,8 @@ 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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -613,11 +604,9 @@ 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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -667,8 +656,7 @@ 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
|
||||||
@@ -683,8 +671,7 @@ 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
|
||||||
}
|
}
|
||||||
@@ -696,21 +683,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,7 +723,7 @@ function Get-Product-Version-Url([string]$AzureFeed, [string]$SpecificVersion, [
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$ProductVersionTxtURL = $PackageDownloadLink.Substring(0, $PackageDownloadLink.LastIndexOf("/")) + "/$pvFileName"
|
$ProductVersionTxtURL = $PackageDownloadLink.Substring(0, $PackageDownloadLink.LastIndexOf("/")) + "/$pvFileName"
|
||||||
}
|
}
|
||||||
|
|
||||||
Say-Verbose "Constructed productVersion link: $ProductVersionTxtURL"
|
Say-Verbose "Constructed productVersion link: $ProductVersionTxtURL"
|
||||||
@@ -744,16 +731,14 @@ 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'."
|
||||||
}
|
}
|
||||||
@@ -771,6 +756,9 @@ 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
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -783,6 +771,19 @@ 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
|
||||||
|
|
||||||
@@ -858,7 +859,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)
|
||||||
@@ -866,8 +867,7 @@ 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;
|
||||||
}
|
}
|
||||||
@@ -954,7 +954,8 @@ 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`""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -963,36 +964,60 @@ 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
|
||||||
|
|
||||||
@@ -1010,19 +1035,18 @@ 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)) {
|
||||||
@@ -1031,8 +1055,7 @@ 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]
|
||||||
|
|
||||||
@@ -1051,9 +1074,13 @@ 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
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1069,7 +1096,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'."
|
||||||
@@ -1102,28 +1129,22 @@ function Get-AkaMsLink-And-Version([string] $NormalizedChannel, [string] $Normal
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function Get-Feeds-To-Use()
|
function Get-Feeds-To-Use() {
|
||||||
{
|
|
||||||
$feeds = @(
|
$feeds = @(
|
||||||
"https://dotnetcli.azureedge.net/dotnet",
|
"https://builds.dotnet.microsoft.com/dotnet"
|
||||||
"https://dotnetbuilds.azureedge.net/public"
|
"https://ci.dot.net/public"
|
||||||
)
|
)
|
||||||
|
|
||||||
if (-not [string]::IsNullOrEmpty($AzureFeed)) {
|
if (-not [string]::IsNullOrEmpty($AzureFeed)) {
|
||||||
$feeds = @($AzureFeed)
|
$feeds = @($AzureFeed)
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($NoCdn) {
|
if (-not [string]::IsNullOrEmpty($UncachedFeed)) {
|
||||||
$feeds = @(
|
|
||||||
"https://dotnetcli.blob.core.windows.net/dotnet",
|
|
||||||
"https://dotnetbuilds.blob.core.windows.net/public"
|
|
||||||
)
|
|
||||||
|
|
||||||
if (-not [string]::IsNullOrEmpty($UncachedFeed)) {
|
|
||||||
$feeds = @($UncachedFeed)
|
$feeds = @($UncachedFeed)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Write-Verbose "Initialized feeds: $feeds"
|
||||||
|
|
||||||
return $feeds
|
return $feeds
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1177,8 +1198,7 @@ function Prepare-Install-Directory {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($Help)
|
if ($Help) {
|
||||||
{
|
|
||||||
Get-Help $PSCommandPath -Examples
|
Get-Help $PSCommandPath -Examples
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
@@ -1206,6 +1226,10 @@ 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
|
||||||
@@ -1222,13 +1246,12 @@ 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
|
||||||
@@ -1239,34 +1262,31 @@ 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: $_"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1289,8 +1309,7 @@ $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 {
|
||||||
@@ -1310,7 +1329,8 @@ 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
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1361,47 +1381,48 @@ 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 resolve dependencies during installation."
|
Say "Note that the script does not ensure your Windows version is supported during the installation."
|
||||||
Say "To check the list of dependencies, go to https://learn.microsoft.com/dotnet/core/install/windows#dependencies"
|
Say "To check the list of supported versions, go to https://learn.microsoft.com/dotnet/core/install/windows#supported-versions"
|
||||||
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
|
||||||
# MIIoLAYJKoZIhvcNAQcCoIIoHTCCKBkCAQExDzANBglghkgBZQMEAgEFADB5Bgor
|
# MIIoRgYJKoZIhvcNAQcCoIIoNzCCKDMCAQExDzANBglghkgBZQMEAgEFADB5Bgor
|
||||||
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
|
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
|
||||||
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAcjJpspXTX0Wfr
|
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAA6hOL3sfG/4jH
|
||||||
# XrmBKKJAMp5FGvSyRcbMwr8jAJ2D2qCCDXYwggX0MIID3KADAgECAhMzAAADrzBA
|
# iO4VqZoOTVqC+yp2rOhb1M2cc+ic7KCCDXYwggX0MIID3KADAgECAhMzAAAEBGx0
|
||||||
# DkyjTQVBAAAAAAOvMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
|
# Bv9XKydyAAAAAAQEMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
|
||||||
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
|
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
|
||||||
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
|
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
|
||||||
# bmcgUENBIDIwMTEwHhcNMjMxMTE2MTkwOTAwWhcNMjQxMTE0MTkwOTAwWjB0MQsw
|
# bmcgUENBIDIwMTEwHhcNMjQwOTEyMjAxMTE0WhcNMjUwOTExMjAxMTE0WjB0MQsw
|
||||||
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
|
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
|
||||||
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
|
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
|
||||||
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
|
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
|
||||||
# AQDOS8s1ra6f0YGtg0OhEaQa/t3Q+q1MEHhWJhqQVuO5amYXQpy8MDPNoJYk+FWA
|
# AQC0KDfaY50MDqsEGdlIzDHBd6CqIMRQWW9Af1LHDDTuFjfDsvna0nEuDSYJmNyz
|
||||||
# hePP5LxwcSge5aen+f5Q6WNPd6EDxGzotvVpNi5ve0H97S3F7C/axDfKxyNh21MG
|
# NB10jpbg0lhvkT1AzfX2TLITSXwS8D+mBzGCWMM/wTpciWBV/pbjSazbzoKvRrNo
|
||||||
# 0W8Sb0vxi/vorcLHOL9i+t2D6yvvDzLlEefUCbQV/zGCBjXGlYJcUj6RAzXyeNAN
|
# DV/u9omOM2Eawyo5JJJdNkM2d8qzkQ0bRuRd4HarmGunSouyb9NY7egWN5E5lUc3
|
||||||
# xSpKXAGd7Fh+ocGHPPphcD9LQTOJgG7Y7aYztHqBLJiQQ4eAgZNU4ac6+8LnEGAL
|
# a2AROzAdHdYpObpCOdeAY2P5XqtJkk79aROpzw16wCjdSn8qMzCBzR7rvH2WVkvF
|
||||||
# go1ydC5BJEuJQjYKbNTy959HrKSu7LO3Ws0w8jw6pYdC1IMpdTkk2puTgY2PDNzB
|
# HLIxZQET1yhPb6lRmpgBQNnzidHV2Ocxjc8wNiIDzgbDkmlx54QPfw7RwQi8p1fy
|
||||||
# tLM4evG7FYer3WX+8t1UMYNTAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE
|
# 4byhBrTjv568x8NGv3gwb0RbAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE
|
||||||
# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQURxxxNPIEPGSO8kqz+bgCAQWGXsEw
|
# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQU8huhNbETDU+ZWllL4DNMPCijEU4w
|
||||||
# RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW
|
# RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW
|
||||||
# MBQGA1UEBRMNMjMwMDEyKzUwMTgyNjAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci
|
# MBQGA1UEBRMNMjMwMDEyKzUwMjkyMzAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci
|
||||||
# tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
|
# tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
|
||||||
# b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG
|
# b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG
|
||||||
# CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu
|
# CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu
|
||||||
# Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0
|
# Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0
|
||||||
# MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAISxFt/zR2frTFPB45Yd
|
# MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAIjmD9IpQVvfB1QehvpC
|
||||||
# mhZpB2nNJoOoi+qlgcTlnO4QwlYN1w/vYwbDy/oFJolD5r6FMJd0RGcgEM8q9TgQ
|
# Ge7QeTQkKQ7j3bmDMjwSqFL4ri6ae9IFTdpywn5smmtSIyKYDn3/nHtaEn0X1NBj
|
||||||
# 2OC7gQEmhweVJ7yuKJlQBH7P7Pg5RiqgV3cSonJ+OM4kFHbP3gPLiyzssSQdRuPY
|
# L5oP0BjAy1sqxD+uy35B+V8wv5GrxhMDJP8l2QjLtH/UglSTIhLqyt8bUAqVfyfp
|
||||||
# 1mIWoGg9i7Y4ZC8ST7WhpSyc0pns2XsUe1XsIjaUcGu7zd7gg97eCUiLRdVklPmp
|
# h4COMRvwwjTvChtCnUXXACuCXYHWalOoc0OU2oGN+mPJIJJxaNQc1sjBsMbGIWv3
|
||||||
# XobH9CEAWakRUGNICYN2AgjhRTC4j3KJfqMkU04R6Toyh4/Toswm1uoDcGr5laYn
|
# cmgSHkCEmrMv7yaidpePt6V+yPMik+eXw3IfZ5eNOiNgL1rZzgSJfTnvUqiaEQ0X
|
||||||
# TfcX3u5WnJqJLhuPe8Uj9kGAOcyo0O1mNwDa+LhFEzB6CB32+wfJMumfr6degvLT
|
# dG1HbkDv9fv6CTq6m4Ty3IzLiwGSXYxRIXTxT4TYs5VxHy2uFjFXWVSL0J2ARTYL
|
||||||
# e8x55urQLeTjimBQgS49BSUkhFN7ois3cZyNpnrMca5AZaC7pLI72vuqSsSlLalG
|
# E4Oyl1wXDF1PX4bxg1yDMfKPHcE1Ijic5lx1KdK1SkaEJdto4hd++05J9Bf9TAmi
|
||||||
# OcZmPHZGYJqZ0BacN274OZ80Q8B11iNokns9Od348bMb5Z4fihxaBWebl8kWEi2O
|
# u6EK6C9Oe5vRadroJCK26uCUI4zIjL/qG7mswW+qT0CW0gnR9JHkXCWNbo8ccMk1
|
||||||
# PvQImOAeq3nt7UWJBzJYLAGEpfasaA3ZQgIcEXdD+uwo6ymMzDY6UamFOfYqYWXk
|
# sJatmRoSAifbgzaYbUz8+lv+IXy5GFuAmLnNbGjacB3IMGpa+lbFgih57/fIhamq
|
||||||
# ntxDGu7ngD2ugKUuccYKJJRiiz+LAUcj90BVcSHRLQop9N8zoALr/1sJuwPrVAtx
|
# 5VhxgaEmn/UjWyr+cPiAFWuTVIpfsOjbEAww75wURNM1Imp9NJKye1O24EspEHmb
|
||||||
# HNEgSW+AKBqIxYWM4Ev32l6agSUAezLMbq5f3d8x9qzT031jMDT+sUAoCw0M5wVt
|
# DmqCUcq7NqkOKIG4PVm3hDDED/WQpzJDkvu4FrIbvyTGVU01vKsg4UfcdiZ0fQ+/
|
||||||
# CUQcqINPuYjbS1WgJyZIiEkBMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq
|
# V0hf8yrtq9CkB8iIuk5bBxuPMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq
|
||||||
# hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x
|
# hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x
|
||||||
# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
|
# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
|
||||||
# bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
|
# bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
|
||||||
@@ -1441,144 +1462,144 @@ Say "Installation finished"
|
|||||||
# XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA
|
# XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA
|
||||||
# 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt
|
# 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt
|
||||||
# Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr
|
# Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr
|
||||||
# /Xmfwb1tbWrJUnMTDXpQzTGCGgwwghoIAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw
|
# /Xmfwb1tbWrJUnMTDXpQzTGCGiYwghoiAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw
|
||||||
# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
|
# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
|
||||||
# aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp
|
# aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp
|
||||||
# Z25pbmcgUENBIDIwMTECEzMAAAOvMEAOTKNNBUEAAAAAA68wDQYJYIZIAWUDBAIB
|
# Z25pbmcgUENBIDIwMTECEzMAAAQEbHQG/1crJ3IAAAAABAQwDQYJYIZIAWUDBAIB
|
||||||
# BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO
|
# BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO
|
||||||
# MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEILE0f3lJHQgU2RZWXUC1oqZH
|
# MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIL7Zm9jjqasUipeS7XNbT5Gz
|
||||||
# SyMVCuT1h5mXGiSSjTDHMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A
|
# uhEwSf09z2Ab+694mR/3MEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A
|
||||||
# cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB
|
# cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB
|
||||||
# BQAEggEANxDFgCiCDFasXK4jelzA8ed3cn/ZebTOsL/D/5LQTgwhbjtfp1Dp7awF
|
# BQAEggEAfTNcpMwgkFxkb0hBch2MCvTb1mGCFv8rZWTkR/aRZTyzuAIEb2GfL4qB
|
||||||
# 8vESgjYXq22XMBz5vV12f2f14XzxG1kW17bP9OR+D2C3GUlN2xQstIhslXJRKVwi
|
# rPycLC2+q4gaksj1Cv+mRTEq+ysl0aWbXgPiRNiijlnuWKRPZ4nlcGkeXu5zxJ1W
|
||||||
# lpFqHGFKy8o6sssvdrtsatlfrtC+ZChbQ1nyJmYWiCotVTwoi6UMA3EiXfQ/6KGo
|
# uUOCIe03s6eJCUZseRZkNHB1/CqIlk/YB5yqB38cfq6ct+lWKoSCbSwRVh3Du6am
|
||||||
# o8MykKgtMWaolI63lITY2EWtUowSgg7IToyrZEYOH3p45F3Rb3mfVl5GE9u8BPBZ
|
# jxnQRa4njduu1xywcKZYp9NGGeAgRDpMNbvFKF4Qf3krbTAn3vIVDBay6oeiHo2I
|
||||||
# WyZ3JZPojeJZPBwoh746RijTpga+MIPTLMT5/pyEFF37XoTfKy+pmIy2g27fGF0f
|
# x1RLrRC/CEYZ7oJ8tyc3SUE2/Jd00M4EKax+z3xTIkOmyMBZjEe1el92WVcUWukT
|
||||||
# dUTMVnaeP3Gsz/QoRIYGwRZHxPIn06GCF5YwgheSBgorBgEEAYI3AwMBMYIXgjCC
|
# ACoQjF5jPyXnfYGH7rjevjpI5u2T66GCF7AwghesBgorBgEEAYI3AwMBMYIXnDCC
|
||||||
# F34GCSqGSIb3DQEHAqCCF28wghdrAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFRBgsq
|
# F5gGCSqGSIb3DQEHAqCCF4kwgheFAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFaBgsq
|
||||||
# hkiG9w0BCRABBKCCAUAEggE8MIIBOAIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl
|
# hkiG9w0BCRABBKCCAUkEggFFMIIBQQIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl
|
||||||
# AwQCAQUABCDsnfXLdwRAAmajQ5qXHFhiKlkumRT841LqpvZZhWG0uwIGZbwTAVg6
|
# AwQCAQUABCBjHcYL0Rw5C6IE3Lyb3B0i9qsTzN6j8bzChm+bMp97RgIGZ2Ld17Jt
|
||||||
# GBIyMDI0MDIxNDIxMTUyNS45OVowBIACAfSggdGkgc4wgcsxCzAJBgNVBAYTAlVT
|
# GBMyMDI1MDExMjAwNDMxNy4yNTZaMASAAgH0oIHZpIHWMIHTMQswCQYDVQQGEwJV
|
||||||
# MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK
|
|
||||||
# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVy
|
|
||||||
# aWNhIE9wZXJhdGlvbnMxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjozNzAzLTA1
|
|
||||||
# RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaCC
|
|
||||||
# Ee0wggcgMIIFCKADAgECAhMzAAAB6pokctVZP2FjAAEAAAHqMA0GCSqGSIb3DQEB
|
|
||||||
# CwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH
|
|
||||||
# EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNV
|
|
||||||
# BAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4XDTIzMTIwNjE4NDUz
|
|
||||||
# MFoXDTI1MDMwNTE4NDUzMFowgcsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo
|
|
||||||
# aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y
|
|
||||||
# cG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMx
|
|
||||||
# JzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjozNzAzLTA1RTAtRDk0NzElMCMGA1UE
|
|
||||||
# AxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZTCCAiIwDQYJKoZIhvcNAQEB
|
|
||||||
# BQADggIPADCCAgoCggIBALULX/FIPyAH1fsu52ijatZvaSypoXrlC0mRtCmaxzob
|
|
||||||
# huDkw6/pY/+4nhc4m8pf9zW3R6PihYGp0YPpVuNdfhPQp/KVO6WvMq2DGfFmHurW
|
|
||||||
# 4PQPL/DkbQMkM9vqjFCvPq8xXZnfL1nGN9moGcN+oaif/hUMedmF1qzbay9ILkYf
|
|
||||||
# LCxDYn3Qwzsvh5xjxOcsjzmRddNURJvT23Eva0cxisH4ocLLTx2zfpqfshw4Z9Ga
|
|
||||||
# EdsWg9rmib1galUpLzF5PsQDBbtZtcv+Wjmn0pFEiMCWwEEcPVN0YG5ysYLdNBdJ
|
|
||||||
# On2zsOOS+80W5RrQEqzPpSIIvEkZBJmF3aI4lMR8nV/FiTadjpIIqxX5Wa1XlqI/
|
|
||||||
# Nj+xagVjnjb7POsA+vh6Wu+v24HpyL8pyL/8Q4RFkRRME9cwT+Jr63yOtPbLe6DX
|
|
||||||
# kxIJW6E6w2ua5kXBpEKtEQPTLPhX3CUxMYcglbnmI0zcc9UknX285K+sI/2WwRwT
|
|
||||||
# BZkhDUULI86eQzV+zvzzR1qEBrlSY+oyTlYQrHMM9WnTzVflFDocZVTPpl2BDSNx
|
|
||||||
# Pn0Qb4IoM9EPqbHyi/MilL+v/AQc8q3mQ6FiuPJAddz0ocpNZ9ekBWPVLKq3lfie
|
|
||||||
# v4yl65u/438+NAQ+vSJgkONLMmuoguEGzmnK1vq/JHwdRUyn6YADiteM7Dja+Qd9
|
|
||||||
# AgMBAAGjggFJMIIBRTAdBgNVHQ4EFgQUK4FFJaJR5ukXQFTUxMhyiwVuWV4wHwYD
|
|
||||||
# VR0jBBgwFoAUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXwYDVR0fBFgwVjBUoFKgUIZO
|
|
||||||
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIw
|
|
||||||
# VGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3JsMGwGCCsGAQUFBwEBBGAwXjBc
|
|
||||||
# BggrBgEFBQcwAoZQaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0
|
|
||||||
# cy9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcnQwDAYD
|
|
||||||
# VR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8EBAMC
|
|
||||||
# B4AwDQYJKoZIhvcNAQELBQADggIBACiDrVZeP37+fFVtfcbfsqC/Kg0Ce67bDceh
|
|
||||||
# ZmPcfRgJ5Ddv0pJlOFVOFbiIVwesqeEUwFtclfi5AjneQ5ZJpYJpXfELOelG3dzj
|
|
||||||
# +BKfd287/UY/cwmSkl+CjnoKBL3Ms6I/fWR+alR0+p6RlviK8xHoug9vkc2WrRZs
|
|
||||||
# GnMVu2xOM2tPJ+qpyoDBzqv30N/ZRBOoNrS/PCkDwLGICDYqVs/IzAE49yv2ElPy
|
|
||||||
# walf9mEsOHXV1lxtQDNcejVEmitJJ+1Vr2EtafPEbMQZp89TAuagROKE4YuohCUK
|
|
||||||
# m+v3geJqTQarTBjqV25RCOT+XFngTMDD9wYx6TwndB2I1Ly726NiHUHs0uvq3ciC
|
|
||||||
# V9JwNXdt1VZ63WK1NSgpVEsiK9EPABPt1EfXcKrfaPYkbkFi79eK1ETxx3NomYNU
|
|
||||||
# HNiGU+X1Be8L7qpHwjo0g3/33XhtOr9LiDoUXh/V2LFTETiqV9Q8yLEavQW3j9LQ
|
|
||||||
# /h/CaGz5YdGfrY8HiPfMIeLEokKxGf0hHcTEFApB0yLlq6KoHrFAEANR/4XuFIpl
|
|
||||||
# 9sDywVIWt4tKqG+P6pRAXzg1zG5rGlslZWmw7XwgvhBu3jkLP9AxrsSYwY2ftrww
|
|
||||||
# ze5NA6VDLS7pz+OrXXWLUmoyNrJNx5Bk0wEwzkQxzkOvmbdPhsOP1ZM0uA/xIV7c
|
|
||||||
# SpNpZUw5MIIHcTCCBVmgAwIBAgITMwAAABXF52ueAptJmQAAAAAAFTANBgkqhkiG
|
|
||||||
# 9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO
|
|
||||||
# BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEy
|
|
||||||
# MDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw
|
|
||||||
# MTAwHhcNMjEwOTMwMTgyMjI1WhcNMzAwOTMwMTgzMjI1WjB8MQswCQYDVQQGEwJV
|
|
||||||
# UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
|
# UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
|
||||||
# ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGlt
|
# ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJl
|
||||||
# ZS1TdGFtcCBQQ0EgMjAxMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
|
# bGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVT
|
||||||
# AOThpkzntHIhC3miy9ckeb0O1YLT/e6cBwfSqWxOdcjKNVf2AX9sSuDivbk+F2Az
|
# Tjo0MzFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAg
|
||||||
# /1xPx2b3lVNxWuJ+Slr+uDZnhUYjDLWNE893MsAQGOhgfWpSg0S3po5GawcU88V2
|
# U2VydmljZaCCEf4wggcoMIIFEKADAgECAhMzAAAB+vs7RNN3M8bTAAEAAAH6MA0G
|
||||||
# 9YZQ3MFEyHFcUTE3oAo4bo3t1w/YJlN8OWECesSq/XJprx2rrPY2vjUmZNqYO7oa
|
# CSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u
|
||||||
# ezOtgFt+jBAcnVL+tuhiJdxqD89d9P6OU8/W7IVWTe/dvI2k45GPsjksUZzpcGkN
|
# MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp
|
||||||
# yjYtcI4xyDUoveO0hyTD4MmPfrVUj9z6BVWYbWg7mka97aSueik3rMvrg0XnRm7K
|
# b24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4XDTI0
|
||||||
# MtXAhjBcTyziYrLNueKNiOSWrAFKu75xqRdbZ2De+JKRHh09/SDPc31BmkZ1zcRf
|
# MDcyNTE4MzExMVoXDTI1MTAyMjE4MzExMVowgdMxCzAJBgNVBAYTAlVTMRMwEQYD
|
||||||
# NN0Sidb9pSB9fvzZnkXftnIv231fgLrbqn427DZM9ituqBJR6L8FA6PRc6ZNN3SU
|
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
|
||||||
# HDSCD/AQ8rdHGO2n6Jl8P0zbr17C89XYcz1DTsEzOUyOArxCaC4Q6oRRRuLRvWoY
|
# b3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9w
|
||||||
# WmEBc8pnol7XKHYC4jMYctenIPDC+hIK12NvDMk2ZItboKaDIV1fMHSRlJTYuVD5
|
# ZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjQzMUEt
|
||||||
# C4lh8zYGNRiER9vcG9H9stQcxWv2XFJRXRLbJbqvUAV6bMURHXLvjflSxIUXk8A8
|
# MDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNl
|
||||||
# FdsaN8cIFRg/eKtFtvUeh17aj54WcmnGrnu3tz5q4i6tAgMBAAGjggHdMIIB2TAS
|
# MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyhZVBM3PZcBfEpAf7fII
|
||||||
# BgkrBgEEAYI3FQEEBQIDAQABMCMGCSsGAQQBgjcVAgQWBBQqp1L+ZMSavoKRPEY1
|
# hygwYVVP64USeZbSlRR3pvJebva0LQCDW45yOrtpwIpGyDGX+EbCbHhS5Td4J0Yl
|
||||||
# Kc8Q/y8E7jAdBgNVHQ4EFgQUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXAYDVR0gBFUw
|
# c83ztLEbbQD7M6kqR0Xj+n82cGse/QnMH0WRZLnwggJdenpQ6UciM4nMYZvdQjyb
|
||||||
# UzBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNy
|
# A4qejOe9Y073JlXv3VIbdkQH2JGyT8oB/LsvPL/kAnJ45oQIp7Sx57RPQ/0O6qay
|
||||||
# b3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMBMGA1UdJQQMMAoG
|
# J2SJrwcjA8auMdAnZKOixFlzoooh7SyycI7BENHTpkVKrRV5YelRvWNTg1pH4EC2
|
||||||
# CCsGAQUFBwMIMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIB
|
# KO2bxsBN23btMeTvZFieGIr+D8mf1lQQs0Ht/tMOVdah14t7Yk+xl5P4Tw3xfAGg
|
||||||
# hjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNX2VsuP6KJcYmjRPZSQW9fO
|
# Hsvsa6ugrxwmKTTX1kqXH5XCdw3TVeKCax6JV+ygM5i1NroJKwBCW11Pwi0z/ki9
|
||||||
# mhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9w
|
# 0ZeO6XfEE9mCnJm76Qcxi3tnW/Y/3ZumKQ6X/iVIJo7Lk0Z/pATRwAINqwdvzpdt
|
||||||
# a2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNybDBaBggr
|
# X2hOJib4GR8is2bpKks04GurfweWPn9z6jY7GBC+js8pSwGewrffwgAbNKm82ZDF
|
||||||
# BgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0LmNv
|
# vqBGQQVJwIHSXpjkS+G39eyYOG2rcILBIDlzUzMFFJbNh5tDv3GeJ3EKvC4vNSAx
|
||||||
# bS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3J0MA0GCSqGSIb3
|
# tGfaG/mQhK43YjevsB72LouU78rxtNhuMXSzaHq5fFiG3zcsYHaa4+w+YmMrhTEz
|
||||||
# DQEBCwUAA4ICAQCdVX38Kq3hLB9nATEkW+Geckv8qW/qXBS2Pk5HZHixBpOXPTEz
|
# D4SAish35BjoXP1P1Ct4Va0CAwEAAaOCAUkwggFFMB0GA1UdDgQWBBRjjHKbL5WV
|
||||||
# tTnXwnE2P9pkbHzQdTltuw8x5MKP+2zRoZQYIu7pZmc6U03dmLq2HnjYNi6cqYJW
|
# 6kd06KocQHphK9U/vzAfBgNVHSMEGDAWgBSfpxVdAF5iXYP05dJlpxtTNRnpcjBf
|
||||||
# AAOwBb6J6Gngugnue99qb74py27YP0h1AdkY3m2CDPVtI1TkeFN1JFe53Z/zjj3G
|
# BgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
|
||||||
# 82jfZfakVqr3lbYoVSfQJL1AoL8ZthISEV09J+BAljis9/kpicO8F7BUhUKz/Aye
|
# L2NybC9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcmww
|
||||||
# ixmJ5/ALaoHCgRlCGVJ1ijbCHcNhcy4sa3tuPywJeBTpkbKpW99Jo3QMvOyRgNI9
|
# bAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBodHRwOi8vd3d3Lm1pY3Jvc29m
|
||||||
# 5ko+ZjtPu4b6MhrZlvSP9pEB9s7GdP32THJvEKt1MMU0sHrYUP4KWN1APMdUbZ1j
|
# dC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0El
|
||||||
# dEgssU5HLcEUBHG/ZPkkvnNtyo4JvbMBV0lUZNlz138eW0QBjloZkWsNn6Qo3GcZ
|
# MjAyMDEwKDEpLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUF
|
||||||
# KCS6OEuabvshVGtqRRFHqfG3rsjoiV5PndLQTHa1V1QJsWkBRH58oWFsc/4Ku+xB
|
# BwMIMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAgEAuFbCorFrvodG
|
||||||
# Zj1p/cvBQUl+fpO+y/g75LcVv7TOPqUxUYS8vwLBgqJ7Fx0ViY1w/ue10CgaiQuP
|
# +ZNJH3Y+Nz5QpUytQVObOyYFrgcGrxq6MUa4yLmxN4xWdL1kygaW5BOZ3xBlPY7V
|
||||||
# Ntq6TPmb/wrpNPgkNWcr4A245oyZ1uEi6vAnQj0llOZ0dFtq0Z4+7X6gMTN9vMvp
|
# puf5b5eaXP7qRq61xeOrX3f64kGiSWoRi9EJawJWCzJfUQRThDL4zxI2pYc1wnPp
|
||||||
# e784cETRkPHIqzqKOghif9lwY1NNje6CbaUFEMFxBmoQtB1VM1izoXBm8qGCA1Aw
|
# 7Q695bHqwZ02eaOBudh/IfEkGe0Ofj6IS3oyZsJP1yatcm4kBqIH6db1+weM4q46
|
||||||
# ggI4AgEBMIH5oYHRpIHOMIHLMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu
|
# NhAfAf070zF6F+IpUHyhtMbQg5+QHfOuyBzrt67CiMJSKcJ3nMVyfNlnv6yvttYz
|
||||||
# Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
|
# LK3wS+0QwJUibLYJMI6FGcSuRxKlq6RjOhK9L3QOjh0VCM11rHM11ZmN0euJbbBC
|
||||||
# cmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMScw
|
# VfQEufOLNkG88MFCUNE10SSbM/Og/CbTko0M5wbVvQJ6CqLKjtHSoeoAGPeeX24f
|
||||||
# JQYDVQQLEx5uU2hpZWxkIFRTUyBFU046MzcwMy0wNUUwLUQ5NDcxJTAjBgNVBAMT
|
# 5cPYyTcKlbM6LoUdO2P5JSdI5s1JF/On6LiUT50adpRstZajbYEeX/N7RvSbkn0d
|
||||||
# HE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WiIwoBATAHBgUrDgMCGgMVAInb
|
# jD3BvT2Of3Wf9gIeaQIHbv1J2O/P5QOPQiVo8+0AKm6M0TKOduihhKxAt/6Yyk17
|
||||||
# HtxB+OlGyQnxQYhy04KSYSSPoIGDMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNV
|
# Fv3RIdjT6wiL2qRIEsgOJp3fILw4mQRPu3spRfakSoQe5N0e4HWFf8WW2ZL0+c83
|
||||||
# BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv
|
# Qzh3VtEPI6Y2e2BO/eWhTYbIbHpqYDfAtAYtaYIde87ZymXG3MO2wUjhL9HvSQzj
|
||||||
# c29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAg
|
# oquq+OoUmvfBUcB2e5L6QCHO6qTO7WowggdxMIIFWaADAgECAhMzAAAAFcXna54C
|
||||||
# UENBIDIwMTAwDQYJKoZIhvcNAQELBQACBQDpdwuXMCIYDzIwMjQwMjE0MDk1MTE5
|
# m0mZAAAAAAAVMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UE
|
||||||
# WhgPMjAyNDAyMTUwOTUxMTlaMHcwPQYKKwYBBAGEWQoEATEvMC0wCgIFAOl3C5cC
|
# CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z
|
||||||
# AQAwCgIBAAICAbgCAf8wBwIBAAICFGEwCgIFAOl4XRcCAQAwNgYKKwYBBAGEWQoE
|
# b2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZp
|
||||||
# AjEoMCYwDAYKKwYBBAGEWQoDAqAKMAgCAQACAwehIKEKMAgCAQACAwGGoDANBgkq
|
# Y2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0yMTA5MzAxODIyMjVaFw0zMDA5MzAxODMy
|
||||||
# hkiG9w0BAQsFAAOCAQEAD3oj3Gr5HTA5vQkFXZE9QSfCqxmL4ez3qxPD1t/UMJ9w
|
# MjVaMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH
|
||||||
# 93APM6n5MjApe6tpBjo4Oe83WMnfsWNA5ZRu8B/XJhyJ8531k5XMROCaVX6eTOrO
|
# EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNV
|
||||||
# 70mkxtszD1E2m5iFx2RYJKS2ldkFAnykkFMc4ezXHa+RAijQA3rQp2VNidnVEFkO
|
# BAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMIICIjANBgkqhkiG9w0B
|
||||||
# jkaZY2FoA2dbG7v9ZjkQsmrycREGNiakPhAgqqmTiUlDPvul5gJx24VGL0z7JZhP
|
# AQEFAAOCAg8AMIICCgKCAgEA5OGmTOe0ciELeaLL1yR5vQ7VgtP97pwHB9KpbE51
|
||||||
# KUsccmv6HF3sgD6FjhENyZtD1+NrRfVQHTrjitjpC/dX9ux2OP8pjPi3WIdPfEsI
|
# yMo1V/YBf2xK4OK9uT4XYDP/XE/HZveVU3Fa4n5KWv64NmeFRiMMtY0Tz3cywBAY
|
||||||
# 2PhWNWSEof4cWFv/lLlYAUVeHPDcafr+2umlLYb62zGCBA0wggQJAgEBMIGTMHwx
|
# 6GB9alKDRLemjkZrBxTzxXb1hlDcwUTIcVxRMTegCjhuje3XD9gmU3w5YQJ6xKr9
|
||||||
# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt
|
# cmmvHaus9ja+NSZk2pg7uhp7M62AW36MEBydUv626GIl3GoPz130/o5Tz9bshVZN
|
||||||
# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1p
|
# 7928jaTjkY+yOSxRnOlwaQ3KNi1wjjHINSi947SHJMPgyY9+tVSP3PoFVZhtaDua
|
||||||
# Y3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAB6pokctVZP2FjAAEAAAHq
|
# Rr3tpK56KTesy+uDRedGbsoy1cCGMFxPLOJiss254o2I5JasAUq7vnGpF1tnYN74
|
||||||
# MA0GCWCGSAFlAwQCAQUAoIIBSjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQw
|
# kpEeHT39IM9zfUGaRnXNxF803RKJ1v2lIH1+/NmeRd+2ci/bfV+AutuqfjbsNkz2
|
||||||
# LwYJKoZIhvcNAQkEMSIEIL2oG23lx47V7tAc0IyUsnuhSrJEjOACK32L1AXSjdl/
|
# K26oElHovwUDo9Fzpk03dJQcNIIP8BDyt0cY7afomXw/TNuvXsLz1dhzPUNOwTM5
|
||||||
# MIH6BgsqhkiG9w0BCRACLzGB6jCB5zCB5DCBvQQgKY+h1eNkNHiLCDSW0sA1cGHk
|
# TI4CvEJoLhDqhFFG4tG9ahhaYQFzymeiXtcodgLiMxhy16cg8ML6EgrXY28MyTZk
|
||||||
# bW4qooi+ryyMp6S4ZngwgZgwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMK
|
# i1ugpoMhXV8wdJGUlNi5UPkLiWHzNgY1GIRH29wb0f2y1BzFa/ZcUlFdEtsluq9Q
|
||||||
# V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0
|
# BXpsxREdcu+N+VLEhReTwDwV2xo3xwgVGD94q0W29R6HXtqPnhZyacaue7e3Pmri
|
||||||
# IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0Eg
|
# Lq0CAwEAAaOCAd0wggHZMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUC
|
||||||
# MjAxMAITMwAAAeqaJHLVWT9hYwABAAAB6jAiBCB7j2iMmFJTNAbY6vZ80pGTL0BC
|
# BBYEFCqnUv5kxJq+gpE8RjUpzxD/LwTuMB0GA1UdDgQWBBSfpxVdAF5iXYP05dJl
|
||||||
# A2VAW00KF9MbtVlx1zANBgkqhkiG9w0BAQsFAASCAgA1ArfmkqTc7BoI6J+6zHkc
|
# pxtTNRnpcjBcBgNVHSAEVTBTMFEGDCsGAQQBgjdMg30BATBBMD8GCCsGAQUFBwIB
|
||||||
# TrfkFzsjKWBJpcPWwOPOZOdxfO850UPyrCLJgTclSkgnDBSSDQLqjhV2Q3EeM5tm
|
# FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9y
|
||||||
# iBFU1IO7RIMeF4hTB2jOzGuvX46zRms8/booKtLBlPRscHvYbXgOUqIn9M2ymtZo
|
# eS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUA
|
||||||
# aMp08VpWw+PxTbSa6HN6jQiwVVtRg9nsGd4gY/mO6+agIkbSs6hY2oV6HyhDH3CB
|
# YgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU
|
||||||
# DvEL3z7BCJ5Dx52K3XE2BUDR6nLhkGvxOxRaJ1GmJQXMMILDebq6ULx0ULThmpUQ
|
# 1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2Ny
|
||||||
# y6aifjEa3r60cjg29rKd/4PGmbDBaRAnVs7JEaxdSsTR75Ak7OKQymZ4yPI3bTkx
|
# bC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIw
|
||||||
# 1t/LCEKtia/oqv3tFMP8KtSUHZEK8PvmvRCJII2JrAUrxTYzrohxf/TL95sZdmGg
|
# MTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDov
|
||||||
# QNyQC2T+h816Kl7i+RrtXi5i6kSYqnTlr7uKFU4idVNRVxqiO/oumXhf6REHp1Wi
|
# L3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0w
|
||||||
# V60E8w5gawis5jnaJqZMeCiyHSLhm+zvXaCMm1AHUWQ6zK/GWOp1Y0wHiJRr5pnf
|
# Ni0yMy5jcnQwDQYJKoZIhvcNAQELBQADggIBAJ1VffwqreEsH2cBMSRb4Z5yS/yp
|
||||||
# 4wIKAt7oKWL/clx2jikqesxYFfGBq0YnfRUyHt3bscb83xfbFMjcbok/UI8fxWQM
|
# b+pcFLY+TkdkeLEGk5c9MTO1OdfCcTY/2mRsfNB1OW27DzHkwo/7bNGhlBgi7ulm
|
||||||
# vLsaEzFVp+a7wRqLf4KjiYzF4hORFWoGlZbGglkVYiYswX8Emsx5cn2F5M9cznRn
|
# ZzpTTd2YurYeeNg2LpypglYAA7AFvonoaeC6Ce5732pvvinLbtg/SHUB2RjebYIM
|
||||||
# 4d+LeskiXr3Z0pV6Ooki3w==
|
# 9W0jVOR4U3UkV7ndn/OOPcbzaN9l9qRWqveVtihVJ9AkvUCgvxm2EhIRXT0n4ECW
|
||||||
|
# OKz3+SmJw7wXsFSFQrP8DJ6LGYnn8AtqgcKBGUIZUnWKNsIdw2FzLixre24/LAl4
|
||||||
|
# FOmRsqlb30mjdAy87JGA0j3mSj5mO0+7hvoyGtmW9I/2kQH2zsZ0/fZMcm8Qq3Uw
|
||||||
|
# xTSwethQ/gpY3UA8x1RtnWN0SCyxTkctwRQEcb9k+SS+c23Kjgm9swFXSVRk2XPX
|
||||||
|
# fx5bRAGOWhmRaw2fpCjcZxkoJLo4S5pu+yFUa2pFEUep8beuyOiJXk+d0tBMdrVX
|
||||||
|
# VAmxaQFEfnyhYWxz/gq77EFmPWn9y8FBSX5+k77L+DvktxW/tM4+pTFRhLy/AsGC
|
||||||
|
# onsXHRWJjXD+57XQKBqJC4822rpM+Zv/Cuk0+CQ1ZyvgDbjmjJnW4SLq8CdCPSWU
|
||||||
|
# 5nR0W2rRnj7tfqAxM328y+l7vzhwRNGQ8cirOoo6CGJ/2XBjU02N7oJtpQUQwXEG
|
||||||
|
# ahC0HVUzWLOhcGbyoYIDWTCCAkECAQEwggEBoYHZpIHWMIHTMQswCQYDVQQGEwJV
|
||||||
|
# UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
|
||||||
|
# ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJl
|
||||||
|
# bGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVT
|
||||||
|
# Tjo0MzFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAg
|
||||||
|
# U2VydmljZaIjCgEBMAcGBSsOAwIaAxUA94Z+bUJn+nKwBvII6sg0Ny7aPDaggYMw
|
||||||
|
# gYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
|
||||||
|
# BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYD
|
||||||
|
# VQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDANBgkqhkiG9w0BAQsF
|
||||||
|
# AAIFAOss/ykwIhgPMjAyNTAxMTExNDMxMDVaGA8yMDI1MDExMjE0MzEwNVowdzA9
|
||||||
|
# BgorBgEEAYRZCgQBMS8wLTAKAgUA6yz/KQIBADAKAgEAAgIpggIB/zAHAgEAAgIT
|
||||||
|
# XjAKAgUA6y5QqQIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMCoAow
|
||||||
|
# CAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBCwUAA4IBAQCHE6DSGdY4
|
||||||
|
# KF25iAsxQP9F9Lz6ye/vrWGv+j0aSzSbjHVM3kMcEmX9278XgAKgAYII/f16uDtE
|
||||||
|
# 7VlEwnKGXujGF249I864U50QFt9hIxqCeuvrshDq8a4Q4KVmuDTosYjS114IJeBK
|
||||||
|
# LMOBRgLQCIC+wmvdP4EeYH1tnMIEASFvptE+XBro44/A5pmx5UiDJRL1AG4+aO3x
|
||||||
|
# 13psQu7H3thmbGy7Sf0Azjx0PZ+1QUVI7jWNk9DWjGd18G4SQD8Uxeh0v73/dQx1
|
||||||
|
# XsFhsyvnrw6uUrxkoAdurif9kyKS+ppo4j9ZkPXzzuc95s1bPcPAyjXCu07Tlunj
|
||||||
|
# sXttGVEPQIeXMYIEDTCCBAkCAQEwgZMwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
|
||||||
|
# Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m
|
||||||
|
# dCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENB
|
||||||
|
# IDIwMTACEzMAAAH6+ztE03czxtMAAQAAAfowDQYJYIZIAWUDBAIBBQCgggFKMBoG
|
||||||
|
# CSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQgxenDb/df
|
||||||
|
# q8XJS+q7Oxyca1ryDMmDRA0I3mtr+xYHGZQwgfoGCyqGSIb3DQEJEAIvMYHqMIHn
|
||||||
|
# MIHkMIG9BCB98n8tya8+B2jjU/dpJRIwHwHHpco5ogNStYocbkOeVjCBmDCBgKR+
|
||||||
|
# MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
|
||||||
|
# ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMT
|
||||||
|
# HU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAB+vs7RNN3M8bTAAEA
|
||||||
|
# AAH6MCIEIC8gtQ6HRW7jzwlpg15qoYopXwF01KaO1EM5tYzqJwx/MA0GCSqGSIb3
|
||||||
|
# DQEBCwUABIICAIsSn8x3zVS870Zf4pa+jfZjdOq++5dHpeLg46sujQ3w+xj3RyhB
|
||||||
|
# nRa3kjWyU9nNF6hrt0Q+ILOxUt3jCd3hbB1ZuspwbXdoRtRLfuLPvGiSmINdgFR4
|
||||||
|
# LD/jXLrq9USAHYXHzhuYhaVLIpn7M87TbFuGFVaByjmohZRcPCE8y8b7/RIlGm7B
|
||||||
|
# wgx0thZA4lHWFyj8j7CwjmueOJSSZ9an4P9VHFKJ63kYub4J1VxbeApGAeeS32SD
|
||||||
|
# oI3zDdC+iI+IetR9BUHGcR3Vg7j7c0T+NcrIoPPNb4Ff90Ue24h5RDJMQWrM56ak
|
||||||
|
# VEWgVlzhf8CeyeO7/ButBUZu8VLkH0DQraK9UKptZFKOXMELoi/oZL6IJftHp5vU
|
||||||
|
# +sPpF3NuuXw8Z5eL9jZ7A1y+H7nMhdXP2pojHDN213VZqeoUoOZlbFl6spDF1hFP
|
||||||
|
# 44Fu7TPGEwUNS213Pwln2SJ8SayeVUxsreo4pTvhDl/xZ+B7WNuLL7hatWFGrcf3
|
||||||
|
# w/HiVCoTfsY49SaN6zAK6akS3KI6KZHfzjaxDw+4LHo8gL68Ik1HZe4W1jaLYaED
|
||||||
|
# LWvKIinaH2vwU0J4a+oX+64eSh0tI9Ef3aM6jn9LgqubY36TzptUTWcsM3vv3YGB
|
||||||
|
# Dnf7LPxSt4/s5bUgAHvkWTjESdtIbt6Pxqz4BRha+ckPYBj968t3mSh6
|
||||||
# SIG # End signature block
|
# SIG # End signature block
|
||||||
146
externals/install-dotnet.sh
vendored
146
externals/install-dotnet.sh
vendored
@@ -423,11 +423,17 @@ get_normalized_architecture_for_specific_sdk_version() {
|
|||||||
# args:
|
# args:
|
||||||
# version or channel - $1
|
# version or channel - $1
|
||||||
is_arm64_supported() {
|
is_arm64_supported() {
|
||||||
#any channel or version that starts with the specified versions
|
# Extract the major version by splitting on the dot
|
||||||
case "$1" in
|
major_version="${1%%.*}"
|
||||||
( "1"* | "2"* | "3"* | "4"* | "5"*)
|
|
||||||
echo false
|
# Check if the major version is a valid number and less than 6
|
||||||
return 0
|
case "$major_version" in
|
||||||
|
[0-9]*)
|
||||||
|
if [ "$major_version" -lt 6 ]; then
|
||||||
|
echo false
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
echo true
|
echo true
|
||||||
@@ -950,6 +956,37 @@ get_absolute_path() {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# args:
|
||||||
|
# override - $1 (boolean, true or false)
|
||||||
|
get_cp_options() {
|
||||||
|
eval $invocation
|
||||||
|
|
||||||
|
local override="$1"
|
||||||
|
local override_switch=""
|
||||||
|
|
||||||
|
if [ "$override" = false ]; then
|
||||||
|
override_switch="-n"
|
||||||
|
|
||||||
|
# create temporary files to check if 'cp -u' is supported
|
||||||
|
tmp_dir="$(mktemp -d)"
|
||||||
|
tmp_file="$tmp_dir/testfile"
|
||||||
|
tmp_file2="$tmp_dir/testfile2"
|
||||||
|
|
||||||
|
touch "$tmp_file"
|
||||||
|
|
||||||
|
# use -u instead of -n if it's available
|
||||||
|
if cp -u "$tmp_file" "$tmp_file2" 2>/dev/null; then
|
||||||
|
override_switch="-u"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# clean up
|
||||||
|
rm -f "$tmp_file" "$tmp_file2"
|
||||||
|
rm -rf "$tmp_dir"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$override_switch"
|
||||||
|
}
|
||||||
|
|
||||||
# args:
|
# args:
|
||||||
# input_files - stdin
|
# input_files - stdin
|
||||||
# root_path - $1
|
# root_path - $1
|
||||||
@@ -961,15 +998,7 @@ copy_files_or_dirs_from_list() {
|
|||||||
local root_path="$(remove_trailing_slash "$1")"
|
local root_path="$(remove_trailing_slash "$1")"
|
||||||
local out_path="$(remove_trailing_slash "$2")"
|
local out_path="$(remove_trailing_slash "$2")"
|
||||||
local override="$3"
|
local override="$3"
|
||||||
local osname="$(get_current_os_name)"
|
local override_switch="$(get_cp_options "$override")"
|
||||||
local override_switch=$(
|
|
||||||
if [ "$override" = false ]; then
|
|
||||||
if [ "$osname" = "linux-musl" ]; then
|
|
||||||
printf -- "-u";
|
|
||||||
else
|
|
||||||
printf -- "-n";
|
|
||||||
fi
|
|
||||||
fi)
|
|
||||||
|
|
||||||
cat | uniq | while read -r file_path; do
|
cat | uniq | while read -r file_path; do
|
||||||
local path="$(remove_beginning_slash "${file_path#$root_path}")"
|
local path="$(remove_beginning_slash "${file_path#$root_path}")"
|
||||||
@@ -1243,6 +1272,61 @@ 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
|
||||||
|
|
||||||
@@ -1295,6 +1379,11 @@ get_download_link_from_aka_ms() {
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
sanitized_redirect_url=$(sanitize_redirect_url "$aka_ms_download_link")
|
||||||
|
if [[ -n "$sanitized_redirect_url" ]]; then
|
||||||
|
aka_ms_download_link="$sanitized_redirect_url"
|
||||||
|
fi
|
||||||
|
|
||||||
say_verbose "The redirect location retrieved: '$aka_ms_download_link'."
|
say_verbose "The redirect location retrieved: '$aka_ms_download_link'."
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
@@ -1306,23 +1395,16 @@ get_download_link_from_aka_ms() {
|
|||||||
get_feeds_to_use()
|
get_feeds_to_use()
|
||||||
{
|
{
|
||||||
feeds=(
|
feeds=(
|
||||||
"https://dotnetcli.azureedge.net/dotnet"
|
"https://builds.dotnet.microsoft.com/dotnet"
|
||||||
"https://dotnetbuilds.azureedge.net/public"
|
"https://ci.dot.net/public"
|
||||||
)
|
)
|
||||||
|
|
||||||
if [[ -n "$azure_feed" ]]; then
|
if [[ -n "$azure_feed" ]]; then
|
||||||
feeds=("$azure_feed")
|
feeds=("$azure_feed")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$no_cdn" == "true" ]]; then
|
if [[ -n "$uncached_feed" ]]; then
|
||||||
feeds=(
|
feeds=("$uncached_feed")
|
||||||
"https://dotnetcli.blob.core.windows.net/dotnet"
|
|
||||||
"https://dotnetbuilds.blob.core.windows.net/public"
|
|
||||||
)
|
|
||||||
|
|
||||||
if [[ -n "$uncached_feed" ]]; then
|
|
||||||
feeds=("$uncached_feed")
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1454,7 +1536,7 @@ generate_regular_links() {
|
|||||||
link_types+=("legacy")
|
link_types+=("legacy")
|
||||||
else
|
else
|
||||||
legacy_download_link=""
|
legacy_download_link=""
|
||||||
say_verbose "Cound not construct a legacy_download_link; omitting..."
|
say_verbose "Could not construct a legacy_download_link; omitting..."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Check if the SDK version is already installed.
|
# Check if the SDK version is already installed.
|
||||||
@@ -1557,7 +1639,7 @@ install_dotnet() {
|
|||||||
say "The resource at $link_type link '$download_link' is not available."
|
say "The resource at $link_type link '$download_link' is not available."
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
say "Failed to download $link_type link '$download_link': $download_error_msg"
|
say "Failed to download $link_type link '$download_link': $http_code $download_error_msg"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
rm -f "$zip_path" 2>&1 && say_verbose "Temporary archive file $zip_path was removed"
|
rm -f "$zip_path" 2>&1 && say_verbose "Temporary archive file $zip_path was removed"
|
||||||
@@ -1618,7 +1700,6 @@ install_dir="<auto>"
|
|||||||
architecture="<auto>"
|
architecture="<auto>"
|
||||||
dry_run=false
|
dry_run=false
|
||||||
no_path=false
|
no_path=false
|
||||||
no_cdn=false
|
|
||||||
azure_feed=""
|
azure_feed=""
|
||||||
uncached_feed=""
|
uncached_feed=""
|
||||||
feed_credential=""
|
feed_credential=""
|
||||||
@@ -1691,10 +1772,6 @@ do
|
|||||||
verbose=true
|
verbose=true
|
||||||
non_dynamic_parameters+=" $name"
|
non_dynamic_parameters+=" $name"
|
||||||
;;
|
;;
|
||||||
--no-cdn|-[Nn]o[Cc]dn)
|
|
||||||
no_cdn=true
|
|
||||||
non_dynamic_parameters+=" $name"
|
|
||||||
;;
|
|
||||||
--azure-feed|-[Aa]zure[Ff]eed)
|
--azure-feed|-[Aa]zure[Ff]eed)
|
||||||
shift
|
shift
|
||||||
azure_feed="$1"
|
azure_feed="$1"
|
||||||
@@ -1735,7 +1812,7 @@ do
|
|||||||
zip_path="$1"
|
zip_path="$1"
|
||||||
;;
|
;;
|
||||||
-?|--?|-h|--help|-[Hh]elp)
|
-?|--?|-h|--help|-[Hh]elp)
|
||||||
script_name="$(basename "$0")"
|
script_name="dotnet-install.sh"
|
||||||
echo ".NET Tools Installer"
|
echo ".NET Tools Installer"
|
||||||
echo "Usage:"
|
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"
|
||||||
@@ -1799,13 +1876,10 @@ do
|
|||||||
echo " --verbose,-Verbose Display diagnostics information."
|
echo " --verbose,-Verbose Display diagnostics information."
|
||||||
echo " --azure-feed,-AzureFeed For internal use only."
|
echo " --azure-feed,-AzureFeed For internal use only."
|
||||||
echo " Allows using a different storage to download SDK archives from."
|
echo " Allows using a different storage to download SDK archives from."
|
||||||
echo " This parameter is only used if --no-cdn is false."
|
|
||||||
echo " --uncached-feed,-UncachedFeed For internal use only."
|
echo " --uncached-feed,-UncachedFeed For internal use only."
|
||||||
echo " Allows using a different storage to download SDK archives from."
|
echo " Allows using a different storage to download SDK archives from."
|
||||||
echo " This parameter is only used if --no-cdn is true."
|
|
||||||
echo " --skip-non-versioned-files Skips non-versioned files if they already exist, such as the dotnet executable."
|
echo " --skip-non-versioned-files Skips non-versioned files if they already exist, such as the dotnet executable."
|
||||||
echo " -SkipNonVersionedFiles"
|
echo " -SkipNonVersionedFiles"
|
||||||
echo " --no-cdn,-NoCdn Disable downloading from the Azure CDN, and use the uncached feed directly."
|
|
||||||
echo " --jsonfile <JSONFILE> Determines the SDK version from a user specified global.json file."
|
echo " --jsonfile <JSONFILE> Determines the SDK version from a user specified global.json file."
|
||||||
echo " Note: global.json must have a value for 'SDK:Version'"
|
echo " Note: global.json must have a value for 'SDK:Version'"
|
||||||
echo " --keep-zip,-KeepZip If set, downloaded file is kept."
|
echo " --keep-zip,-KeepZip If set, downloaded file is kept."
|
||||||
|
|||||||
10160
package-lock.json
generated
10160
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": "4.0.0",
|
"version": "3.0.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "setup dotnet action",
|
"description": "setup dotnet action",
|
||||||
"main": "dist/setup/index.js",
|
"main": "dist/setup/index.js",
|
||||||
@@ -26,35 +26,34 @@
|
|||||||
"author": "GitHub",
|
"author": "GitHub",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/cache": "^3.2.4",
|
"@actions/cache": "^4.0.3",
|
||||||
"@actions/core": "^1.10.0",
|
"@actions/core": "^1.10.0",
|
||||||
"@actions/exec": "^1.1.1",
|
"@actions/exec": "^1.1.1",
|
||||||
"@actions/github": "^6.0.0",
|
"@actions/github": "^1.1.0",
|
||||||
"@actions/glob": "^0.4.0",
|
"@actions/glob": "^0.3.0",
|
||||||
"@actions/http-client": "^2.2.1",
|
"@actions/http-client": "^2.0.1",
|
||||||
"@actions/io": "^1.0.2",
|
"@actions/io": "^1.0.2",
|
||||||
"fast-xml-parser": "^4.4.1",
|
"fast-xml-parser": "^4.0.10",
|
||||||
"json5": "^2.2.3",
|
"semver": "^6.3.0"
|
||||||
"semver": "^7.6.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^29.5.12",
|
"@types/jest": "^27.5.2",
|
||||||
"@types/node": "^20.11.29",
|
"@types/node": "^16.11.25",
|
||||||
"@types/semver": "^7.5.8",
|
"@types/semver": "^6.2.2",
|
||||||
"@typescript-eslint/eslint-plugin": "^7.3.0",
|
"@typescript-eslint/eslint-plugin": "^5.54.0",
|
||||||
"@typescript-eslint/parser": "^7.3.0",
|
"@typescript-eslint/parser": "^5.54.0",
|
||||||
"@vercel/ncc": "^0.38.1",
|
"@vercel/ncc": "^0.34.0",
|
||||||
"eslint": "^8.57.0",
|
"eslint": "^8.35.0",
|
||||||
"eslint-config-prettier": "^9.1.0",
|
"eslint-config-prettier": "^8.6.0",
|
||||||
"eslint-plugin-jest": "^27.9.0",
|
"eslint-plugin-jest": "^27.2.1",
|
||||||
"eslint-plugin-node": "^11.1.0",
|
"eslint-plugin-node": "^11.1.0",
|
||||||
"husky": "^8.0.1",
|
"husky": "^8.0.1",
|
||||||
"jest": "^29.7.0",
|
"jest": "^27.5.1",
|
||||||
"jest-circus": "^29.7.0",
|
"jest-circus": "^27.5.1",
|
||||||
"jest-each": "^29.7.0",
|
"jest-each": "^27.5.1",
|
||||||
"prettier": "^3.2.5",
|
"prettier": "^2.8.4",
|
||||||
"ts-jest": "^29.1.2",
|
"ts-jest": "^27.0.5",
|
||||||
"typescript": "^5.4.2",
|
"typescript": "^4.8.4",
|
||||||
"wget-improved": "^3.2.1"
|
"wget-improved": "^3.2.1"
|
||||||
},
|
},
|
||||||
"jest": {
|
"jest": {
|
||||||
|
|||||||
282
src/installer.ts
282
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_WINDOWS, PLATFORM} from './utils';
|
import {IS_LINUX, IS_WINDOWS} 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,9 +101,11 @@ export class DotnetVersionResolver {
|
|||||||
allowRetries: true,
|
allowRetries: true,
|
||||||
maxRetries: 3
|
maxRetries: 3
|
||||||
});
|
});
|
||||||
|
|
||||||
const response = await httpClient.getJson<any>(
|
const response = await httpClient.getJson<any>(
|
||||||
DotnetVersionResolver.DotnetCoreIndexUrl
|
DotnetVersionResolver.DotNetCoreIndexUrl
|
||||||
);
|
);
|
||||||
|
|
||||||
const result = response.result || {};
|
const result = response.result || {};
|
||||||
const releasesInfo: any[] = result['releases-index'];
|
const releasesInfo: any[] = result['releases-index'];
|
||||||
|
|
||||||
@@ -114,37 +116,85 @@ 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://dotnetcli.azureedge.net/dotnet/release-metadata/releases-index.json';
|
'https://builds.dotnet.microsoft.com/dotnet/release-metadata/releases-index.json';
|
||||||
}
|
}
|
||||||
|
|
||||||
export class DotnetInstallScript {
|
export class DotnetCoreInstaller {
|
||||||
private scriptName = IS_WINDOWS ? 'install-dotnet.ps1' : 'install-dotnet.sh';
|
private version: string;
|
||||||
private escapedScript: string;
|
private quality: QualityOptions;
|
||||||
private scriptArguments: string[] = [];
|
|
||||||
|
|
||||||
constructor() {
|
static {
|
||||||
this.escapedScript = path
|
const installationDirectoryWindows = path.join(
|
||||||
.join(__dirname, '..', '..', 'externals', this.scriptName)
|
process.env['PROGRAMFILES'] + '',
|
||||||
.replace(/'/g, "''");
|
'dotnet'
|
||||||
|
);
|
||||||
if (IS_WINDOWS) {
|
const installationDirectoryLinux = '/usr/share/dotnet';
|
||||||
this.setupScriptPowershell();
|
const installationDirectoryMac = path.join(
|
||||||
return;
|
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) {
|
||||||
|
process.env['DOTNET_INSTALL_DIR'] = installationDirectoryWindows;
|
||||||
|
} else {
|
||||||
|
process.env['DOTNET_INSTALL_DIR'] = IS_LINUX
|
||||||
|
? installationDirectoryLinux
|
||||||
|
: installationDirectoryMac;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.setupScriptBash();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private setupScriptPowershell() {
|
constructor(version: string, quality: QualityOptions) {
|
||||||
this.scriptArguments = [
|
this.version = version;
|
||||||
|
this.quality = quality;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static convertInstallPathToAbsolute(installDir: string): string {
|
||||||
|
let transformedPath;
|
||||||
|
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',
|
||||||
@@ -153,160 +203,68 @@ export class DotnetInstallScript {
|
|||||||
'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 = '';
|
||||||
|
|
||||||
this.scriptArguments.push('&', `'${this.escapedScript}'`);
|
const versionResolver = new DotnetVersionResolver(this.version);
|
||||||
|
const dotnetVersion = await versionResolver.createDotNetVersion();
|
||||||
|
|
||||||
if (process.env['https_proxy'] != null) {
|
|
||||||
this.scriptArguments.push(`-ProxyAddress ${process.env['https_proxy']}`);
|
|
||||||
}
|
|
||||||
// This is not currently an option
|
|
||||||
if (process.env['no_proxy'] != null) {
|
|
||||||
this.scriptArguments.push(`-ProxyBypassList ${process.env['no_proxy']}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private setupScriptBash() {
|
|
||||||
chmodSync(this.escapedScript, '777');
|
|
||||||
}
|
|
||||||
|
|
||||||
private async getScriptPath() {
|
|
||||||
if (IS_WINDOWS) {
|
if (IS_WINDOWS) {
|
||||||
return (await io.which('pwsh', false)) || io.which('powershell', true);
|
scriptArguments = ['&', `'${escapedScript}'`];
|
||||||
|
|
||||||
|
if (dotnetVersion.type) {
|
||||||
|
scriptArguments.push(dotnetVersion.type, dotnetVersion.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.quality) {
|
||||||
|
this.setQuality(dotnetVersion, scriptArguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.env['https_proxy'] != null) {
|
||||||
|
scriptArguments.push(`-ProxyAddress ${process.env['https_proxy']}`);
|
||||||
|
}
|
||||||
|
// This is not currently an option
|
||||||
|
if (process.env['no_proxy'] != null) {
|
||||||
|
scriptArguments.push(`-ProxyBypassList ${process.env['no_proxy']}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
scriptPath =
|
||||||
|
(await io.which('pwsh', false)) || (await io.which('powershell', true));
|
||||||
|
scriptArguments = windowsDefaultOptions.concat(scriptArguments);
|
||||||
|
} else {
|
||||||
|
chmodSync(escapedScript, '777');
|
||||||
|
scriptPath = await io.which(escapedScript, true);
|
||||||
|
scriptArguments = [];
|
||||||
|
|
||||||
|
if (dotnetVersion.type) {
|
||||||
|
scriptArguments.push(dotnetVersion.type, dotnetVersion.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.quality) {
|
||||||
|
this.setQuality(dotnetVersion, scriptArguments);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
// process.env must be explicitly passed in for DOTNET_INSTALL_DIR to be used
|
||||||
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) {
|
|
||||||
this.useArguments(dotnetVersion.type, dotnetVersion.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (quality && !dotnetVersion.qualityFlag) {
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
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(
|
||||||
return exec.getExecOutput(
|
`"${scriptPath}"`,
|
||||||
`"${await this.getScriptPath()}"`,
|
scriptArguments,
|
||||||
this.scriptArguments,
|
|
||||||
getExecOutputOptions
|
getExecOutputOptions
|
||||||
);
|
);
|
||||||
}
|
if (exitCode) {
|
||||||
}
|
|
||||||
|
|
||||||
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}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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(
|
throw new Error(
|
||||||
`Failed to install dotnet, exit code: ${dotnetInstallOutput.exitCode}. ${dotnetInstallOutput.stderr}`
|
`Failed to install dotnet, exit code: ${exitCode}. ${stderr}`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.parseInstalledVersion(dotnetInstallOutput.stdout);
|
return this.parseInstalledVersion(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, DotnetInstallDir} from './installer';
|
import {DotnetCoreInstaller} 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,7 +7,6 @@ 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',
|
||||||
@@ -73,7 +72,7 @@ export async function run() {
|
|||||||
const installedVersion = await dotnetInstaller.installDotnet();
|
const installedVersion = await dotnetInstaller.installDotnet();
|
||||||
installedDotnetVersions.push(installedVersion);
|
installedDotnetVersions.push(installedVersion);
|
||||||
}
|
}
|
||||||
DotnetInstallDir.addToPath();
|
DotnetCoreInstaller.addToPath();
|
||||||
}
|
}
|
||||||
|
|
||||||
const sourceUrl: string = core.getInput('source-url');
|
const sourceUrl: string = core.getInput('source-url');
|
||||||
@@ -98,14 +97,9 @@ export async function run() {
|
|||||||
|
|
||||||
function getVersionFromGlobalJson(globalJsonPath: string): string {
|
function getVersionFromGlobalJson(globalJsonPath: string): string {
|
||||||
let version = '';
|
let version = '';
|
||||||
const globalJson = JSON5.parse(
|
const globalJson = JSON.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,6 +1,2 @@
|
|||||||
export const IS_WINDOWS = process.platform === 'win32';
|
export const IS_WINDOWS = process.platform === 'win32';
|
||||||
export const PLATFORM = ((): 'windows' | 'linux' | 'mac' => {
|
export const IS_LINUX = process.platform === 'linux';
|
||||||
if (process.platform === 'win32') return 'windows';
|
|
||||||
if (process.platform === 'linux') return 'linux';
|
|
||||||
return 'mac';
|
|
||||||
})();
|
|
||||||
|
|||||||
Reference in New Issue
Block a user